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 {xor }
      5 ; END.
      6 @G1 = global i32 0		; <i32*> [#uses=1]
      7 @G2 = global i32 0		; <i32*> [#uses=1]
      8 
      9 define i1 @test0(i1 %A) {
     10 	%B = xor i1 %A, false		; <i1> [#uses=1]
     11 	ret i1 %B
     12 }
     13 
     14 define i32 @test1(i32 %A) {
     15 	%B = xor i32 %A, 0		; <i32> [#uses=1]
     16 	ret i32 %B
     17 }
     18 
     19 define i1 @test2(i1 %A) {
     20 	%B = xor i1 %A, %A		; <i1> [#uses=1]
     21 	ret i1 %B
     22 }
     23 
     24 define i32 @test3(i32 %A) {
     25 	%B = xor i32 %A, %A		; <i32> [#uses=1]
     26 	ret i32 %B
     27 }
     28 
     29 define i32 @test4(i32 %A) {
     30 	%NotA = xor i32 -1, %A		; <i32> [#uses=1]
     31 	%B = xor i32 %A, %NotA		; <i32> [#uses=1]
     32 	ret i32 %B
     33 }
     34 
     35 define i32 @test5(i32 %A) {
     36 	%t1 = or i32 %A, 123		; <i32> [#uses=1]
     37 	%r = xor i32 %t1, 123		; <i32> [#uses=1]
     38 	ret i32 %r
     39 }
     40 
     41 define i8 @test6(i8 %A) {
     42 	%B = xor i8 %A, 17		; <i8> [#uses=1]
     43 	%C = xor i8 %B, 17		; <i8> [#uses=1]
     44 	ret i8 %C
     45 }
     46 
     47 define i32 @test7(i32 %A, i32 %B) {
     48 	%A1 = and i32 %A, 7		; <i32> [#uses=1]
     49 	%B1 = and i32 %B, 128		; <i32> [#uses=1]
     50 	%C1 = xor i32 %A1, %B1		; <i32> [#uses=1]
     51 	ret i32 %C1
     52 }
     53 
     54 define i8 @test8(i1 %c) {
     55 	%d = xor i1 %c, true		; <i1> [#uses=1]
     56 	br i1 %d, label %True, label %False
     57 
     58 True:		; preds = %0
     59 	ret i8 1
     60 
     61 False:		; preds = %0
     62 	ret i8 3
     63 }
     64 
     65 define i1 @test9(i8 %A) {
     66 	%B = xor i8 %A, 123		; <i8> [#uses=1]
     67 	%C = icmp eq i8 %B, 34		; <i1> [#uses=1]
     68 	ret i1 %C
     69 }
     70 
     71 define i8 @test10(i8 %A) {
     72 	%B = and i8 %A, 3		; <i8> [#uses=1]
     73 	%C = xor i8 %B, 4		; <i8> [#uses=1]
     74 	ret i8 %C
     75 }
     76 
     77 define i8 @test11(i8 %A) {
     78 	%B = or i8 %A, 12		; <i8> [#uses=1]
     79 	%C = xor i8 %B, 4		; <i8> [#uses=1]
     80 	ret i8 %C
     81 }
     82 
     83 define i1 @test12(i8 %A) {
     84 	%B = xor i8 %A, 4		; <i8> [#uses=1]
     85 	%c = icmp ne i8 %B, 0		; <i1> [#uses=1]
     86 	ret i1 %c
     87 }
     88 
     89 define i1 @test13(i8 %A, i8 %B) {
     90 	%C = icmp ult i8 %A, %B		; <i1> [#uses=1]
     91 	%D = icmp ugt i8 %A, %B		; <i1> [#uses=1]
     92 	%E = xor i1 %C, %D		; <i1> [#uses=1]
     93 	ret i1 %E
     94 }
     95 
     96 define i1 @test14(i8 %A, i8 %B) {
     97 	%C = icmp eq i8 %A, %B		; <i1> [#uses=1]
     98 	%D = icmp ne i8 %B, %A		; <i1> [#uses=1]
     99 	%E = xor i1 %C, %D		; <i1> [#uses=1]
    100 	ret i1 %E
    101 }
    102 
    103 define i32 @test15(i32 %A) {
    104 	%B = add i32 %A, -1		; <i32> [#uses=1]
    105 	%C = xor i32 %B, -1		; <i32> [#uses=1]
    106 	ret i32 %C
    107 }
    108 
    109 define i32 @test16(i32 %A) {
    110 	%B = add i32 %A, 123		; <i32> [#uses=1]
    111 	%C = xor i32 %B, -1		; <i32> [#uses=1]
    112 	ret i32 %C
    113 }
    114 
    115 define i32 @test17(i32 %A) {
    116 	%B = sub i32 123, %A		; <i32> [#uses=1]
    117 	%C = xor i32 %B, -1		; <i32> [#uses=1]
    118 	ret i32 %C
    119 }
    120 
    121 define i32 @test18(i32 %A) {
    122 	%B = xor i32 %A, -1		; <i32> [#uses=1]
    123 	%C = sub i32 123, %B		; <i32> [#uses=1]
    124 	ret i32 %C
    125 }
    126 
    127 define i32 @test19(i32 %A, i32 %B) {
    128 	%C = xor i32 %A, %B		; <i32> [#uses=1]
    129 	%D = xor i32 %C, %A		; <i32> [#uses=1]
    130 	ret i32 %D
    131 }
    132 
    133 define void @test20(i32 %A, i32 %B) {
    134 	%tmp.2 = xor i32 %B, %A		; <i32> [#uses=2]
    135 	%tmp.5 = xor i32 %tmp.2, %B		; <i32> [#uses=2]
    136 	%tmp.8 = xor i32 %tmp.5, %tmp.2		; <i32> [#uses=1]
    137 	store i32 %tmp.8, i32* @G1
    138 	store i32 %tmp.5, i32* @G2
    139 	ret void
    140 }
    141 
    142 define i32 @test21(i1 %C, i32 %A, i32 %B) {
    143 	%C2 = xor i1 %C, true		; <i1> [#uses=1]
    144 	%D = select i1 %C2, i32 %A, i32 %B		; <i32> [#uses=1]
    145 	ret i32 %D
    146 }
    147 
    148 define i32 @test22(i1 %X) {
    149 	%Y = xor i1 %X, true		; <i1> [#uses=1]
    150 	%Z = zext i1 %Y to i32		; <i32> [#uses=1]
    151 	%Q = xor i32 %Z, 1		; <i32> [#uses=1]
    152 	ret i32 %Q
    153 }
    154 
    155 define i1 @test23(i32 %a, i32 %b) {
    156 	%tmp.2 = xor i32 %b, %a		; <i32> [#uses=1]
    157 	%tmp.4 = icmp eq i32 %tmp.2, %a		; <i1> [#uses=1]
    158 	ret i1 %tmp.4
    159 }
    160 
    161 define i1 @test24(i32 %c, i32 %d) {
    162 	%tmp.2 = xor i32 %d, %c		; <i32> [#uses=1]
    163 	%tmp.4 = icmp ne i32 %tmp.2, %c		; <i1> [#uses=1]
    164 	ret i1 %tmp.4
    165 }
    166 
    167 define i32 @test25(i32 %g, i32 %h) {
    168 	%h2 = xor i32 %h, -1		; <i32> [#uses=1]
    169 	%tmp2 = and i32 %h2, %g		; <i32> [#uses=1]
    170 	%tmp4 = xor i32 %tmp2, %g		; <i32> [#uses=1]
    171 	ret i32 %tmp4
    172 }
    173 
    174 define i32 @test26(i32 %a, i32 %b) {
    175 	%b2 = xor i32 %b, -1		; <i32> [#uses=1]
    176 	%tmp2 = xor i32 %a, %b2		; <i32> [#uses=1]
    177 	%tmp4 = and i32 %tmp2, %a		; <i32> [#uses=1]
    178 	ret i32 %tmp4
    179 }
    180 
    181 define i32 @test27(i32 %b, i32 %c, i32 %d) {
    182 	%tmp2 = xor i32 %d, %b		; <i32> [#uses=1]
    183 	%tmp5 = xor i32 %d, %c		; <i32> [#uses=1]
    184 	%tmp = icmp eq i32 %tmp2, %tmp5		; <i1> [#uses=1]
    185 	%tmp6 = zext i1 %tmp to i32		; <i32> [#uses=1]
    186 	ret i32 %tmp6
    187 }
    188 
    189 define i32 @test28(i32 %indvar) {
    190 	%tmp7 = add i32 %indvar, -2147483647		; <i32> [#uses=1]
    191 	%tmp214 = xor i32 %tmp7, -2147483648		; <i32> [#uses=1]
    192 	ret i32 %tmp214
    193 }
    194