Skip to content

Commit a0537fc

Browse files
committed
[SimplifyCFG] Fix crash in the EXPENSIVE_CHECKS build
SimplifyCFG was incorrectly reporting to the pass manager that it had not made changes after folding away a PHI. This is detected in the EXPENSIVE_CHECKS build when the function's hash changes. Differential Revision: https://reviews.llvm.org/D83985
1 parent 2dd9e43 commit a0537fc

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2404,19 +2404,21 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI,
24042404
int BudgetRemaining =
24052405
TwoEntryPHINodeFoldingThreshold * TargetTransformInfo::TCC_Basic;
24062406

2407+
bool Changed = false;
24072408
for (BasicBlock::iterator II = BB->begin(); isa<PHINode>(II);) {
24082409
PHINode *PN = cast<PHINode>(II++);
24092410
if (Value *V = SimplifyInstruction(PN, {DL, PN})) {
24102411
PN->replaceAllUsesWith(V);
24112412
PN->eraseFromParent();
2413+
Changed = true;
24122414
continue;
24132415
}
24142416

24152417
if (!DominatesMergePoint(PN->getIncomingValue(0), BB, AggressiveInsts,
24162418
BudgetRemaining, TTI) ||
24172419
!DominatesMergePoint(PN->getIncomingValue(1), BB, AggressiveInsts,
24182420
BudgetRemaining, TTI))
2419-
return false;
2421+
return Changed;
24202422
}
24212423

24222424
// If we folded the first phi, PN dangles at this point. Refresh it. If
@@ -2443,7 +2445,7 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI,
24432445
isa<BinaryOperator>(IfCond)) &&
24442446
!CanHoistNotFromBothValues(PN->getIncomingValue(0),
24452447
PN->getIncomingValue(1)))
2446-
return false;
2448+
return Changed;
24472449

24482450
// If all PHI nodes are promotable, check to make sure that all instructions
24492451
// in the predecessor blocks can be promoted as well. If not, we won't be able
@@ -2461,7 +2463,7 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI,
24612463
// This is not an aggressive instruction that we can promote.
24622464
// Because of this, we won't be able to get rid of the control flow, so
24632465
// the xform is not worth it.
2464-
return false;
2466+
return Changed;
24652467
}
24662468
}
24672469

@@ -2474,7 +2476,7 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI,
24742476
// This is not an aggressive instruction that we can promote.
24752477
// Because of this, we won't be able to get rid of the control flow, so
24762478
// the xform is not worth it.
2477-
return false;
2479+
return Changed;
24782480
}
24792481
}
24802482
assert(DomBlock && "Failed to find root DomBlock");
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -S -simplifycfg -debug-pass=Details 2>&1 | FileCheck %s
3+
4+
;; Check the report from the pass manager, telling us whether simplifycfg
5+
;; reported the "changed" status correctly:
6+
; CHECK: Made Modification 'Simplify the CFG' on Function 'wibble'...
7+
8+
declare i32 @blam(i8*, i32)
9+
10+
define i32 @wibble(i8* %arg, i8** %arg1) {
11+
; CHECK-LABEL: @wibble(
12+
; CHECK-NEXT: bb:
13+
; CHECK-NEXT: br label [[BB2:%.*]]
14+
; CHECK: bb2:
15+
; CHECK-NEXT: [[BORG:%.*]] = phi i32 [ 0, [[BB:%.*]] ], [ [[BORG]], [[BB8:%.*]] ]
16+
; CHECK-NEXT: [[BORG3:%.*]] = phi i32 [ 8, [[BB]] ], [ [[BORG10:%.*]], [[BB8]] ]
17+
; CHECK-NEXT: [[BORG4:%.*]] = tail call i32 @blam(i8* [[ARG:%.*]], i32 [[BORG]])
18+
; CHECK-NEXT: [[BORG5:%.*]] = icmp eq i32 [[BORG4]], 0
19+
; CHECK-NEXT: br i1 [[BORG5]], label [[BB8]], label [[BB6:%.*]]
20+
; CHECK: bb6:
21+
; CHECK-NEXT: [[BORG7:%.*]] = load i8*, i8** [[ARG1:%.*]], align 4
22+
; CHECK-NEXT: br label [[BB8]]
23+
; CHECK: bb8:
24+
; CHECK-NEXT: [[BORG10]] = phi i32 [ [[BORG4]], [[BB6]] ], [ [[BORG3]], [[BB2]] ]
25+
; CHECK-NEXT: [[BORG11:%.*]] = icmp ult i32 [[BORG]], 2
26+
; CHECK-NEXT: br i1 [[BORG11]], label [[BB2]], label [[BB12:%.*]]
27+
; CHECK: bb12:
28+
; CHECK-NEXT: ret i32 1
29+
;
30+
bb:
31+
br label %bb2
32+
33+
bb2: ; preds = %bb8, %bb
34+
%borg = phi i32 [ 0, %bb ], [ %borg9, %bb8 ]
35+
%borg3 = phi i32 [ 8, %bb ], [ %borg10, %bb8 ]
36+
%borg4 = tail call i32 @blam(i8* %arg, i32 %borg)
37+
%borg5 = icmp eq i32 %borg4, 0
38+
br i1 %borg5, label %bb8, label %bb6
39+
40+
bb6: ; preds = %bb2
41+
%borg7 = load i8*, i8** %arg1, align 4
42+
br label %bb8
43+
44+
bb8: ; preds = %bb6, %bb2
45+
%borg9 = phi i32 [ %borg, %bb6 ], [ %borg, %bb2 ]
46+
%borg10 = phi i32 [ %borg4, %bb6 ], [ %borg3, %bb2 ]
47+
%borg11 = icmp ult i32 %borg9, 2
48+
br i1 %borg11, label %bb2, label %bb12
49+
50+
bb12: ; preds = %bb8
51+
ret i32 1
52+
}

0 commit comments

Comments
 (0)