From 8a358825db556d886be5d113532205e2f815e05a Mon Sep 17 00:00:00 2001 From: Geoff Berry Date: Thu, 13 Apr 2017 15:36:25 +0000 Subject: [PATCH] Re-apply "[GVNHoist] Move GVNHoist to function simplification part of pipeline." This reverts commit r296872 now that PR32153 has been fixed. llvm-svn: 300200 --- lib/Transforms/IPO/PassManagerBuilder.cpp | 4 +-- test/Transforms/GVNHoist/hoist-inline.ll | 38 +++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 test/Transforms/GVNHoist/hoist-inline.ll diff --git a/lib/Transforms/IPO/PassManagerBuilder.cpp b/lib/Transforms/IPO/PassManagerBuilder.cpp index 6cc6d3b63f4..f11b58d1adc 100644 --- a/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -245,8 +245,6 @@ void PassManagerBuilder::populateFunctionPassManager( FPM.add(createCFGSimplificationPass()); FPM.add(createSROAPass()); FPM.add(createEarlyCSEPass()); - if (EnableGVNHoist) - FPM.add(createGVNHoistPass()); FPM.add(createLowerExpectIntrinsicPass()); } @@ -291,6 +289,8 @@ void PassManagerBuilder::addFunctionSimplificationPasses( // Break up aggregate allocas, using SSAUpdater. MPM.add(createSROAPass()); MPM.add(createEarlyCSEPass()); // Catch trivial redundancies + if (EnableGVNHoist) + MPM.add(createGVNHoistPass()); // Speculative execution if the target has divergent branches; otherwise nop. MPM.add(createSpeculativeExecutionIfHasBranchDivergencePass()); MPM.add(createJumpThreadingPass()); // Thread jumps. diff --git a/test/Transforms/GVNHoist/hoist-inline.ll b/test/Transforms/GVNHoist/hoist-inline.ll new file mode 100644 index 00000000000..7d761486ab1 --- /dev/null +++ b/test/Transforms/GVNHoist/hoist-inline.ll @@ -0,0 +1,38 @@ +; RUN: opt -S -O2 < %s | FileCheck %s + +; Check that the inlined loads are hoisted. +; CHECK-LABEL: define i32 @fun( +; CHECK-LABEL: entry: +; CHECK: load i32, i32* @A +; CHECK: if.then: + +@A = external global i32 +@B = external global i32 +@C = external global i32 + +define i32 @loadA() { + %a = load i32, i32* @A + ret i32 %a +} + +define i32 @fun(i1 %c) { +entry: + br i1 %c, label %if.then, label %if.else + +if.then: + store i32 1, i32* @B + %call1 = call i32 @loadA() + store i32 2, i32* @C + br label %if.endif + +if.else: + store i32 2, i32* @C + %call2 = call i32 @loadA() + store i32 1, i32* @B + br label %if.endif + +if.endif: + %ret = phi i32 [ %call1, %if.then ], [ %call2, %if.else ] + ret i32 %ret +} +