1 ; RUN: opt < %s -instcombine -S | grep xor | count 4 2 ; RUN: opt < %s -instcombine -S | not grep and 3 ; RUN: opt < %s -instcombine -S | not grep { or} 4 5 ; PR1510 6 7 ; These are all equivalent to A^B 8 9 define i32 @test1(i32 %a, i32 %b) { 10 entry: 11 %tmp3 = or i32 %b, %a ; <i32> [#uses=1] 12 %tmp3not = xor i32 %tmp3, -1 ; <i32> [#uses=1] 13 %tmp6 = and i32 %b, %a ; <i32> [#uses=1] 14 %tmp7 = or i32 %tmp6, %tmp3not ; <i32> [#uses=1] 15 %tmp7not = xor i32 %tmp7, -1 ; <i32> [#uses=1] 16 ret i32 %tmp7not 17 } 18 19 define i32 @test2(i32 %a, i32 %b) { 20 entry: 21 %tmp3 = or i32 %b, %a ; <i32> [#uses=1] 22 %tmp6 = and i32 %b, %a ; <i32> [#uses=1] 23 %tmp6not = xor i32 %tmp6, -1 ; <i32> [#uses=1] 24 %tmp7 = and i32 %tmp3, %tmp6not ; <i32> [#uses=1] 25 ret i32 %tmp7 26 } 27 28 define <4 x i32> @test3(<4 x i32> %a, <4 x i32> %b) { 29 entry: 30 %tmp3 = or <4 x i32> %a, %b ; <<4 x i32>> [#uses=1] 31 %tmp3not = xor <4 x i32> %tmp3, < i32 -1, i32 -1, i32 -1, i32 -1 > ; <<4 x i32>> [#uses=1] 32 %tmp6 = and <4 x i32> %a, %b ; <<4 x i32>> [#uses=1] 33 %tmp7 = or <4 x i32> %tmp6, %tmp3not ; <<4 x i32>> [#uses=1] 34 %tmp7not = xor <4 x i32> %tmp7, < i32 -1, i32 -1, i32 -1, i32 -1 > ; <<4 x i32>> [#uses=1] 35 ret <4 x i32> %tmp7not 36 } 37 38 define <4 x i32> @test4(<4 x i32> %a, <4 x i32> %b) { 39 entry: 40 %tmp3 = or <4 x i32> %a, %b ; <<4 x i32>> [#uses=1] 41 %tmp6 = and <4 x i32> %a, %b ; <<4 x i32>> [#uses=1] 42 %tmp6not = xor <4 x i32> %tmp6, < i32 -1, i32 -1, i32 -1, i32 -1 > ; <<4 x i32>> [#uses=1] 43 %tmp7 = and <4 x i32> %tmp3, %tmp6not ; <<4 x i32>> [#uses=1] 44 ret <4 x i32> %tmp7 45 } 46 47