define i32 @test1(i32 %A) {
%B = or i32 %A, 0
ret i32 %B
-; CHECK: @test1
+; CHECK-LABEL: @test1(
; CHECK: ret i32 %A
}
define i32 @test2(i32 %A) {
%B = or i32 %A, -1
ret i32 %B
-; CHECK: @test2
+; CHECK-LABEL: @test2(
; CHECK: ret i32 -1
}
define i8 @test2a(i8 %A) {
%B = or i8 %A, -1
ret i8 %B
-; CHECK: @test2a
+; CHECK-LABEL: @test2a(
; CHECK: ret i8 -1
}
define i1 @test3(i1 %A) {
%B = or i1 %A, false
ret i1 %B
-; CHECK: @test3
+; CHECK-LABEL: @test3(
; CHECK: ret i1 %A
}
define i1 @test4(i1 %A) {
%B = or i1 %A, true
ret i1 %B
-; CHECK: @test4
+; CHECK-LABEL: @test4(
; CHECK: ret i1 true
}
define i1 @test5(i1 %A) {
%B = or i1 %A, %A
ret i1 %B
-; CHECK: @test5
+; CHECK-LABEL: @test5(
; CHECK: ret i1 %A
}
define i32 @test6(i32 %A) {
%B = or i32 %A, %A
ret i32 %B
-; CHECK: @test6
+; CHECK-LABEL: @test6(
; CHECK: ret i32 %A
}
%NotA = xor i32 -1, %A
%B = or i32 %A, %NotA
ret i32 %B
-; CHECK: @test7
+; CHECK-LABEL: @test7(
; CHECK: ret i32 -1
}
%B = or i8 %A, -2
%C = or i8 %B, 1
ret i8 %C
-; CHECK: @test8
+; CHECK-LABEL: @test8(
; CHECK: ret i8 -1
}
%D = or i8 %B, -2
%E = or i8 %C, %D
ret i8 %E
-; CHECK: @test9
+; CHECK-LABEL: @test9(
; CHECK: ret i8 -1
}
; (X & C1) | C2 --> (X | C2) & (C1|C2)
%D = or i8 %C, -2
ret i8 %D
-; CHECK: @test10
+; CHECK-LABEL: @test10(
; CHECK: ret i8 -2
}
%D = or i8 %C, 1
%E = xor i8 %D, 12
ret i8 %E
-; CHECK: @test11
+; CHECK-LABEL: @test11(
; CHECK: ret i8 -1
}
%B = or i32 %A, 4
%C = and i32 %B, 8
ret i32 %C
-; CHECK: @test12
+; CHECK-LABEL: @test12(
; CHECK: %C = and i32 %A, 8
; CHECK: ret i32 %C
}
; Always equal to 8
%C = and i32 %B, 8
ret i32 %C
-; CHECK: @test13
+; CHECK-LABEL: @test13(
; CHECK: ret i32 8
}
; (A < B) | (A > B) === A != B
%D = or i1 %C1, %C2
ret i1 %D
-; CHECK: @test14
+; CHECK-LABEL: @test14(
; CHECK: icmp ne i32 %A, %B
; CHECK: ret i1
}
; (A < B) | (A == B) === A <= B
%D = or i1 %C1, %C2
ret i1 %D
-; CHECK: @test15
+; CHECK-LABEL: @test15(
; CHECK: icmp ule i32 %A, %B
; CHECK: ret i1
}
; %D = and int %B, -1 == %B
%D = or i32 %B, %C
ret i32 %D
-; CHECK: @test16
+; CHECK-LABEL: @test16(
; CHECK: ret i32 %A
}
; %D = and int %B, 5
%D = or i32 %B, %C
ret i32 %D
-; CHECK: @test17
+; CHECK-LABEL: @test17(
; CHECK: %D = and i32 %A, 5
; CHECK: ret i32 %D
}
;; (A-50) >u 50
%D = or i1 %B, %C
ret i1 %D
-; CHECK: @test18
+; CHECK-LABEL: @test18(
; CHECK: add i32
; CHECK: icmp ugt
; CHECK: ret i1
define i1 @test19(i32 %A) {
%B = icmp eq i32 %A, 50
%C = icmp eq i32 %A, 51
- ;; (A-50) < 2
+ ;; (A&-2) == 50
%D = or i1 %B, %C
ret i1 %D
-; CHECK: @test19
-; CHECK: add i32
-; CHECK: icmp ult
+; CHECK-LABEL: @test19(
+; CHECK: and i32
+; CHECK: icmp eq
; CHECK: ret i1
}
%y = and i32 %x, 123
%z = or i32 %y, %x
ret i32 %z
-; CHECK: @test20
+; CHECK-LABEL: @test20(
; CHECK: ret i32 %x
}
;; add tmp.1, 2
%tmp.6 = or i32 %tmp.5, %tmp.3
ret i32 %tmp.6
-; CHECK: @test21
+; CHECK-LABEL: @test21(
; CHECK: add i32 %{{[^,]*}}, 2
; CHECK: ret i32
}
%ELIM7 = and i32 %B, -2
%ELIM5 = or i32 %ELIM41, %ELIM7
ret i32 %ELIM5
-; CHECK: @test22
+; CHECK-LABEL: @test22(
; CHECK: ret i32 %B
}
%C = or i16 %B, -32768
%D = xor i16 %C, 8193
ret i16 %D
-; CHECK: @test23
+; CHECK-LABEL: @test23(
; CHECK: %B = lshr i16 %A, 1
; CHECK: %D = xor i16 %B, -24575
; CHECK: ret i16 %D
%bothcond = or i1 %tmp13, %tmp9 ; <i1> [#uses=1]
ret i1 %bothcond
-; CHECK: @test24
+; CHECK-LABEL: @test24(
; CHECK: = fcmp uno double %Y, %X
; CHECK: ret i1
}
%F = xor i1 %E, -1
ret i1 %F
-; CHECK: @test25
+; CHECK-LABEL: @test25(
; CHECK: icmp ne i32 %A, 0
; CHECK-NEXT: icmp ne i32 %B, 57
; CHECK-NEXT: %F = and i1
; (A == 0) & (A == 0) --> (A|B) == 0
%D = and i1 %C1, %C2
ret i1 %D
-; CHECK: @test26
+; CHECK-LABEL: @test26(
; CHECK: or i32 %A, %B
; CHECK: icmp eq i32 {{.*}}, 0
; CHECK: ret i1
%D = or i32 %C1, %C2
%E = icmp eq i32 %D, 0
ret i1 %E
-; CHECK: @test27
+; CHECK-LABEL: @test27(
; CHECK: icmp eq i32* %A, null
; CHECK: icmp eq i32* %B, null
; CHECK: and i1
; (A != 0) | (A != 0) --> (A|B) != 0
%D = or i1 %C1, %C2
ret i1 %D
-; CHECK: @test28
+; CHECK-LABEL: @test28(
; CHECK: or i32 %A, %B
; CHECK: icmp ne i32 {{.*}}, 0
; CHECK: ret i1
%D = or i32 %C1, %C2
%E = icmp ne i32 %D, 0
ret i1 %E
-; CHECK: @test29
+; CHECK-LABEL: @test29(
; CHECK: icmp ne i32* %A, null
; CHECK: icmp ne i32* %B, null
; CHECK: or i1
%D = and i32 %B, 40186
%E = or i32 %D, %C
ret i32 %E
-; CHECK: @test30
-; CHECK: %B = or i32 %A, 32962
-; CHECK: %E = and i32 %B, -25350
+; CHECK-LABEL: @test30(
+; CHECK: %D = and i32 %A, -58312
+; CHECK: %E = or i32 %D, 32962
; CHECK: ret i32 %E
}
%F = or i64 %D, %E
ret i64 %F
-; CHECK: @test31
-; CHECK-NEXT: %bitfield = or i64 %A, 32962
-; CHECK-NEXT: %F = and i64 %bitfield, 4294941946
+; CHECK-LABEL: @test31(
+; CHECK-NEXT: %E = and i64 %A, 4294908984
+; CHECK-NEXT: %F = or i64 %E, 32962
; CHECK-NEXT: ret i64 %F
}
%and.i = and <4 x i32> %vecinit6.i191, %neg.i ; <<4 x i32>> [#uses=1]
%or.i = or <4 x i32> %and.i, %and.i129 ; <<4 x i32>> [#uses=1]
ret <4 x i32> %or.i
-; Don't turn this into a vector select until codegen matures to handle them
-; better.
-; CHECK: @test32
-; CHECK: or <4 x i32> %and.i, %and.i129
+; codegen is mature enough to handle vector selects.
+; CHECK-LABEL: @test32(
+; CHECK: select <4 x i1> %and.i1352, <4 x i32> %vecinit6.i176, <4 x i32> %vecinit6.i191
+}
+
+define i1 @test33(i1 %X, i1 %Y) {
+ %a = or i1 %X, %Y
+ %b = or i1 %a, %X
+ ret i1 %b
+; CHECK-LABEL: @test33(
+; CHECK-NEXT: or i1 %X, %Y
+; CHECK-NEXT: ret
+}
+
+define i32 @test34(i32 %X, i32 %Y) {
+ %a = or i32 %X, %Y
+ %b = or i32 %Y, %a
+ ret i32 %b
+; CHECK-LABEL: @test34(
+; CHECK-NEXT: or i32 %X, %Y
+; CHECK-NEXT: ret
+}
+
+define i32 @test35(i32 %a, i32 %b) {
+ %1 = or i32 %a, 1135
+ %2 = or i32 %1, %b
+ ret i32 %2
+ ; CHECK-LABEL: @test35(
+ ; CHECK-NEXT: or i32 %a, %b
+ ; CHECK-NEXT: or i32 %1, 1135
+}
+
+define i1 @test36(i32 %x) {
+ %cmp1 = icmp eq i32 %x, 23
+ %cmp2 = icmp eq i32 %x, 24
+ %ret1 = or i1 %cmp1, %cmp2
+ %cmp3 = icmp eq i32 %x, 25
+ %ret2 = or i1 %ret1, %cmp3
+ ret i1 %ret2
+; CHECK-LABEL: @test36(
+; CHECK-NEXT: %x.off = add i32 %x, -23
+; CHECK-NEXT: icmp ult i32 %x.off, 3
+; CHECK-NEXT: ret i1
+}
+
+define i32 @test37(i32* %xp, i32 %y) {
+; CHECK-LABEL: @test37(
+; CHECK: select i1 %tobool, i32 -1, i32 %x
+ %tobool = icmp ne i32 %y, 0
+ %sext = sext i1 %tobool to i32
+ %x = load i32* %xp
+ %or = or i32 %sext, %x
+ ret i32 %or
+}
+
+define i32 @test38(i32* %xp, i32 %y) {
+; CHECK-LABEL: @test38(
+; CHECK: select i1 %tobool, i32 -1, i32 %x
+ %tobool = icmp ne i32 %y, 0
+ %sext = sext i1 %tobool to i32
+ %x = load i32* %xp
+ %or = or i32 %x, %sext
+ ret i32 %or
+}
+
+define i32 @test39(i32 %a, i32 %b) {
+; CHECK-LABEL: test39(
+; CHECK-NEXT: %or = or i32 %a, %b
+ %xor = xor i32 %a, -1
+ %and = and i32 %xor, %b
+ %or = or i32 %and, %a
+ ret i32 %or
+}
+
+define i32 @test40(i32 %a, i32 %b) {
+; CHECK-LABEL: test40(
+; CHECK-NEXT: %1 = xor i32 %a, -1
+; CHECK-NEXT: %or = or i32 %1, %b
+ %and = and i32 %a, %b
+ %xor = xor i32 %a, -1
+ %or = or i32 %and, %xor
+ ret i32 %or
+}
+
+define i32 @test41(i32 %a, i32 %b) {
+; CHECK-LABEL: test41(
+; CHECK-NEXT: %1 = xor i32 %a, -1
+; CHECK-NEXT: %or = xor i32 %1, %b
+ %and = and i32 %a, %b
+ %nega = xor i32 %a, -1
+ %xor = xor i32 %nega, %b
+ %or = or i32 %and, %xor
+ ret i32 %or
+}
+
+define i32 @test42(i32 %a, i32 %b) {
+; CHECK-LABEL: test42(
+; CHECK-NEXT: %1 = xor i32 %a, -1
+; CHECK-NEXT: %or = xor i32 %1, %b
+ %nega = xor i32 %a, -1
+ %xor = xor i32 %nega, %b
+ %and = and i32 %a, %b
+ %or = or i32 %xor, %and
+ ret i32 %or
+}
+
+define i32 @test43(i32 %a, i32 %b) {
+; CHECK-LABEL: test43(
+; CHECK-NEXT: %or = xor i32 %a, %b
+ %neg = xor i32 %b, -1
+ %and = and i32 %a, %neg
+ %xor = xor i32 %a, %b
+ %or = or i32 %and, %xor
+ ret i32 %or
+}
+
+define i32 @test44(i32 %a, i32 %b) {
+; CHECK-LABEL: test44(
+; CHECK-NEXT: %or = xor i32 %a, %b
+ %xor = xor i32 %a, %b
+ %neg = xor i32 %b, -1
+ %and = and i32 %a, %neg
+ %or = or i32 %xor, %and
+ ret i32 %or
+}
+
+define i32 @test45(i32 %x, i32 %y, i32 %z) {
+; CHECK-LABEL: test45(
+; CHECK-NEXT: %1 = and i32 %x, %z
+; CHECK-NEXT: %or1 = or i32 %1, %y
+; CHECK-NEXT: ret i32 %or1
+ %or = or i32 %y, %z
+ %and = and i32 %x, %or
+ %or1 = or i32 %and, %y
+ ret i32 %or1
+}
+
+define i1 @test46(i8 signext %c) {
+ %c.off = add i8 %c, -97
+ %cmp1 = icmp ult i8 %c.off, 26
+ %c.off17 = add i8 %c, -65
+ %cmp2 = icmp ult i8 %c.off17, 26
+ %or = or i1 %cmp1, %cmp2
+ ret i1 %or
+; CHECK-LABEL: @test46(
+; CHECK-NEXT: and i8 %c, -33
+; CHECK-NEXT: add i8 %1, -65
+; CHECK-NEXT: icmp ult i8 %2, 26
+}
+
+define i1 @test47(i8 signext %c) {
+ %c.off = add i8 %c, -65
+ %cmp1 = icmp ule i8 %c.off, 26
+ %c.off17 = add i8 %c, -97
+ %cmp2 = icmp ule i8 %c.off17, 26
+ %or = or i1 %cmp1, %cmp2
+ ret i1 %or
+; CHECK-LABEL: @test47(
+; CHECK-NEXT: and i8 %c, -33
+; CHECK-NEXT: add i8 %1, -65
+; CHECK-NEXT: icmp ult i8 %2, 27
}
-