forked from OSchip/llvm-project
[InstCombine][NFC]: Add tests: foldSelectICmpAndAnd(): and is commutative
Summary: The fold added in D45108 did not account for the fact that the and instruction is commutative, and if the mask is a variable, the mask variable and the fold variable may be swapped. I have noticed this by accident when looking into [[ https://bugs.llvm.org/show_bug.cgi?id=6773 | PR6773 ]] Reviewers: spatel, craig.topper Reviewed By: spatel Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D45538 llvm-svn: 329901
This commit is contained in:
parent
650234ba36
commit
53271ba1d2
|
@ -174,6 +174,24 @@ define i32 @f_var0(i32 %arg, i32 %arg1) {
|
||||||
ret i32 %tmp5
|
ret i32 %tmp5
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Should be exactly as the previous one
|
||||||
|
define i32 @f_var0_commutative_and(i32 %arg, i32 %arg1) {
|
||||||
|
; CHECK-LABEL: @f_var0_commutative_and(
|
||||||
|
; CHECK-NEXT: [[TMP:%.*]] = and i32 [[ARG1:%.*]], [[ARG:%.*]]
|
||||||
|
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP]], 0
|
||||||
|
; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[ARG]], 1
|
||||||
|
; CHECK-NEXT: [[TMP4:%.*]] = and i32 [[TMP3]], 1
|
||||||
|
; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP2]], i32 [[TMP4]], i32 1
|
||||||
|
; CHECK-NEXT: ret i32 [[TMP5]]
|
||||||
|
;
|
||||||
|
%tmp = and i32 %arg1, %arg ; in different order
|
||||||
|
%tmp2 = icmp eq i32 %tmp, 0
|
||||||
|
%tmp3 = lshr i32 %arg, 1
|
||||||
|
%tmp4 = and i32 %tmp3, 1
|
||||||
|
%tmp5 = select i1 %tmp2, i32 %tmp4, i32 1
|
||||||
|
ret i32 %tmp5
|
||||||
|
}
|
||||||
|
|
||||||
define <2 x i32> @f_var0_splatvec(<2 x i32> %arg, <2 x i32> %arg1) {
|
define <2 x i32> @f_var0_splatvec(<2 x i32> %arg, <2 x i32> %arg1) {
|
||||||
; CHECK-LABEL: @f_var0_splatvec(
|
; CHECK-LABEL: @f_var0_splatvec(
|
||||||
; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i32> [[ARG1:%.*]], <i32 2, i32 2>
|
; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i32> [[ARG1:%.*]], <i32 2, i32 2>
|
||||||
|
@ -238,6 +256,22 @@ define i32 @f_var1(i32 %arg, i32 %arg1) {
|
||||||
ret i32 %tmp4
|
ret i32 %tmp4
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Should be exactly as the previous one
|
||||||
|
define i32 @f_var1_commutative_and(i32 %arg, i32 %arg1) {
|
||||||
|
; CHECK-LABEL: @f_var1_commutative_and(
|
||||||
|
; CHECK-NEXT: [[TMP:%.*]] = and i32 [[ARG1:%.*]], [[ARG:%.*]]
|
||||||
|
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP]], 0
|
||||||
|
; CHECK-NEXT: [[TMP3:%.*]] = and i32 [[ARG]], 1
|
||||||
|
; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP2]], i32 [[TMP3]], i32 1
|
||||||
|
; CHECK-NEXT: ret i32 [[TMP4]]
|
||||||
|
;
|
||||||
|
%tmp = and i32 %arg1, %arg ; in different order
|
||||||
|
%tmp2 = icmp eq i32 %tmp, 0
|
||||||
|
%tmp3 = and i32 %arg, 1
|
||||||
|
%tmp4 = select i1 %tmp2, i32 %tmp3, i32 1
|
||||||
|
ret i32 %tmp4
|
||||||
|
}
|
||||||
|
|
||||||
define <2 x i32> @f_var1_vec(<2 x i32> %arg, <2 x i32> %arg1) {
|
define <2 x i32> @f_var1_vec(<2 x i32> %arg, <2 x i32> %arg1) {
|
||||||
; CHECK-LABEL: @f_var1_vec(
|
; CHECK-LABEL: @f_var1_vec(
|
||||||
; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i32> [[ARG1:%.*]], <i32 1, i32 1>
|
; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i32> [[ARG1:%.*]], <i32 1, i32 1>
|
||||||
|
@ -361,6 +395,24 @@ define i32 @f_var3(i32 %arg, i32 %arg1, i32 %arg2) {
|
||||||
ret i32 %tmp6
|
ret i32 %tmp6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Should be exactly as the previous one
|
||||||
|
define i32 @f_var3_commutative_and(i32 %arg, i32 %arg1, i32 %arg2) {
|
||||||
|
; CHECK-LABEL: @f_var3_commutative_and(
|
||||||
|
; CHECK-NEXT: [[TMP:%.*]] = and i32 [[ARG1:%.*]], [[ARG:%.*]]
|
||||||
|
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP]], 0
|
||||||
|
; CHECK-NEXT: [[TMP4:%.*]] = lshr i32 [[ARG]], [[ARG2:%.*]]
|
||||||
|
; CHECK-NEXT: [[TMP5:%.*]] = and i32 [[TMP4]], 1
|
||||||
|
; CHECK-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP5]], i32 1
|
||||||
|
; CHECK-NEXT: ret i32 [[TMP6]]
|
||||||
|
;
|
||||||
|
%tmp = and i32 %arg1, %arg ; in different order
|
||||||
|
%tmp3 = icmp eq i32 %tmp, 0
|
||||||
|
%tmp4 = lshr i32 %arg, %arg2
|
||||||
|
%tmp5 = and i32 %tmp4, 1
|
||||||
|
%tmp6 = select i1 %tmp3, i32 %tmp5, i32 1
|
||||||
|
ret i32 %tmp6
|
||||||
|
}
|
||||||
|
|
||||||
define <2 x i32> @f_var3_splatvec(<2 x i32> %arg, <2 x i32> %arg1, <2 x i32> %arg2) {
|
define <2 x i32> @f_var3_splatvec(<2 x i32> %arg, <2 x i32> %arg1, <2 x i32> %arg2) {
|
||||||
; CHECK-LABEL: @f_var3_splatvec(
|
; CHECK-LABEL: @f_var3_splatvec(
|
||||||
; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i32> <i32 1, i32 1>, [[ARG2:%.*]]
|
; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i32> <i32 1, i32 1>, [[ARG2:%.*]]
|
||||||
|
|
Loading…
Reference in New Issue