Index: lib/Transforms/Scalar/GVNHoist.cpp =================================================================== --- lib/Transforms/Scalar/GVNHoist.cpp +++ 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() Index: test/Transforms/GVNHoist/pr35222-hoist-load.ll =================================================================== --- test/Transforms/GVNHoist/pr35222-hoist-load.ll +++ 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) + +@i = external hidden unnamed_addr global i32, align 4 +@j = external hidden unnamed_addr global [573 x i32], align 4 +@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()