Home | History | Annotate | Download | only in InstCombine
      1 ; This test makes sure that these instructions are properly eliminated.
      2 ;
      3 ; RUN: opt < %s -instcombine -S | \
      4 ; RUN:    not grep "tobool"
      5 ; END.
      6 define i32 @main(i32 %argc, i8** %argv) nounwind ssp {
      7 entry:
      8   %and = and i32 %argc, 1                         ; <i32> [#uses=1]
      9   %tobool = icmp ne i32 %and, 0                   ; <i1> [#uses=1]
     10   %and2 = and i32 %argc, 2                        ; <i32> [#uses=1]
     11   %tobool3 = icmp ne i32 %and2, 0                 ; <i1> [#uses=1]
     12   %or.cond = and i1 %tobool, %tobool3             ; <i1> [#uses=1]
     13   %retval.0 = select i1 %or.cond, i32 2, i32 1    ; <i32> [#uses=1]
     14   ret i32 %retval.0
     15 }
     16 
     17 define i32 @main2(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
     18 entry:
     19   %and = and i32 %argc, 1                         ; <i32> [#uses=1]
     20   %tobool = icmp eq i32 %and, 0                   ; <i1> [#uses=1]
     21   %and2 = and i32 %argc, 2                        ; <i32> [#uses=1]
     22   %tobool3 = icmp eq i32 %and2, 0                 ; <i1> [#uses=1]
     23   %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
     24   %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
     25   ret i32 %storemerge
     26 }
     27 
     28 ; tests to check combining (icmp eq (A & B), C) & (icmp eq (A & D), E)
     29 ; tests to check if (icmp eq (A & B), 0) is treated like (icmp eq (A & B), B)
     30 ; if B is a single bit constant
     31 
     32 ; (icmp eq (A & B), 0) & (icmp eq (A & D), 0) -> (icmp eq (A & (B|D)), 0)
     33 define i32 @main3(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
     34 entry:
     35   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
     36   %tobool = icmp eq i32 %and, 0                   ; <i1> [#uses=1]
     37   %and2 = and i32 %argc, 48                       ; <i32> [#uses=1]
     38   %tobool3 = icmp eq i32 %and2, 0                 ; <i1> [#uses=1]
     39   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
     40   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
     41   ret i32 %storemerge
     42 }
     43 
     44 define i32 @main3b(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
     45 entry:
     46   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
     47   %tobool = icmp eq i32 %and, 0                   ; <i1> [#uses=1]
     48   %and2 = and i32 %argc, 16                       ; <i32> [#uses=1]
     49   %tobool3 = icmp ne i32 %and2, 16                 ; <i1> [#uses=1]
     50   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
     51   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
     52   ret i32 %storemerge
     53 }
     54 
     55 define i32 @main3e_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
     56            nounwind readnone ssp {
     57 entry:
     58   %and = and i32 %argc, %argc2                    ; <i32> [#uses=1]
     59   %tobool = icmp eq i32 %and, 0                   ; <i1> [#uses=1]
     60   %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
     61   %tobool3 = icmp eq i32 %and2, 0                 ; <i1> [#uses=1]
     62   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
     63   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
     64   ret i32 %storemerge
     65 }
     66 
     67 ; (icmp ne (A & B), 0) | (icmp ne (A & D), 0) -> (icmp ne (A & (B|D)), 0)
     68 define i32 @main3c(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
     69 entry:
     70   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
     71   %tobool = icmp ne i32 %and, 0                   ; <i1> [#uses=1]
     72   %and2 = and i32 %argc, 48                       ; <i32> [#uses=1]
     73   %tobool3 = icmp ne i32 %and2, 0                 ; <i1> [#uses=1]
     74   %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
     75   %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
     76   ret i32 %storemerge
     77 }
     78 
     79 define i32 @main3d(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
     80 entry:
     81   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
     82   %tobool = icmp ne i32 %and, 0                   ; <i1> [#uses=1]
     83   %and2 = and i32 %argc, 16                       ; <i32> [#uses=1]
     84   %tobool3 = icmp eq i32 %and2, 16                ; <i1> [#uses=1]
     85   %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
     86   %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
     87   ret i32 %storemerge
     88 }
     89 
     90 define i32 @main3f_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
     91            nounwind readnone ssp {
     92 entry:
     93   %and = and i32 %argc, %argc2                    ; <i32> [#uses=1]
     94   %tobool = icmp ne i32 %and, 0                   ; <i1> [#uses=1]
     95   %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
     96   %tobool3 = icmp ne i32 %and2, 0                 ; <i1> [#uses=1]
     97   %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
     98   %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
     99   ret i32 %storemerge
    100 }
    101 
    102 ; (icmp eq (A & B), B) & (icmp eq (A & D), D) -> (icmp eq (A & (B|D)), (B|D))
    103 define i32 @main4(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
    104 entry:
    105   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
    106   %tobool = icmp eq i32 %and, 7                   ; <i1> [#uses=1]
    107   %and2 = and i32 %argc, 48                       ; <i32> [#uses=1]
    108   %tobool3 = icmp eq i32 %and2, 48                ; <i1> [#uses=1]
    109   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    110   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    111   ret i32 %storemerge
    112 }
    113 
    114 define i32 @main4b(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
    115 entry:
    116   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
    117   %tobool = icmp eq i32 %and, 7                   ; <i1> [#uses=1]
    118   %and2 = and i32 %argc, 16                       ; <i32> [#uses=1]
    119   %tobool3 = icmp ne i32 %and2, 0                 ; <i1> [#uses=1]
    120   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    121   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    122   ret i32 %storemerge
    123 }
    124 
    125 define i32 @main4e_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
    126            nounwind readnone ssp {
    127 entry:
    128   %and = and i32 %argc, %argc2                    ; <i32> [#uses=1]
    129   %tobool = icmp eq i32 %and, %argc2              ; <i1> [#uses=1]
    130   %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
    131   %tobool3 = icmp eq i32 %and2, %argc3            ; <i1> [#uses=1]
    132   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    133   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    134   ret i32 %storemerge
    135 }
    136 
    137 ; (icmp ne (A & B), B) | (icmp ne (A & D), D) -> (icmp ne (A & (B|D)), (B|D))
    138 define i32 @main4c(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
    139 entry:
    140   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
    141   %tobool = icmp ne i32 %and, 7                   ; <i1> [#uses=1]
    142   %and2 = and i32 %argc, 48                       ; <i32> [#uses=1]
    143   %tobool3 = icmp ne i32 %and2, 48                ; <i1> [#uses=1]
    144   %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
    145   %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
    146   ret i32 %storemerge
    147 }
    148 
    149 define i32 @main4d(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
    150 entry:
    151   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
    152   %tobool = icmp ne i32 %and, 7                   ; <i1> [#uses=1]
    153   %and2 = and i32 %argc, 16                       ; <i32> [#uses=1]
    154   %tobool3 = icmp eq i32 %and2, 0                 ; <i1> [#uses=1]
    155   %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
    156   %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
    157   ret i32 %storemerge
    158 }
    159 
    160 define i32 @main4f_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
    161            nounwind readnone ssp {
    162 entry:
    163   %and = and i32 %argc, %argc2                    ; <i32> [#uses=1]
    164   %tobool = icmp ne i32 %and, %argc2              ; <i1> [#uses=1]
    165   %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
    166   %tobool3 = icmp ne i32 %and2, %argc3            ; <i1> [#uses=1]
    167   %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
    168   %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
    169   ret i32 %storemerge
    170 }
    171 
    172 ; (icmp eq (A & B), A) & (icmp eq (A & D), A) -> (icmp eq (A & (B&D)), A)
    173 define i32 @main5_like(i32 %argc, i32 %argc2, i8** nocapture %argv)
    174            nounwind readnone ssp {
    175 entry:
    176   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
    177   %tobool = icmp eq i32 %and, 7                   ; <i1> [#uses=1]
    178   %and2 = and i32 %argc2, 7                       ; <i32> [#uses=1]
    179   %tobool3 = icmp eq i32 %and2, 7                 ; <i1> [#uses=1]
    180   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    181   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    182   ret i32 %storemerge
    183 }
    184 
    185 define i32 @main5e_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
    186            nounwind readnone ssp {
    187 entry:
    188   %and = and i32 %argc, %argc2                    ; <i32> [#uses=1]
    189   %tobool = icmp eq i32 %and, %argc               ; <i1> [#uses=1]
    190   %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
    191   %tobool3 = icmp eq i32 %and2, %argc             ; <i1> [#uses=1]
    192   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    193   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    194   ret i32 %storemerge
    195 }
    196 
    197 ; (icmp ne (A & B), A) | (icmp ne (A & D), A) -> (icmp ne (A & (B&D)), A)
    198 define i32 @main5c_like(i32 %argc, i32 %argc2, i8** nocapture %argv)
    199            nounwind readnone ssp {
    200 entry:
    201   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
    202   %tobool = icmp ne i32 %and, 7                   ; <i1> [#uses=1]
    203   %and2 = and i32 %argc2, 7                       ; <i32> [#uses=1]
    204   %tobool3 = icmp ne i32 %and2, 7                 ; <i1> [#uses=1]
    205   %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
    206   %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
    207   ret i32 %storemerge
    208 }
    209 
    210 define i32 @main5f_like(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
    211            nounwind readnone ssp {
    212 entry:
    213   %and = and i32 %argc, %argc2                    ; <i32> [#uses=1]
    214   %tobool = icmp ne i32 %and, %argc               ; <i1> [#uses=1]
    215   %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
    216   %tobool3 = icmp ne i32 %and2, %argc             ; <i1> [#uses=1]
    217   %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
    218   %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
    219   ret i32 %storemerge
    220 }
    221 
    222 ; (icmp eq (A & B), C) & (icmp eq (A & D), E) -> (icmp eq (A & (B|D)), (C|E))
    223 ; if B, C, D, E are constant, and it's possible
    224 define i32 @main6(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
    225 entry:
    226   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
    227   %tobool = icmp eq i32 %and, 3                   ; <i1> [#uses=1]
    228   %and2 = and i32 %argc, 48                       ; <i32> [#uses=1]
    229   %tobool3 = icmp eq i32 %and2, 16                ; <i1> [#uses=1]
    230   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    231   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    232   ret i32 %storemerge
    233 }
    234 
    235 define i32 @main6b(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
    236 entry:
    237   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
    238   %tobool = icmp eq i32 %and, 3                   ; <i1> [#uses=1]
    239   %and2 = and i32 %argc, 16                       ; <i32> [#uses=1]
    240   %tobool3 = icmp ne i32 %and2, 0                 ; <i1> [#uses=1]
    241   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    242   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    243   ret i32 %storemerge
    244 }
    245 
    246 ; (icmp ne (A & B), C) | (icmp ne (A & D), E) -> (icmp ne (A & (B|D)), (C|E))
    247 ; if B, C, D, E are constant, and it's possible
    248 define i32 @main6c(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
    249 entry:
    250   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
    251   %tobool = icmp ne i32 %and, 3                   ; <i1> [#uses=1]
    252   %and2 = and i32 %argc, 48                       ; <i32> [#uses=1]
    253   %tobool3 = icmp ne i32 %and2, 16                ; <i1> [#uses=1]
    254   %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
    255   %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
    256   ret i32 %storemerge
    257 }
    258 
    259 define i32 @main6d(i32 %argc, i8** nocapture %argv) nounwind readnone ssp {
    260 entry:
    261   %and = and i32 %argc, 7                         ; <i32> [#uses=1]
    262   %tobool = icmp ne i32 %and, 3                   ; <i1> [#uses=1]
    263   %and2 = and i32 %argc, 16                       ; <i32> [#uses=1]
    264   %tobool3 = icmp eq i32 %and2, 0                 ; <i1> [#uses=1]
    265   %or.cond = or i1 %tobool, %tobool3              ; <i1> [#uses=1]
    266   %storemerge = select i1 %or.cond, i32 0, i32 1  ; <i32> [#uses=1]
    267   ret i32 %storemerge
    268 }
    269 
    270 ; test parameter permutations
    271 ; (B & A) == B & (D & A) == D
    272 define i32 @main7a(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
    273            nounwind readnone ssp {
    274 entry:
    275   %and1 = and i32 %argc2, %argc                   ; <i32> [#uses=1]
    276   %tobool = icmp eq i32 %and1, %argc2              ; <i1> [#uses=1]
    277   %and2 = and i32 %argc3, %argc                   ; <i32> [#uses=1]
    278   %tobool3 = icmp eq i32 %and2, %argc3            ; <i1> [#uses=1]
    279   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    280   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    281   ret i32 %storemerge
    282 }
    283 
    284 ; B == (A & B) & D == (A & D)
    285 define i32 @main7b(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
    286            nounwind readnone ssp {
    287 entry:
    288   %and1 = and i32 %argc, %argc2                   ; <i32> [#uses=1]
    289   %tobool = icmp eq i32 %argc2, %and1             ; <i1> [#uses=1]
    290   %and2 = and i32 %argc, %argc3                   ; <i32> [#uses=1]
    291   %tobool3 = icmp eq i32 %argc3, %and2            ; <i1> [#uses=1]
    292   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    293   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    294   ret i32 %storemerge
    295 }
    296 
    297 ; B == (B & A) & D == (D & A)
    298 define i32 @main7c(i32 %argc, i32 %argc2, i32 %argc3, i8** nocapture %argv)
    299            nounwind readnone ssp {
    300 entry:
    301   %and1 = and i32 %argc2, %argc                   ; <i32> [#uses=1]
    302   %tobool = icmp eq i32 %argc2, %and1             ; <i1> [#uses=1]
    303   %and2 = and i32 %argc3, %argc                   ; <i32> [#uses=1]
    304   %tobool3 = icmp eq i32 %argc3, %and2            ; <i1> [#uses=1]
    305   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    306   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    307   ret i32 %storemerge
    308 }
    309 
    310 ; (A & (B & C)) == (B & C) & (A & (D & E)) == (D & E)
    311 define i32 @main7d(i32 %argc, i32 %argc2, i32 %argc3,
    312                    i32 %argc4, i32 %argc5, i8** nocapture %argv)
    313            nounwind readnone ssp {
    314 entry:
    315   %bc = and i32 %argc2, %argc4                    ; <i32> [#uses=1]
    316   %de = and i32 %argc3, %argc5                    ; <i32> [#uses=1]
    317   %and1 = and i32 %argc, %bc                      ; <i32> [#uses=1]
    318   %tobool = icmp eq i32 %and1, %bc                ; <i1> [#uses=1]
    319   %and2 = and i32 %argc, %de                      ; <i32> [#uses=1]
    320   %tobool3 = icmp eq i32 %and2, %de               ; <i1> [#uses=1]
    321   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    322   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    323   ret i32 %storemerge
    324 }
    325 
    326 ; ((B & C) & A) == (B & C) & ((D & E) & A) == (D & E)
    327 define i32 @main7e(i32 %argc, i32 %argc2, i32 %argc3,
    328                    i32 %argc4, i32 %argc5, i8** nocapture %argv)
    329            nounwind readnone ssp {
    330 entry:
    331   %bc = and i32 %argc2, %argc4                    ; <i32> [#uses=1]
    332   %de = and i32 %argc3, %argc5                    ; <i32> [#uses=1]
    333   %and1 = and i32 %bc, %argc                      ; <i32> [#uses=1]
    334   %tobool = icmp eq i32 %and1, %bc                ; <i1> [#uses=1]
    335   %and2 = and i32 %de, %argc                      ; <i32> [#uses=1]
    336   %tobool3 = icmp eq i32 %and2, %de               ; <i1> [#uses=1]
    337   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    338   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    339   ret i32 %storemerge
    340 }
    341 
    342 ; (B & C) == (A & (B & C)) & (D & E) == (A & (D & E))
    343 define i32 @main7f(i32 %argc, i32 %argc2, i32 %argc3,
    344                    i32 %argc4, i32 %argc5, i8** nocapture %argv)
    345            nounwind readnone ssp {
    346 entry:
    347   %bc = and i32 %argc2, %argc4                    ; <i32> [#uses=1]
    348   %de = and i32 %argc3, %argc5                    ; <i32> [#uses=1]
    349   %and1 = and i32 %argc, %bc                      ; <i32> [#uses=1]
    350   %tobool = icmp eq i32 %bc, %and1                ; <i1> [#uses=1]
    351   %and2 = and i32 %argc, %de                      ; <i32> [#uses=1]
    352   %tobool3 = icmp eq i32 %de, %and2               ; <i1> [#uses=1]
    353   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    354   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    355   ret i32 %storemerge
    356 }
    357 
    358 ; (B & C) == ((B & C) & A) & (D & E) == ((D & E) & A)
    359 define i32 @main7g(i32 %argc, i32 %argc2, i32 %argc3,
    360                    i32 %argc4, i32 %argc5, i8** nocapture %argv)
    361            nounwind readnone ssp {
    362 entry:
    363   %bc = and i32 %argc2, %argc4                    ; <i32> [#uses=1]
    364   %de = and i32 %argc3, %argc5                    ; <i32> [#uses=1]
    365   %and1 = and i32 %bc, %argc                      ; <i32> [#uses=1]
    366   %tobool = icmp eq i32 %bc, %and1                ; <i1> [#uses=1]
    367   %and2 = and i32 %de, %argc                      ; <i32> [#uses=1]
    368   %tobool3 = icmp eq i32 %de, %and2               ; <i1> [#uses=1]
    369   %and.cond = and i1 %tobool, %tobool3            ; <i1> [#uses=1]
    370   %storemerge = select i1 %and.cond, i32 0, i32 1 ; <i32> [#uses=1]
    371   ret i32 %storemerge
    372 }
    373