Skip to content

Commit dd33e67

Browse files
committed
[ConstraintElim] Fix poison check before adding intrinsic facts
1 parent c5d5972 commit dd33e67

File tree

3 files changed

+23
-12
lines changed

3 files changed

+23
-12
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,12 +1137,12 @@ void State::addInfoFor(BasicBlock &BB) {
11371137
FactOrCheck::getCheck(DT.getNode(&BB), cast<CallInst>(&I)));
11381138
// TODO: Check if it is possible to instead only added the min/max facts
11391139
// when simplifying uses of the min/max intrinsics.
1140-
if (!isGuaranteedNotToBePoison(&I))
1141-
break;
11421140
[[fallthrough]];
11431141
case Intrinsic::abs:
11441142
case Intrinsic::uadd_sat:
11451143
case Intrinsic::usub_sat:
1144+
if (!isGuaranteedNotToBePoison(&I))
1145+
break;
11461146
WorkList.push_back(FactOrCheck::getInstFact(DT.getNode(&BB), &I));
11471147
break;
11481148
}

llvm/test/Transforms/ConstraintElimination/abs.ll

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ define i1 @abs_int_min_is_not_poison(i32 %arg) {
55
; CHECK-LABEL: define i1 @abs_int_min_is_not_poison(
66
; CHECK-SAME: i32 [[ARG:%.*]]) {
77
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
8-
; CHECK-NEXT: ret i1 true
8+
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS]], [[ARG]]
9+
; CHECK-NEXT: ret i1 [[CMP]]
910
;
1011
%abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 false)
1112
%cmp = icmp sge i32 %abs, %arg
@@ -16,7 +17,8 @@ define i1 @abs_int_min_is_poison(i32 %arg) {
1617
; CHECK-LABEL: define i1 @abs_int_min_is_poison(
1718
; CHECK-SAME: i32 [[ARG:%.*]]) {
1819
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
19-
; CHECK-NEXT: ret i1 true
20+
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS]], [[ARG]]
21+
; CHECK-NEXT: ret i1 [[CMP]]
2022
;
2123
%abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 true)
2224
%cmp = icmp sge i32 %abs, %arg
@@ -28,7 +30,8 @@ define i1 @abs_plus_one(i32 %arg) {
2830
; CHECK-SAME: i32 [[ARG:%.*]]) {
2931
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
3032
; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nsw i32 [[ABS]], 1
31-
; CHECK-NEXT: ret i1 true
33+
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS_PLUS_ONE]], [[ARG]]
34+
; CHECK-NEXT: ret i1 [[CMP]]
3235
;
3336
%abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 true)
3437
%abs_plus_one = add nsw i32 %abs, 1
@@ -41,7 +44,8 @@ define i1 @arg_minus_one_strict_less(i32 %arg) {
4144
; CHECK-SAME: i32 [[ARG:%.*]]) {
4245
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
4346
; CHECK-NEXT: [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
44-
; CHECK-NEXT: ret i1 true
47+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[ARG_MINUS_ONE]], [[ABS]]
48+
; CHECK-NEXT: ret i1 [[CMP]]
4549
;
4650
%abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 true)
4751
%arg_minus_one = add nsw i32 %arg, -1
@@ -54,7 +58,8 @@ define i1 @arg_minus_one_strict_greater(i32 %arg) {
5458
; CHECK-SAME: i32 [[ARG:%.*]]) {
5559
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
5660
; CHECK-NEXT: [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
57-
; CHECK-NEXT: ret i1 false
61+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[ARG_MINUS_ONE]], [[ABS]]
62+
; CHECK-NEXT: ret i1 [[CMP]]
5863
;
5964
%abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 true)
6065
%arg_minus_one = add nsw i32 %arg, -1
@@ -69,7 +74,8 @@ define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg(i32 %arg) {
6974
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ARG_NONNEGATIVE]])
7075
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
7176
; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nuw i32 [[ABS]], 1
72-
; CHECK-NEXT: ret i1 true
77+
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i32 [[ABS_PLUS_ONE]], [[ARG]]
78+
; CHECK-NEXT: ret i1 [[CMP]]
7379
;
7480
%cmp_arg_nonnegative = icmp sge i32 %arg, 0
7581
call void @llvm.assume(i1 %cmp_arg_nonnegative)
@@ -142,7 +148,8 @@ define i1 @abs_is_nonnegative_int_min_is_poison(i32 %arg) {
142148
; CHECK-LABEL: define i1 @abs_is_nonnegative_int_min_is_poison(
143149
; CHECK-SAME: i32 [[ARG:%.*]]) {
144150
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
145-
; CHECK-NEXT: ret i1 true
151+
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS]], 0
152+
; CHECK-NEXT: ret i1 [[CMP]]
146153
;
147154
%abs = tail call i32 @llvm.abs.i32(i32 %arg, i1 true)
148155
%cmp = icmp sge i32 %abs, 0
@@ -152,7 +159,8 @@ define i1 @abs_is_nonnegative_int_min_is_poison(i32 %arg) {
152159
define i1 @abs_is_nonnegative_constant_arg() {
153160
; CHECK-LABEL: define i1 @abs_is_nonnegative_constant_arg() {
154161
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 -3, i1 true)
155-
; CHECK-NEXT: ret i1 true
162+
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS]], 0
163+
; CHECK-NEXT: ret i1 [[CMP]]
156164
;
157165
%abs = tail call i32 @llvm.abs.i32(i32 -3, i1 true)
158166
%cmp = icmp sge i32 %abs, 0

llvm/test/Transforms/ConstraintElimination/uadd-usub-sat.ll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ define i1 @uadd_sat_uge(i64 %a, i64 %b) {
88
; CHECK-LABEL: define i1 @uadd_sat_uge(
99
; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) {
1010
; CHECK-NEXT: [[ADD_SAT:%.*]] = call i64 @llvm.uadd.sat.i64(i64 [[A]], i64 [[B]])
11-
; CHECK-NEXT: [[CMP:%.*]] = and i1 true, true
11+
; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i64 [[ADD_SAT]], [[A]]
12+
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i64 [[ADD_SAT]], [[B]]
13+
; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[CMP2]]
1214
; CHECK-NEXT: ret i1 [[CMP]]
1315
;
1416
%add.sat = call i64 @llvm.uadd.sat.i64(i64 %a, i64 %b)
@@ -22,7 +24,8 @@ define i1 @usub_sat_ule_lhs(i64 %a, i64 %b) {
2224
; CHECK-LABEL: define i1 @usub_sat_ule_lhs(
2325
; CHECK-SAME: i64 [[A:%.*]], i64 [[B:%.*]]) {
2426
; CHECK-NEXT: [[SUB_SAT:%.*]] = call i64 @llvm.usub.sat.i64(i64 [[A]], i64 [[B]])
25-
; CHECK-NEXT: ret i1 true
27+
; CHECK-NEXT: [[CMP:%.*]] = icmp ule i64 [[SUB_SAT]], [[A]]
28+
; CHECK-NEXT: ret i1 [[CMP]]
2629
;
2730
%sub.sat = call i64 @llvm.usub.sat.i64(i64 %a, i64 %b)
2831
%cmp = icmp ule i64 %sub.sat, %a

0 commit comments

Comments
 (0)