Skip to content

Commit 353fa44

Browse files
committed
[PredicateInfo] Place predicate info after assume
Place the ssa.copy instructions for assumes after the assume, instead of before it. Both options are valid, but placing them afterwards prevents assumes from being replaced with assume(true). This fixes https://bugs.llvm.org/show_bug.cgi?id=37541 in NewGVN and will avoid a similar issue in SCCP when we handle more predicate infos. Differential Revision: https://reviews.llvm.org/D83631
1 parent 4b626dd commit 353fa44

File tree

4 files changed

+24
-22
lines changed

4 files changed

+24
-22
lines changed

llvm/lib/Transforms/Utils/PredicateInfo.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,14 +205,14 @@ struct ValueDFS_Compare {
205205
// numbering will say the placed predicaeinfos should go first (IE
206206
// LN_beginning), so we won't be in this function. For assumes, we will end
207207
// up here, beause we need to order the def we will place relative to the
208-
// assume. So for the purpose of ordering, we pretend the def is the assume
209-
// because that is where we will insert the info.
208+
// assume. So for the purpose of ordering, we pretend the def is right
209+
// after the assume, because that is where we will insert the info.
210210
if (!VD.U) {
211211
assert(VD.PInfo &&
212212
"No def, no use, and no predicateinfo should not occur");
213213
assert(isa<PredicateAssume>(VD.PInfo) &&
214214
"Middle of block should only occur for assumes");
215-
return cast<PredicateAssume>(VD.PInfo)->AssumeInst;
215+
return cast<PredicateAssume>(VD.PInfo)->AssumeInst->getNextNode();
216216
}
217217
return nullptr;
218218
}
@@ -621,7 +621,9 @@ Value *PredicateInfoBuilder::materializeStack(unsigned int &Counter,
621621
auto *PAssume = dyn_cast<PredicateAssume>(ValInfo);
622622
assert(PAssume &&
623623
"Should not have gotten here without it being an assume");
624-
IRBuilder<> B(PAssume->AssumeInst);
624+
// Insert the predicate directly after the assume. While it also holds
625+
// directly before it, assume(i1 true) is not a useful fact.
626+
IRBuilder<> B(PAssume->AssumeInst->getNextNode());
625627
Function *IF = getCopyDeclaration(F.getParent(), Op->getType());
626628
if (IF->users().empty())
627629
PI.CreatedDeclarations.insert(IF);

llvm/test/Transforms/NewGVN/assume-equal.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ define float @_Z1if(float %p) {
77
; CHECK-NEXT: [[P_ADDR:%.*]] = alloca float, align 4
88
; CHECK-NEXT: store float [[P:%.*]], float* [[P_ADDR]], align 4
99
; CHECK-NEXT: [[CMP:%.*]] = fcmp ueq float [[P]], 3.000000e+00
10-
; CHECK-NEXT: call void @llvm.assume(i1 true)
10+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
1111
; CHECK-NEXT: ret float [[P]]
1212
;
1313
entry:
@@ -26,7 +26,7 @@ define i32 @_Z1ii(i32 %p) {
2626
; CHECK-LABEL: @_Z1ii(
2727
; CHECK-NEXT: entry:
2828
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[P:%.*]], 42
29-
; CHECK-NEXT: call void @llvm.assume(i1 true)
29+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
3030
; CHECK-NEXT: br i1 true, label [[BB2:%.*]], label [[BB2]]
3131
; CHECK: bb2:
3232
; CHECK-NEXT: br i1 true, label [[BB2]], label [[BB2]]
@@ -50,7 +50,7 @@ define i32 @_Z1ij(i32 %p) {
5050
; CHECK-LABEL: @_Z1ij(
5151
; CHECK-NEXT: entry:
5252
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[P:%.*]], 42
53-
; CHECK-NEXT: call void @llvm.assume(i1 true)
53+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
5454
; CHECK-NEXT: br i1 true, label [[BB2:%.*]], label [[BB2]]
5555
; CHECK: bb2:
5656
; CHECK-NEXT: call void @llvm.assume(i1 true)
@@ -76,10 +76,10 @@ define i32 @_Z1ik(i32 %p) {
7676
; CHECK-LABEL: @_Z1ik(
7777
; CHECK-NEXT: entry:
7878
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[P:%.*]], 42
79-
; CHECK-NEXT: call void @llvm.assume(i1 true)
79+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
8080
; CHECK-NEXT: br i1 true, label [[BB2:%.*]], label [[BB3:%.*]]
8181
; CHECK: bb2:
82-
; CHECK-NEXT: call void @llvm.assume(i1 true)
82+
; CHECK-NEXT: call void @llvm.assume(i1 false)
8383
; CHECK-NEXT: ret i32 15
8484
; CHECK: bb3:
8585
; CHECK-NEXT: store i8 undef, i8* null, align 1

llvm/test/Transforms/NewGVN/assumes.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
define i32 @test1(i32 %arg) {
55
; CHECK-LABEL: @test1(
66
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ARG:%.*]], 5
7-
; CHECK-NEXT: call void @llvm.assume(i1 true)
7+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
88
; CHECK-NEXT: ret i32 [[ARG]]
99
;
1010
%cmp = icmp sge i32 %arg, 5
@@ -18,7 +18,7 @@ define i32 @test2(i32 %arg, i1 %b) {
1818
; CHECK: bb:
1919
; CHECK-NEXT: [[A:%.*]] = phi i32 [ 1, [[TMP0:%.*]] ], [ 2, [[BB]] ]
2020
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[ARG:%.*]], [[A]]
21-
; CHECK-NEXT: call void @llvm.assume(i1 true)
21+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
2222
; CHECK-NEXT: br i1 [[B:%.*]], label [[BB]], label [[END:%.*]]
2323
; CHECK: end:
2424
; CHECK-NEXT: ret i32 [[ARG]]

llvm/test/Transforms/Util/PredicateInfo/testandor.ll

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2-
; RUN: opt -print-predicateinfo < %s 2>&1 | FileCheck %s
2+
; RUN: opt -print-predicateinfo -disable-output < %s 2>&1 | FileCheck %s
33

44
declare void @foo(i1)
55
declare void @bar(i32)
@@ -136,18 +136,18 @@ define void @testandassume(i32 %x, i32 %y) {
136136
; CHECK-NEXT: [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 0
137137
; CHECK-NEXT: [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0
138138
; CHECK-NEXT: [[Z:%.*]] = and i1 [[XZ]], [[YZ]]
139-
; CHECK: [[TMP1:%.*]] = call i1 @llvm.ssa.copy.{{.+}}(i1 [[XZ]])
140-
; CHECK: [[TMP2:%.*]] = call i32 @llvm.ssa.copy.{{.+}}(i32 [[X]])
139+
; CHECK-NEXT: call void @llvm.assume(i1 [[Z]])
140+
; CHECK: [[TMP1:%.*]] = call i1 @llvm.ssa.copy.{{.+}}(i1 [[Z]])
141+
; CHECK: [[TMP2:%.*]] = call i32 @llvm.ssa.copy.{{.+}}(i32 [[Y]])
141142
; CHECK: [[TMP3:%.*]] = call i1 @llvm.ssa.copy.{{.+}}(i1 [[YZ]])
142-
; CHECK: [[TMP4:%.*]] = call i32 @llvm.ssa.copy.{{.+}}(i32 [[Y]])
143-
; CHECK: [[TMP5:%.*]] = call i1 @llvm.ssa.copy.{{.+}}(i1 [[Z]])
144-
; CHECK-NEXT: call void @llvm.assume(i1 [[TMP5]])
145-
; CHECK: [[DOT0:%.*]] = call i1 @llvm.ssa.copy.{{.+}}(i1 [[TMP1]])
146-
; CHECK: [[DOT01:%.*]] = call i32 @llvm.ssa.copy.{{.+}}(i32 [[TMP2]])
143+
; CHECK: [[TMP4:%.*]] = call i32 @llvm.ssa.copy.{{.+}}(i32 [[X]])
144+
; CHECK: [[TMP5:%.*]] = call i1 @llvm.ssa.copy.{{.+}}(i1 [[XZ]])
145+
; CHECK: [[DOT0:%.*]] = call i1 @llvm.ssa.copy.{{.+}}(i1 [[TMP5]])
146+
; CHECK: [[DOT01:%.*]] = call i32 @llvm.ssa.copy.{{.+}}(i32 [[TMP4]])
147147
; CHECK: [[DOT02:%.*]] = call i1 @llvm.ssa.copy.{{.+}}(i1 [[TMP3]])
148-
; CHECK: [[DOT03:%.*]] = call i32 @llvm.ssa.copy.{{.+}}(i32 [[TMP4]])
149-
; CHECK: [[DOT04:%.*]] = call i1 @llvm.ssa.copy.{{.+}}(i1 [[TMP5]])
150-
; CHECK-NEXT: br i1 [[TMP5]], label [[BOTH:%.*]], label [[NOPE:%.*]]
148+
; CHECK: [[DOT03:%.*]] = call i32 @llvm.ssa.copy.{{.+}}(i32 [[TMP2]])
149+
; CHECK: [[DOT04:%.*]] = call i1 @llvm.ssa.copy.{{.+}}(i1 [[TMP1]])
150+
; CHECK-NEXT: br i1 [[TMP1]], label [[BOTH:%.*]], label [[NOPE:%.*]]
151151
; CHECK: both:
152152
; CHECK-NEXT: call void @foo(i1 [[DOT0]])
153153
; CHECK-NEXT: call void @foo(i1 [[DOT02]])

0 commit comments

Comments
 (0)