1; RUN: opt -S -instcombine < %s | FileCheck %s 2 3define i32 @test1(i32 %x, i32 %y) nounwind { 4 %or = or i32 %x, %y 5 %not = xor i32 %or, -1 6 %z = or i32 %x, %not 7 ret i32 %z 8; CHECK-LABEL: @test1( 9; CHECK-NEXT: %y.not = xor i32 %y, -1 10; CHECK-NEXT: %z = or i32 %y.not, %x 11; CHECK-NEXT: ret i32 %z 12} 13 14define i32 @test2(i32 %x, i32 %y) nounwind { 15 %or = or i32 %x, %y 16 %not = xor i32 %or, -1 17 %z = or i32 %y, %not 18 ret i32 %z 19; CHECK-LABEL: @test2( 20; CHECK-NEXT: %x.not = xor i32 %x, -1 21; CHECK-NEXT: %z = or i32 %x.not, %y 22; CHECK-NEXT: ret i32 %z 23} 24 25define i32 @test3(i32 %x, i32 %y) nounwind { 26 %xor = xor i32 %x, %y 27 %not = xor i32 %xor, -1 28 %z = or i32 %x, %not 29 ret i32 %z 30; CHECK-LABEL: @test3( 31; CHECK-NEXT: %y.not = xor i32 %y, -1 32; CHECK-NEXT: %z = or i32 %y.not, %x 33; CHECK-NEXT: ret i32 %z 34} 35 36define i32 @test4(i32 %x, i32 %y) nounwind { 37 %xor = xor i32 %x, %y 38 %not = xor i32 %xor, -1 39 %z = or i32 %y, %not 40 ret i32 %z 41; CHECK-LABEL: @test4( 42; CHECK-NEXT: %x.not = xor i32 %x, -1 43; CHECK-NEXT: %z = or i32 %x.not, %y 44; CHECK-NEXT: ret i32 %z 45} 46 47define i32 @test5(i32 %x, i32 %y) nounwind { 48 %and = and i32 %x, %y 49 %not = xor i32 %and, -1 50 %z = or i32 %x, %not 51 ret i32 %z 52; CHECK-LABEL: @test5( 53; CHECK-NEXT: ret i32 -1 54} 55 56define i32 @test6(i32 %x, i32 %y) nounwind { 57 %and = and i32 %x, %y 58 %not = xor i32 %and, -1 59 %z = or i32 %y, %not 60 ret i32 %z 61; CHECK-LABEL: @test6( 62; CHECK-NEXT: ret i32 -1 63} 64 65define i32 @test7(i32 %x, i32 %y) nounwind { 66 %xor = xor i32 %x, %y 67 %z = or i32 %y, %xor 68 ret i32 %z 69; CHECK-LABEL: @test7( 70; CHECK-NEXT: %z = or i32 %x, %y 71; CHECK-NEXT: ret i32 %z 72} 73 74define i32 @test8(i32 %x, i32 %y) nounwind { 75 %not = xor i32 %y, -1 76 %xor = xor i32 %x, %not 77 %z = or i32 %y, %xor 78 ret i32 %z 79; CHECK-LABEL: @test8( 80; CHECK-NEXT: %x.not = xor i32 %x, -1 81; CHECK-NEXT: %z = or i32 %x.not, %y 82; CHECK-NEXT: ret i32 %z 83} 84 85define i32 @test9(i32 %x, i32 %y) nounwind { 86 %not = xor i32 %x, -1 87 %xor = xor i32 %not, %y 88 %z = or i32 %x, %xor 89 ret i32 %z 90; CHECK-LABEL: @test9( 91; CHECK-NEXT: %y.not = xor i32 %y, -1 92; CHECK-NEXT: %z = or i32 %y.not, %x 93; CHECK-NEXT: ret i32 %z 94} 95 96define i32 @test10(i32 %A, i32 %B) { 97 %xor1 = xor i32 %B, %A 98 %not = xor i32 %A, -1 99 %xor2 = xor i32 %not, %B 100 %or = or i32 %xor1, %xor2 101 ret i32 %or 102; CHECK-LABEL: @test10( 103; CHECK-NEXT: ret i32 -1 104} 105 106; (x | y) & ((~x) ^ y) -> (x & y) 107define i32 @test11(i32 %x, i32 %y) { 108 %or = or i32 %x, %y 109 %neg = xor i32 %x, -1 110 %xor = xor i32 %neg, %y 111 %and = and i32 %or, %xor 112 ret i32 %and 113; CHECK-LABEL: @test11( 114; CHECK-NEXT: %and = and i32 %x, %y 115; CHECK-NEXT: ret i32 %and 116} 117 118; ((~x) ^ y) & (x | y) -> (x & y) 119define i32 @test12(i32 %x, i32 %y) { 120 %neg = xor i32 %x, -1 121 %xor = xor i32 %neg, %y 122 %or = or i32 %x, %y 123 %and = and i32 %xor, %or 124 ret i32 %and 125; CHECK-LABEL: @test12( 126; CHECK-NEXT: %and = and i32 %x, %y 127; CHECK-NEXT: ret i32 %and 128} 129 130; ((x | y) ^ (x ^ y)) -> (x & y) 131define i32 @test13(i32 %x, i32 %y) { 132 %1 = xor i32 %y, %x 133 %2 = or i32 %y, %x 134 %3 = xor i32 %2, %1 135 ret i32 %3 136; CHECK-LABEL: @test13( 137; CHECK-NEXT: %1 = and i32 %y, %x 138; CHECK-NEXT: ret i32 %1 139} 140 141; ((x | ~y) ^ (~x | y)) -> x ^ y 142define i32 @test14(i32 %x, i32 %y) { 143 %noty = xor i32 %y, -1 144 %notx = xor i32 %x, -1 145 %or1 = or i32 %x, %noty 146 %or2 = or i32 %notx, %y 147 %xor = xor i32 %or1, %or2 148 ret i32 %xor 149; CHECK-LABEL: @test14( 150; CHECK-NEXT: %xor = xor i32 %x, %y 151; CHECK-NEXT: ret i32 %xor 152} 153 154; ((x & ~y) ^ (~x & y)) -> x ^ y 155define i32 @test15(i32 %x, i32 %y) { 156 %noty = xor i32 %y, -1 157 %notx = xor i32 %x, -1 158 %and1 = and i32 %x, %noty 159 %and2 = and i32 %notx, %y 160 %xor = xor i32 %and1, %and2 161 ret i32 %xor 162; CHECK-LABEL: @test15( 163; CHECK-NEXT: %xor = xor i32 %x, %y 164; CHECK-NEXT: ret i32 %xor 165} 166 167define i32 @test16(i32 %a, i32 %b) { 168 %or = xor i32 %a, %b 169 %and1 = and i32 %or, 1 170 %and2 = and i32 %b, -2 171 %xor = or i32 %and1, %and2 172 ret i32 %xor 173; CHECK-LABEL: @test16( 174; CHECK-NEXT: %1 = and i32 %a, 1 175; CHECK-NEXT: %xor = xor i32 %1, %b 176; CHECK-NEXT: ret i32 %xor 177} 178