[llvm] r249187 - [WebAssembly] Fix CFG stackification of nested loops.
Dan Gohman via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 2 14:11:36 PDT 2015
Author: djg
Date: Fri Oct 2 16:11:36 2015
New Revision: 249187
URL: http://llvm.org/viewvc/llvm-project?rev=249187&view=rev
Log:
[WebAssembly] Fix CFG stackification of nested loops.
Modified:
llvm/trunk/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify.ll
Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp?rev=249187&r1=249186&r2=249187&view=diff
==============================================================================
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp (original)
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp Fri Oct 2 16:11:36 2015
@@ -194,8 +194,10 @@ static void SortBlocks(MachineFunction &
if (MachineLoop *Loop = MLI.getLoopFor(&MBB)) {
// Assert that loops are contiguous.
assert(Loop->getHeader() == Loop->getTopBlock());
- assert(Loop->getHeader() == &MBB ||
- MLI.getLoopFor(prev(MachineFunction::iterator(&MBB))) == Loop);
+ assert((Loop->getHeader() == &MBB ||
+ Loop->contains(
+ MLI.getLoopFor(prev(MachineFunction::iterator(&MBB))))) &&
+ "Loop isn't contiguous");
} else {
// Assert that non-loops have no backedge predecessors.
for (auto Pred : MBB.predecessors())
@@ -245,9 +247,18 @@ static void PlaceMarkers(MachineFunction
for (auto &MBB : MF) {
// Place the LOOP for loops.
if (MachineLoop *Loop = MLI.getLoopFor(&MBB))
- if (Loop->getHeader() == &MBB)
+ if (Loop->getHeader() == &MBB) {
+ // The operand of a LOOP is the first block after the loop. If the loop
+ // is the bottom of the function, insert a dummy block at the end.
+ MachineBasicBlock *Bottom = Loop->getBottomBlock();
+ auto Iter = next(MachineFunction::iterator(Bottom));
+ if (Iter == MF.end()) {
+ MF.push_back(MF.CreateMachineBasicBlock());
+ Iter = next(MachineFunction::iterator(Bottom));
+ }
BuildMI(MBB, MBB.begin(), DebugLoc(), TII.get(WebAssembly::LOOP))
- .addMBB(Loop->getBottomBlock());
+ .addMBB(Iter);
+ }
// Check for forward branches and switches that need BLOCKS placed.
for (auto &Term : MBB.terminators())
Modified: llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify.ll?rev=249187&r1=249186&r2=249187&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify.ll (original)
+++ llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify.ll Fri Oct 2 16:11:36 2015
@@ -272,3 +272,33 @@ exit:
store volatile i32 4, i32* %p
ret i32 0
}
+
+; Test that nested loops are handled.
+
+declare void @bar()
+
+define void @test3(i32 %w) {
+entry:
+ br i1 undef, label %outer.ph, label %exit
+
+outer.ph:
+ br label %outer
+
+outer:
+ %tobool = icmp eq i32 undef, 0
+ br i1 %tobool, label %inner, label %unreachable
+
+unreachable:
+ unreachable
+
+inner:
+ %c = icmp eq i32 undef, %w
+ br i1 %c, label %if.end, label %inner
+
+exit:
+ ret void
+
+if.end:
+ call void @bar()
+ br label %outer
+}
More information about the llvm-commits
mailing list