Home | History | Annotate | Download | only in InstSimplify
      1 ; RUN: opt < %s -instsimplify -S | FileCheck %s
      2 target datalayout = "p:32:32"
      3 
      4 define i1 @ptrtoint() {
      5 ; CHECK: @ptrtoint
      6   %a = alloca i8
      7   %tmp = ptrtoint i8* %a to i32
      8   %r = icmp eq i32 %tmp, 0
      9   ret i1 %r
     10 ; CHECK: ret i1 false
     11 }
     12 
     13 define i1 @zext(i32 %x) {
     14 ; CHECK: @zext
     15   %e1 = zext i32 %x to i64
     16   %e2 = zext i32 %x to i64
     17   %r = icmp eq i64 %e1, %e2
     18   ret i1 %r
     19 ; CHECK: ret i1 true
     20 }
     21 
     22 define i1 @zext2(i1 %x) {
     23 ; CHECK: @zext2
     24   %e = zext i1 %x to i32
     25   %c = icmp ne i32 %e, 0
     26   ret i1 %c
     27 ; CHECK: ret i1 %x
     28 }
     29 
     30 define i1 @zext3() {
     31 ; CHECK: @zext3
     32   %e = zext i1 1 to i32
     33   %c = icmp ne i32 %e, 0
     34   ret i1 %c
     35 ; CHECK: ret i1 true
     36 }
     37 
     38 define i1 @sext(i32 %x) {
     39 ; CHECK: @sext
     40   %e1 = sext i32 %x to i64
     41   %e2 = sext i32 %x to i64
     42   %r = icmp eq i64 %e1, %e2
     43   ret i1 %r
     44 ; CHECK: ret i1 true
     45 }
     46 
     47 define i1 @sext2(i1 %x) {
     48 ; CHECK: @sext2
     49   %e = sext i1 %x to i32
     50   %c = icmp ne i32 %e, 0
     51   ret i1 %c
     52 ; CHECK: ret i1 %x
     53 }
     54 
     55 define i1 @sext3() {
     56 ; CHECK: @sext3
     57   %e = sext i1 1 to i32
     58   %c = icmp ne i32 %e, 0
     59   ret i1 %c
     60 ; CHECK: ret i1 true
     61 }
     62 
     63 define i1 @add(i32 %x, i32 %y) {
     64 ; CHECK: @add
     65   %l = lshr i32 %x, 1
     66   %q = lshr i32 %y, 1
     67   %r = or i32 %q, 1
     68   %s = add i32 %l, %r
     69   %c = icmp eq i32 %s, 0
     70   ret i1 %c
     71 ; CHECK: ret i1 false
     72 }
     73 
     74 define i1 @add2(i8 %x, i8 %y) {
     75 ; CHECK: @add2
     76   %l = or i8 %x, 128
     77   %r = or i8 %y, 129
     78   %s = add i8 %l, %r
     79   %c = icmp eq i8 %s, 0
     80   ret i1 %c
     81 ; CHECK: ret i1 false
     82 }
     83 
     84 define i1 @add3(i8 %x, i8 %y) {
     85 ; CHECK: @add3
     86   %l = zext i8 %x to i32
     87   %r = zext i8 %y to i32
     88   %s = add i32 %l, %r
     89   %c = icmp eq i32 %s, 0
     90   ret i1 %c
     91 ; CHECK: ret i1 %c
     92 }
     93 
     94 define i1 @add4(i32 %x, i32 %y) {
     95 ; CHECK: @add4
     96   %z = add nsw i32 %y, 1
     97   %s1 = add nsw i32 %x, %y
     98   %s2 = add nsw i32 %x, %z
     99   %c = icmp slt i32 %s1, %s2
    100   ret i1 %c
    101 ; CHECK: ret i1 true
    102 }
    103 
    104 define i1 @add5(i32 %x, i32 %y) {
    105 ; CHECK: @add5
    106   %z = add nuw i32 %y, 1
    107   %s1 = add nuw i32 %x, %z
    108   %s2 = add nuw i32 %x, %y
    109   %c = icmp ugt i32 %s1, %s2
    110   ret i1 %c
    111 ; CHECK: ret i1 true
    112 }
    113 
    114 define i1 @addpowtwo(i32 %x, i32 %y) {
    115 ; CHECK: @addpowtwo
    116   %l = lshr i32 %x, 1
    117   %r = shl i32 1, %y
    118   %s = add i32 %l, %r
    119   %c = icmp eq i32 %s, 0
    120   ret i1 %c
    121 ; CHECK: ret i1 false
    122 }
    123 
    124 define i1 @or(i32 %x) {
    125 ; CHECK: @or
    126   %o = or i32 %x, 1
    127   %c = icmp eq i32 %o, 0
    128   ret i1 %c
    129 ; CHECK: ret i1 false
    130 }
    131 
    132 define i1 @shl(i32 %x) {
    133 ; CHECK: @shl
    134   %s = shl i32 1, %x
    135   %c = icmp eq i32 %s, 0
    136   ret i1 %c
    137 ; CHECK: ret i1 false
    138 }
    139 
    140 define i1 @lshr1(i32 %x) {
    141 ; CHECK: @lshr1
    142   %s = lshr i32 -1, %x
    143   %c = icmp eq i32 %s, 0
    144   ret i1 %c
    145 ; CHECK: ret i1 false
    146 }
    147 
    148 define i1 @lshr2(i32 %x) {
    149 ; CHECK: @lshr2
    150   %s = lshr i32 %x, 30
    151   %c = icmp ugt i32 %s, 8
    152   ret i1 %c
    153 ; CHECK: ret i1 false
    154 }
    155 
    156 define i1 @ashr1(i32 %x) {
    157 ; CHECK: @ashr1
    158   %s = ashr i32 -1, %x
    159   %c = icmp eq i32 %s, 0
    160   ret i1 %c
    161 ; CHECK: ret i1 false
    162 }
    163 
    164 define i1 @ashr2(i32 %x) {
    165 ; CHECK: @ashr2
    166   %s = ashr i32 %x, 30
    167   %c = icmp slt i32 %s, -5
    168   ret i1 %c
    169 ; CHECK: ret i1 false
    170 }
    171 
    172 define i1 @select1(i1 %cond) {
    173 ; CHECK: @select1
    174   %s = select i1 %cond, i32 1, i32 0
    175   %c = icmp eq i32 %s, 1
    176   ret i1 %c
    177 ; CHECK: ret i1 %cond
    178 }
    179 
    180 define i1 @select2(i1 %cond) {
    181 ; CHECK: @select2
    182   %x = zext i1 %cond to i32
    183   %s = select i1 %cond, i32 %x, i32 0
    184   %c = icmp ne i32 %s, 0
    185   ret i1 %c
    186 ; CHECK: ret i1 %cond
    187 }
    188 
    189 define i1 @select3(i1 %cond) {
    190 ; CHECK: @select3
    191   %x = zext i1 %cond to i32
    192   %s = select i1 %cond, i32 1, i32 %x
    193   %c = icmp ne i32 %s, 0
    194   ret i1 %c
    195 ; CHECK: ret i1 %cond
    196 }
    197 
    198 define i1 @select4(i1 %cond) {
    199 ; CHECK: @select4
    200   %invert = xor i1 %cond, 1
    201   %s = select i1 %invert, i32 0, i32 1
    202   %c = icmp ne i32 %s, 0
    203   ret i1 %c
    204 ; CHECK: ret i1 %cond
    205 }
    206 
    207 define i1 @urem1(i32 %X, i32 %Y) {
    208 ; CHECK: @urem1
    209   %A = urem i32 %X, %Y
    210   %B = icmp ult i32 %A, %Y
    211   ret i1 %B
    212 ; CHECK: ret i1 true
    213 }
    214 
    215 define i1 @urem2(i32 %X, i32 %Y) {
    216 ; CHECK: @urem2
    217   %A = urem i32 %X, %Y
    218   %B = icmp eq i32 %A, %Y
    219   ret i1 %B
    220 ; CHECK: ret i1 false
    221 }
    222 
    223 define i1 @urem3(i32 %X) {
    224 ; CHECK: @urem3
    225   %A = urem i32 %X, 10
    226   %B = icmp ult i32 %A, 15
    227   ret i1 %B
    228 ; CHECK: ret i1 true
    229 }
    230 
    231 define i1 @urem4(i32 %X) {
    232 ; CHECK: @urem4
    233   %A = urem i32 %X, 15
    234   %B = icmp ult i32 %A, 10
    235   ret i1 %B
    236 ; CHECK: ret i1 %B
    237 }
    238 
    239 define i1 @urem5(i16 %X, i32 %Y) {
    240 ; CHECK: @urem5
    241   %A = zext i16 %X to i32
    242   %B = urem i32 %A, %Y
    243   %C = icmp slt i32 %B, %Y
    244   ret i1 %C
    245 ; CHECK: ret i1 true
    246 }
    247 
    248 define i1 @urem6(i32 %X, i32 %Y) {
    249 ; CHECK: @urem6
    250   %A = urem i32 %X, %Y
    251   %B = icmp ugt i32 %Y, %A
    252   ret i1 %B
    253 ; CHECK: ret i1 true
    254 }
    255 
    256 define i1 @srem1(i32 %X) {
    257 ; CHECK: @srem1
    258   %A = srem i32 %X, -5
    259   %B = icmp sgt i32 %A, 5
    260   ret i1 %B
    261 ; CHECK: ret i1 false
    262 }
    263 
    264 ; PR9343 #15
    265 ; CHECK: @srem2
    266 ; CHECK: ret i1 false
    267 define i1 @srem2(i16 %X, i32 %Y) {
    268   %A = zext i16 %X to i32
    269   %B = add nsw i32 %A, 1
    270   %C = srem i32 %B, %Y
    271   %D = icmp slt i32 %C, 0
    272   ret i1 %D
    273 }
    274 
    275 ; CHECK: @srem3
    276 ; CHECK-NEXT: ret i1 false
    277 define i1 @srem3(i16 %X, i32 %Y) {
    278   %A = zext i16 %X to i32
    279   %B = or i32 2147483648, %A
    280   %C = sub nsw i32 1, %B
    281   %D = srem i32 %C, %Y
    282   %E = icmp slt i32 %D, 0
    283   ret i1 %E
    284 }
    285 
    286 define i1 @udiv1(i32 %X) {
    287 ; CHECK: @udiv1
    288   %A = udiv i32 %X, 1000000
    289   %B = icmp ult i32 %A, 5000
    290   ret i1 %B
    291 ; CHECK: ret i1 true
    292 }
    293 
    294 define i1 @udiv2(i32 %X, i32 %Y, i32 %Z) {
    295 ; CHECK: @udiv2
    296   %A = udiv exact i32 10, %Z
    297   %B = udiv exact i32 20, %Z
    298   %C = icmp ult i32 %A, %B
    299   ret i1 %C
    300 ; CHECK: ret i1 true
    301 }
    302 
    303 define i1 @sdiv1(i32 %X) {
    304 ; CHECK: @sdiv1
    305   %A = sdiv i32 %X, 1000000
    306   %B = icmp slt i32 %A, 3000
    307   ret i1 %B
    308 ; CHECK: ret i1 true
    309 }
    310 
    311 define i1 @or1(i32 %X) {
    312 ; CHECK: @or1
    313   %A = or i32 %X, 62
    314   %B = icmp ult i32 %A, 50
    315   ret i1 %B
    316 ; CHECK: ret i1 false
    317 }
    318 
    319 define i1 @and1(i32 %X) {
    320 ; CHECK: @and1
    321   %A = and i32 %X, 62
    322   %B = icmp ugt i32 %A, 70
    323   ret i1 %B
    324 ; CHECK: ret i1 false
    325 }
    326