Home | History | Annotate | Download | only in InstCombine
      1 ; RUN: opt < %s -instcombine -S | FileCheck %s
      2 
      3 ; PR1510
      4 
      5 ; These are all equivalent to A^B
      6 
      7 define i32 @test1(i32 %a, i32 %b) {
      8         %tmp3 = or i32 %b, %a           ; <i32> [#uses=1]
      9         %tmp3not = xor i32 %tmp3, -1            ; <i32> [#uses=1]
     10         %tmp6 = and i32 %b, %a          ; <i32> [#uses=1]
     11         %tmp7 = or i32 %tmp6, %tmp3not          ; <i32> [#uses=1]
     12         %tmp7not = xor i32 %tmp7, -1            ; <i32> [#uses=1]
     13         ret i32 %tmp7not
     14 
     15 ; CHECK-LABEL: @test1(
     16 ; CHECK-NEXT:    [[TMP7NOT:%.*]] = xor i32 %b, %a
     17 ; CHECK-NEXT:    ret i32 [[TMP7NOT]]
     18 }
     19 
     20 define i32 @test2(i32 %a, i32 %b) {
     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 ; CHECK-LABEL: @test2(
     28 ; CHECK-NEXT:    [[TMP7:%.*]] = xor i32 %b, %a
     29 ; CHECK-NEXT:    ret i32 [[TMP7]]
     30 }
     31 
     32 define <4 x i32> @test3(<4 x i32> %a, <4 x i32> %b) {
     33         %tmp3 = or <4 x i32> %a, %b             ; <<4 x i32>> [#uses=1]
     34         %tmp3not = xor <4 x i32> %tmp3, < i32 -1, i32 -1, i32 -1, i32 -1 >              ; <<4 x i32>> [#uses=1]
     35         %tmp6 = and <4 x i32> %a, %b            ; <<4 x i32>> [#uses=1]
     36         %tmp7 = or <4 x i32> %tmp6, %tmp3not            ; <<4 x i32>> [#uses=1]
     37         %tmp7not = xor <4 x i32> %tmp7, < i32 -1, i32 -1, i32 -1, i32 -1 >              ; <<4 x i32>> [#uses=1]
     38         ret <4 x i32> %tmp7not
     39 
     40 ; CHECK-LABEL: @test3(
     41 ; CHECK-NEXT:    [[TMP7NOT:%.*]] = xor <4 x i32> %a, %b
     42 ; CHECK-NEXT:    ret <4 x i32> [[TMP7NOT]]
     43 }
     44 
     45 define <4 x i32> @test4(<4 x i32> %a, <4 x i32> %b) {
     46         %tmp3 = or <4 x i32> %a, %b             ; <<4 x i32>> [#uses=1]
     47         %tmp6 = and <4 x i32> %a, %b            ; <<4 x i32>> [#uses=1]
     48         %tmp6not = xor <4 x i32> %tmp6, < i32 -1, i32 -1, i32 -1, i32 -1 >              ; <<4 x i32>> [#uses=1]
     49         %tmp7 = and <4 x i32> %tmp3, %tmp6not           ; <<4 x i32>> [#uses=1]
     50         ret <4 x i32> %tmp7
     51 
     52 ; CHECK-LABEL: @test4(
     53 ; CHECK-NEXT:    [[TMP7:%.*]] = xor <4 x i32> %a, %b
     54 ; CHECK-NEXT:    ret <4 x i32> [[TMP7]]
     55 }
     56 
     57