[PATCH] D41453: [GVNHoist] Fix: PR35222 gvn-hoist incorrectly erases load in case of a loop
Aditya Kumar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 3 23:48:46 PST 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rL321789: [GVNHoist] Fix: PR35222 gvn-hoist incorrectly erases load in case of a loop (authored by hiraditya, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D41453?vs=127738&id=128597#toc
Repository:
rL LLVM
https://reviews.llvm.org/D41453
Files:
llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp
llvm/trunk/test/Transforms/GVNHoist/pr35222-hoist-load.ll
Index: llvm/trunk/test/Transforms/GVNHoist/pr35222-hoist-load.ll
===================================================================
--- llvm/trunk/test/Transforms/GVNHoist/pr35222-hoist-load.ll
+++ llvm/trunk/test/Transforms/GVNHoist/pr35222-hoist-load.ll
@@ -1,4 +1,5 @@
; RUN: opt -S -gvn-hoist < %s | FileCheck %s
+; CHECK-LABEL: build_tree
; CHECK: load
; CHECK: load
; Check that the load is not hoisted because the call can potentially
@@ -23,3 +24,47 @@
}
declare i1 @pqdownheap(i32)
+
+ at i = external hidden unnamed_addr global i32, align 4
+ at j = external hidden unnamed_addr global [573 x i32], align 4
+ at v = external global i1
+
+; CHECK-LABEL: test
+; CHECK-LABEL: do.end
+; CHECK: load
+; Check that the load is not hoisted because the call can potentially
+; modify the global
+
+define i32 @test() {
+entry:
+ br label %for.cond
+
+for.cond:
+ %a3 = load volatile i1, i1* @v
+ br i1 %a3, label %for.body, label %while.end
+
+for.body:
+ br label %if.then
+
+if.then:
+ %tmp4 = load i32, i32* @i, align 4
+ br label %for.cond
+
+while.end:
+ br label %do.body
+
+do.body:
+ %tmp9 = load i32, i32* getelementptr inbounds ([573 x i32], [573 x i32]* @j,
+i32 0, i32 1), align 4
+ %tmp10 = load i32, i32* @i, align 4
+ call void @fn()
+ %a1 = load volatile i1, i1* @v
+ br i1 %a1, label %do.body, label %do.end
+
+do.end:
+ %tmp20 = load i32, i32* getelementptr inbounds ([573 x i32], [573 x i32]* @j,
+i32 0, i32 1), align 4
+ ret i32 %tmp20
+}
+
+declare void @fn()
Index: llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp
===================================================================
--- llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp
+++ llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp
@@ -648,7 +648,7 @@
// track in a CHI. In the PDom walk, there can be values in the
// stack which are not control dependent e.g., nested loop.
if (si != RenameStack.end() && si->second.size() &&
- DT->dominates(Pred, si->second.back()->getParent())) {
+ DT->properlyDominates(Pred, si->second.back()->getParent())) {
C.Dest = BB; // Assign the edge
C.I = si->second.pop_back_val(); // Assign the argument
DEBUG(dbgs() << "\nCHI Inserted in BB: " << C.Dest->getName()
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D41453.128597.patch
Type: text/x-patch
Size: 2306 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180104/8aa012ec/attachment.bin>
More information about the llvm-commits
mailing list