首页 > 其他分享 >C2 - Split If

C2 - Split If

时间:2023-03-10 19:44:07浏览次数:34  
标签:merge int 42 field 0x42 Split C2 split

被split if困惑很久了,找了个例子研究下。整个流程在PhaseIdealLoop::do_split_if,可以大概分四步:

  1. split up instructions which must be in this block up through the merge point
  2. split if through merge point
  3. split if projs through merge point
  4. handle uses of merge point

image

image

这两幅图的变换就是split_up做的事情。它会在Region#1523到If#1402之间找符合条件的指令,这个时候找到AddI#1335,然后创建新的Phi#1571,用新Phi替换了之前的AddI,形象点就是把AddI给UP到上面的bb。
在经过一系列split_up之后,B61就没有(必须存在于当前bb的)指令了,全部被清理到了上面的bb。

接下来分两步,对应图片两张。

  1. 沿着merge点split If#1402
  2. 沿着merge点split If#1402的true/false projs。

对If#1402做split_thr_region(Region#1523),会得到If#1575和If#1576以及一个new_iff_region,即Region#1574(该region会在后面死掉然后被remove),同样对If#1402的IfTrueProj和IfFalseProj做split_thr_region(Region#1523),得到Region#1577和Region#1580。

// Replace both uses of 'new_iff' with Regions merging True/False
// paths.  This makes 'new_iff' go dead.

image

image

到这里If#1402它本身以及true/false projs都完全split了,所以它已经死了。清除掉所有死节点之后,IR长这样
image


一个生动的例子是identical if的merge:

  public static void test5(int a, int b){
    if (a == b) {
      int_field = 0x42;
    } else {
        int_field = 42;
    }
    if (a == b) {
        int_field = 0x42;
    } else {
        int_field = 42;
    }
  }
=>
  public static void test5(int a, int b){
    if (a == b) {
      int_field = 0x42;
      int_field = 0x42;
    } else {
      int_field = 42;
      int_field = 42;
    }
  }

这个变换就用到了split if。IR变换如下:
image

image

If#42被“split“成两个,然后支配它的Region#35被移除,和第一个例子如出一辙。代码类似这样:

  public static void test5(int a, int b){
    if (a == b) {
      int_field = 0x42;
      if (a == b) {
      L1:
          int_field = 0x42;
      } else {
          goto L2;
      }
    } else {
      int_field = 42;
      if (a == b) {
          goto L1;
      } else {
      L2:
          int_field = 42;
      }
    }
  }

总结一下,split if的作用就是Split If

标签:merge,int,42,field,0x42,Split,C2,split
From: https://www.cnblogs.com/kelthuzadx/p/17204508.html

相关文章

  • ABC292F题解
    首先先钦定\(a\leb\),否则交换一下就行。方法1:二分答案。容易发现,答案至少为\(a\),并且用左下角为一个顶点一定不会更劣,并且另外两个点一定都在线段上(否则可以调整)。我们......
  • VS error C2471: 无法更新程序数据库vc90.pdb的解决办法
    修改项目属性右击项目-->"属性”  1.“C/C++”-->"常规”-->”调试信息格式”设置为“C7兼容(/Z7)”  2.“C/C++”-->"代码生成”-->”启用字符串池......
  • THUPC2023 初赛
    A.大富翁诈骗题。你会发现这个东西和先后手无关,如果某个人的某个点上面有其它人的点那么减一,如果子树内有其它人的点那么加一。这个还是不好做。我们可以将一对属于同......
  • [atABC288Ex]A Nameless Counting Problem
    记\(f(n,m,x)\)为满足\(\begin{cases}a_{i}\in[0,m)\\\bigoplus_{i=1}^{n}a_{i}=x\\\foralli\nej,a_{i}\nea_{j}\end{cases}\)的序列\(\{a_{n}\}\)数,则答案即\(\sum_{0......
  • QOJ5256 [CERC2022] H. Insertions 题解
    题面题意:给定字符串\(S,T,P\),求将\(T\)插入进\(S\)之后\(P\)最多的出现次数。输出:最多的出现次数;达到这个最多出现次数的插入位置数量;达到这个最多出现次数......
  • ABC279H 题解
    学考时候推的。场上记错模数,以为是\(998244353\)然后想了半天组合数怎么算)简单题。首先序列问题考虑每个位置的生成函数然后乘起来。位置\(k\)的生成函数显然是\[\s......
  • 浅析 SplitChunksPlugin 及代码分割的意义
    起因有同事分享webpack的代码分割,其中提到了SplitChunksPlugin,对于文档上的描述大家有着不一样的理解,所以打算探究一下。Q:什么是SplitChunksPlugin?SplitChunksPlugin是......
  • 无线和射频集成电路CC2651R3SIPAT0MOUR/CC2652PSIPMOTR/CC2651P31T0RKPR TxRx + MCU 2
    一、CC2651R3SIPAT0MOUR介绍:CC2651R3SIPA器件是一款多协议2.4GHz无线微控制器(MCU),支持Zigbee®、Bluetooth®5.2LowEnergy、IEEE802.15.4g、TI15.4stack(2.4GHz)......
  • Atcoder-ABC291 "Teleporter and Closed off" 动态DP版
    题目地址题意:在一个DAG图中,点i只有最多m条出边连向i+1~i+m(m<=10),边权均为1。对于\(k\in[2,n-1]\),依次输出当点k被删除时1到n的最短路。分析:标准做法无非就是预......
  • 【APIO2014】Split the sequence
    看到题之后第一想法就是斜率优化然后直接推式子了,却忽略了一个重要的前提就是和切的顺序无关,否则就应该是区间dp。(后怕)这里来证明一下:如果分成三段分别为\(s_1,s_2,s_3\),......