Skip to content

Commit 57ae9bb

Browse files
committed
[LSR] Preserve MSSA when using SplitCriticalEdge.
LSR claims to MemorySSA, but we also have to make sure it is preserved when splitting critical edges. This can be done by passing MSSAU to SplitCriticalEdge. Fixes PR47557.
1 parent 4eae6fc commit 57ae9bb

File tree

2 files changed

+51
-4
lines changed

2 files changed

+51
-4
lines changed

llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5382,10 +5382,11 @@ void LSRInstance::RewriteForPHI(
53825382
// Split the critical edge.
53835383
BasicBlock *NewBB = nullptr;
53845384
if (!Parent->isLandingPad()) {
5385-
NewBB = SplitCriticalEdge(BB, Parent,
5386-
CriticalEdgeSplittingOptions(&DT, &LI)
5387-
.setMergeIdenticalEdges()
5388-
.setKeepOneInputPHIs());
5385+
NewBB =
5386+
SplitCriticalEdge(BB, Parent,
5387+
CriticalEdgeSplittingOptions(&DT, &LI, MSSAU)
5388+
.setMergeIdenticalEdges()
5389+
.setKeepOneInputPHIs());
53895390
} else {
53905391
SmallVector<BasicBlock*, 2> NewBBs;
53915392
SplitLandingPadPredecessors(Parent, BB, "", "", NewBBs, &DT, &LI);
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
; RUN: opt -loop-unswitch -loop-reduce -loop-simplifycfg -verify-memoryssa -S %s | FileCheck %s
2+
3+
; TODO: also run with NPM, but currently LSR does not preserve LCSSA, causing a verification failure on the test.
4+
; opt -passes='loop-mssa(unswitch<nontrivial>,loop-reduce,simplify-cfg)' -verify-memoryssa -S %s | FileCheck %s
5+
6+
; Test case for PR47557.
7+
8+
; REQUIRES: x86-registered-target
9+
10+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
11+
target triple = "x86_64-unknown-linux-gnu"
12+
13+
@a = external global i32, align 4
14+
@c = external global [1 x i32], align 4
15+
16+
define i32* @test() {
17+
; CHECK-LABEL: @test
18+
;
19+
entry: ; preds = %entry
20+
br label %for.cond
21+
22+
for.cond: ; preds = %cleanup, %entry
23+
%storemerge = phi i64 [ 0, %entry ], [ %inc7, %cleanup ]
24+
br label %for.cond2.1
25+
26+
for.body3: ; preds = %for.cond2.2, %for.cond2.1
27+
%arrayidx = getelementptr inbounds [1 x i32], [1 x i32]* @c, i64 0, i64 %storemerge
28+
ret i32* %arrayidx
29+
30+
cleanup: ; preds = %for.end5, %if.then
31+
%inc7 = add nsw i64 %storemerge, 1
32+
br label %for.cond
33+
34+
for.cond2.1: ; preds = %for.cond
35+
br i1 true, label %for.inc.1, label %for.body3
36+
37+
for.inc.1: ; preds = %for.end.1
38+
br i1 false, label %for.body.2, label %cleanup
39+
40+
for.body.2: ; preds = %for.inc.1
41+
store i32 0, i32* @a, align 4
42+
br label %for.cond2.2
43+
44+
for.cond2.2: ; preds = %for.body.2
45+
br i1 true, label %cleanup, label %for.body3
46+
}

0 commit comments

Comments
 (0)