Skip to content

Commit b49b9f8

Browse files
committed
Fix 69211
1 parent 34d381f commit b49b9f8

File tree

4 files changed

+141
-14
lines changed

4 files changed

+141
-14
lines changed

llvm/lib/Transforms/Scalar/NewGVN.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3847,7 +3847,10 @@ Value *NewGVN::findPHIOfOpsLeader(const Expression *E,
38473847
// Anything that isn't an instruction is always available.
38483848
if (!MemberInst)
38493849
return Member;
3850-
if (DT->dominates(getBlockForValue(MemberInst), BB))
3850+
// Cannot use something that appears later in the iteration,
3851+
// as it may introduce a cyclic dependency.
3852+
if (DT->dominates(getBlockForValue(MemberInst), BB) &&
3853+
InstrToDFSNum(MemberInst) <= InstrToDFSNum(OrigInst))
38513854
return Member;
38523855
}
38533856
return nullptr;

llvm/test/Transforms/NewGVN/completeness.ll

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -227,17 +227,17 @@ define i64 @test5(i64 %arg) {
227227
; CHECK: bb14:
228228
; CHECK-NEXT: br label [[BB15:%.*]]
229229
; CHECK: bb15:
230-
; CHECK-NEXT: [[PHIOFOPS:%.*]] = phi i64 [ [[TMP12]], [[BB14]] ], [ [[TMP25:%.*]], [[BB15]] ]
231230
; CHECK-NEXT: [[TMP16:%.*]] = phi i64 [ [[TMP24:%.*]], [[BB15]] ], [ [[TMP11]], [[BB14]] ]
232231
; CHECK-NEXT: [[TMP17:%.*]] = phi i64 [ [[TMP22:%.*]], [[BB15]] ], [ [[TMP10]], [[BB14]] ]
233232
; CHECK-NEXT: [[TMP18:%.*]] = phi i64 [ [[TMP20:%.*]], [[BB15]] ], [ 0, [[BB14]] ]
234-
; CHECK-NEXT: store i64 [[PHIOFOPS]], ptr [[TMP]], align 8
233+
; CHECK-NEXT: [[TMP19:%.*]] = mul nsw i64 [[TMP16]], [[TMP17]]
234+
; CHECK-NEXT: store i64 [[TMP19]], ptr [[TMP]], align 8
235235
; CHECK-NEXT: [[TMP20]] = add nuw nsw i64 [[TMP18]], 1
236236
; CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds [100 x i64], ptr @global, i64 0, i64 [[TMP20]]
237237
; CHECK-NEXT: [[TMP22]] = load i64, ptr [[TMP21]], align 8
238238
; CHECK-NEXT: [[TMP23:%.*]] = getelementptr inbounds [100 x i64], ptr @global.1, i64 0, i64 [[TMP20]]
239239
; CHECK-NEXT: [[TMP24]] = load i64, ptr [[TMP23]], align 8
240-
; CHECK-NEXT: [[TMP25]] = mul nsw i64 [[TMP24]], [[TMP22]]
240+
; CHECK-NEXT: [[TMP25:%.*]] = mul nsw i64 [[TMP24]], [[TMP22]]
241241
; CHECK-NEXT: [[TMP26:%.*]] = icmp eq i64 [[TMP20]], [[TMP25]]
242242
; CHECK-NEXT: br i1 [[TMP26]], label [[BB4:%.*]], label [[BB15]]
243243
; CHECK: bb27:
@@ -384,8 +384,10 @@ bb1: ; preds = %bb1, %bb
384384
}
385385

386386

387-
;; Make sure we handle the case where we later come up with an expression that we need
388-
;; for a phi of ops.
387+
;; Handling the case where an expression from a previous iteration is
388+
;; needed for a phi of ops is tricky, as this expression might depend
389+
;; on the instruction for which we are creating the phi of ops,
390+
;; potentially creating a cyclic dependency. (See PR69211)
389391
define void @test9(i1 %arg) {
390392
; CHECK-LABEL: @test9(
391393
; CHECK-NEXT: bb:
@@ -395,10 +397,10 @@ define void @test9(i1 %arg) {
395397
; CHECK: bb2:
396398
; CHECK-NEXT: br label [[BB6:%.*]]
397399
; CHECK: bb6:
398-
; CHECK-NEXT: [[PHIOFOPS:%.*]] = phi i32 [ -13, [[BB2]] ], [ [[TMP11:%.*]], [[BB6]] ]
399400
; CHECK-NEXT: [[TMP7:%.*]] = phi i32 [ 1, [[BB2]] ], [ [[TMP8:%.*]], [[BB6]] ]
400401
; CHECK-NEXT: [[TMP8]] = add nuw nsw i32 [[TMP7]], 1
401-
; CHECK-NEXT: [[TMP11]] = add i32 -14, [[TMP8]]
402+
; CHECK-NEXT: [[TMP9:%.*]] = add i32 -14, [[TMP7]]
403+
; CHECK-NEXT: [[TMP11:%.*]] = add i32 -14, [[TMP8]]
402404
; CHECK-NEXT: br label [[BB6]]
403405
;
404406
bb:
@@ -566,13 +568,13 @@ define void @test13() {
566568
; CHECK-NEXT: [[TMP:%.*]] = load i8, ptr null, align 1
567569
; CHECK-NEXT: br label [[BB3:%.*]]
568570
; CHECK: bb3:
569-
; CHECK-NEXT: [[PHIOFOPS:%.*]] = phi i8 [ [[TMP]], [[BB1]] ], [ [[TMP10:%.*]], [[BB3]] ]
570571
; CHECK-NEXT: [[TMP4:%.*]] = phi ptr [ null, [[BB1]] ], [ [[TMP6:%.*]], [[BB3]] ]
571572
; CHECK-NEXT: [[TMP5:%.*]] = phi i32 [ undef, [[BB1]] ], [ [[TMP9:%.*]], [[BB3]] ]
572573
; CHECK-NEXT: [[TMP6]] = getelementptr i8, ptr [[TMP4]], i64 1
573-
; CHECK-NEXT: [[TMP8:%.*]] = sext i8 [[PHIOFOPS]] to i32
574+
; CHECK-NEXT: [[TMP7:%.*]] = load i8, ptr [[TMP4]], align 1
575+
; CHECK-NEXT: [[TMP8:%.*]] = sext i8 [[TMP7]] to i32
574576
; CHECK-NEXT: [[TMP9]] = mul i32 [[TMP5]], [[TMP8]]
575-
; CHECK-NEXT: [[TMP10]] = load i8, ptr [[TMP6]], align 1
577+
; CHECK-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP6]], align 1
576578
; CHECK-NEXT: [[TMP11:%.*]] = icmp eq i8 [[TMP10]], 0
577579
; CHECK-NEXT: br i1 [[TMP11]], label [[BB12:%.*]], label [[BB3]]
578580
; CHECK: bb12:

llvm/test/Transforms/NewGVN/pr33461.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@ define void @patatino() {
88
; CHECK-NEXT: entry:
99
; CHECK-NEXT: br i1 false, label [[FOR_COND1:%.*]], label [[FOR_INC:%.*]]
1010
; CHECK: for.cond1:
11-
; CHECK-NEXT: [[PHIOFOPS:%.*]] = phi i16 [ poison, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_INC]] ]
12-
; CHECK-NEXT: store i16 [[PHIOFOPS]], ptr @b, align 2
11+
; CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr @b, align 2
1312
; CHECK-NEXT: br label [[FOR_INC]]
1413
; CHECK: for.inc:
1514
; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr @b, align 2
16-
; CHECK-NEXT: [[INC]] = add i16 [[TMP0]], 1
15+
; CHECK-NEXT: [[INC:%.*]] = add i16 [[TMP0]], 1
1716
; CHECK-NEXT: store i16 [[INC]], ptr @b, align 2
1817
; CHECK-NEXT: br label [[FOR_COND1]]
1918
;
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -passes=newgvn -S < %s | FileCheck %s
3+
4+
define i64 @snork() {
5+
; CHECK-LABEL: define i64 @snork() {
6+
; CHECK-NEXT: [[BB:.*]]:
7+
; CHECK-NEXT: br label %[[BB1:.*]]
8+
; CHECK: [[BB1]]:
9+
; CHECK-NEXT: [[PHI:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[ADD:%.*]], %[[BB1]] ]
10+
; CHECK-NEXT: [[ADD]] = add i64 [[PHI]], 1
11+
; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[ADD]], 1
12+
; CHECK-NEXT: [[ICMP:%.*]] = icmp slt i64 [[ADD]], 100
13+
; CHECK-NEXT: br i1 [[ICMP]], label %[[BB1]], label %[[BB4:.*]]
14+
; CHECK: [[BB4]]:
15+
; CHECK-NEXT: ret i64 [[ADD2]]
16+
;
17+
bb:
18+
br label %bb1
19+
20+
bb1:
21+
%phi = phi i64 [ 0, %bb ], [ %add3, %bb1 ]
22+
%add = add i64 %phi, 1
23+
%add2 = add i64 %add, 1
24+
%add3 = add i64 %phi, 1
25+
%icmp = icmp slt i64 %add3, 100
26+
br i1 %icmp, label %bb1, label %bb4
27+
28+
bb4:
29+
ret i64 %add2
30+
}
31+
32+
define i64 @wobble() {
33+
; CHECK-LABEL: define i64 @wobble() {
34+
; CHECK-NEXT: [[BB:.*]]:
35+
; CHECK-NEXT: br label %[[BB1:.*]]
36+
; CHECK: [[BB1]]:
37+
; CHECK-NEXT: [[PHI:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[ADD:%.*]], %[[BB1]] ]
38+
; CHECK-NEXT: [[ADD]] = add i64 [[PHI]], 1
39+
; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[ADD]], 1
40+
; CHECK-NEXT: [[ADD4:%.*]] = add i64 [[ADD2]], 1
41+
; CHECK-NEXT: [[ICMP:%.*]] = icmp slt i64 [[ADD]], 100
42+
; CHECK-NEXT: br i1 [[ICMP]], label %[[BB1]], label %[[BB6:.*]]
43+
; CHECK: [[BB6]]:
44+
; CHECK-NEXT: ret i64 [[ADD4]]
45+
;
46+
bb:
47+
br label %bb1
48+
49+
bb1:
50+
%phi = phi i64 [ 0, %bb ], [ %add5, %bb1 ]
51+
%add = add i64 %phi, 1
52+
%add2 = add i64 %add, 1
53+
%add3 = add i64 %add, 1
54+
%add4 = add i64 %add2, 1
55+
%add5 = add i64 %phi, 1
56+
%icmp = icmp slt i64 %add5, 100
57+
br i1 %icmp, label %bb1, label %bb6
58+
59+
bb6:
60+
ret i64 %add4
61+
}
62+
63+
define i64 @wobble.1(i64 %arg) {
64+
; CHECK-LABEL: define i64 @wobble.1(
65+
; CHECK-SAME: i64 [[ARG:%.*]]) {
66+
; CHECK-NEXT: [[BB:.*]]:
67+
; CHECK-NEXT: br label %[[BB1:.*]]
68+
; CHECK: [[BB1]]:
69+
; CHECK-NEXT: [[PHI:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[ADD:%.*]], %[[BB1]] ]
70+
; CHECK-NEXT: [[ADD]] = add i64 [[PHI]], 1
71+
; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[ADD]], 1
72+
; CHECK-NEXT: [[ICMP:%.*]] = icmp slt i64 [[ADD]], 100
73+
; CHECK-NEXT: br i1 [[ICMP]], label %[[BB1]], label %[[BB5:.*]]
74+
; CHECK: [[BB5]]:
75+
; CHECK-NEXT: ret i64 [[ADD2]]
76+
;
77+
bb:
78+
br label %bb1
79+
80+
bb1:
81+
%phi = phi i64 [ 0, %bb ], [ %add4, %bb1 ]
82+
%add = add i64 %phi, 1
83+
%add2 = add i64 %add, 1
84+
%sub = sub i64 %add2, 1
85+
%add3 = add i64 %sub, 1
86+
%add4 = add i64 %phi, 1
87+
%icmp = icmp slt i64 %add4, 100
88+
br i1 %icmp, label %bb1, label %bb5
89+
90+
bb5:
91+
ret i64 %add3
92+
}
93+
94+
define i64 @pluto(i64 %arg) {
95+
; CHECK-LABEL: define i64 @pluto(
96+
; CHECK-SAME: i64 [[ARG:%.*]]) {
97+
; CHECK-NEXT: [[BB:.*]]:
98+
; CHECK-NEXT: br label %[[BB1:.*]]
99+
; CHECK: [[BB1]]:
100+
; CHECK-NEXT: [[PHI:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[ADD:%.*]], %[[BB1]] ]
101+
; CHECK-NEXT: [[ADD]] = add i64 [[PHI]], 1
102+
; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[ADD]], 1
103+
; CHECK-NEXT: [[ICMP:%.*]] = icmp slt i64 [[ADD]], 100
104+
; CHECK-NEXT: br i1 [[ICMP]], label %[[BB1]], label %[[BB5:.*]]
105+
; CHECK: [[BB5]]:
106+
; CHECK-NEXT: ret i64 [[ADD2]]
107+
;
108+
bb:
109+
br label %bb1
110+
111+
bb1:
112+
%phi = phi i64 [ 0, %bb ], [ %add4, %bb1 ]
113+
%add = add i64 %phi, 1
114+
%add2 = add i64 %add, 1
115+
%sub = sub i64 %add2, 1
116+
%add3 = add i64 %sub, 1
117+
%add4 = add i64 %phi, 1
118+
%icmp = icmp slt i64 %add4, 100
119+
br i1 %icmp, label %bb1, label %bb5
120+
121+
bb5:
122+
ret i64 %add3
123+
}

0 commit comments

Comments
 (0)