From: Sebastian Pop Date: Thu, 4 Aug 2016 23:49:05 +0000 (+0000) Subject: GVN-hoist: fix early exit logic X-Git-Tag: llvmorg-4.0.0-rc1~13278 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=429740a6c257fd395d99d46ba4598e18c4839d2a;p=platform%2Fupstream%2Fllvm.git GVN-hoist: fix early exit logic The patch splits a complex && if condition into easier to read and understand logic. That wrong early exit condition was letting some instructions with not all operands available pass through when HoistingGeps was true. Differential Revision: https://reviews.llvm.org/D23174 llvm-svn: 277785 --- diff --git a/llvm/lib/Transforms/Scalar/GVNHoist.cpp b/llvm/lib/Transforms/Scalar/GVNHoist.cpp index 171a8ed..c734dfc 100644 --- a/llvm/lib/Transforms/Scalar/GVNHoist.cpp +++ b/llvm/lib/Transforms/Scalar/GVNHoist.cpp @@ -750,12 +750,19 @@ private: Repl = InstructionsToHoist.front(); // We can move Repl in HoistPt only when all operands are available. - // When not HoistingGeps we need to copy the GEPs now. // The order in which hoistings are done may influence the availability // of operands. - if (!allOperandsAvailable(Repl, HoistPt) && !HoistingGeps && - !makeGepOperandsAvailable(Repl, HoistPt, InstructionsToHoist)) - continue; + if (!allOperandsAvailable(Repl, HoistPt)) { + + // When HoistingGeps there is nothing more we can do to make the + // operands available: just continue. + if (HoistingGeps) + continue; + + // When not HoistingGeps we need to copy the GEPs. + if (!makeGepOperandsAvailable(Repl, HoistPt, InstructionsToHoist)) + continue; + } // Move the instruction at the end of HoistPt. Instruction *Last = HoistPt->getTerminator(); diff --git a/llvm/test/Transforms/GVN/hoist-call.ll b/llvm/test/Transforms/GVN/hoist-call.ll new file mode 100644 index 0000000..50378f7 --- /dev/null +++ b/llvm/test/Transforms/GVN/hoist-call.ll @@ -0,0 +1,28 @@ +; RUN: opt -S -gvn-hoist < %s | FileCheck %s + +; Check that the call and fcmp are hoisted. +; CHECK-LABEL: define void @fun( +; CHECK: call float +; CHECK: fcmp oeq +; CHECK-NOT: call float +; CHECK-NOT: fcmp oeq + +define void @fun(float %__b) minsize { +entry: + br label %if.then + +if.then: ; preds = %entry + br i1 undef, label %if.then8, label %lor.lhs.false + +lor.lhs.false: ; preds = %if.then + %0 = call float @llvm.fabs.f32(float %__b) #2 + %cmpinf7 = fcmp oeq float %0, 0x7FF0000000000000 + unreachable + +if.then8: ; preds = %if.then + %1 = call float @llvm.fabs.f32(float %__b) #2 + %cmpinf10 = fcmp oeq float %1, 0x7FF0000000000000 + ret void +} + +declare float @llvm.fabs.f32(float) diff --git a/llvm/test/Transforms/GVN/hoist-recursive-geps.ll b/llvm/test/Transforms/GVN/hoist-recursive-geps.ll index 9aa509b..76bc7c2 100644 --- a/llvm/test/Transforms/GVN/hoist-recursive-geps.ll +++ b/llvm/test/Transforms/GVN/hoist-recursive-geps.ll @@ -100,4 +100,4 @@ define zeroext i1 @fun(%2*, %12* dereferenceable(56), double*, %13*) { %53 = load double, double* %9, align 8 %54 = fcmp olt double %52, %53 ret i1 %54 -} \ No newline at end of file +} diff --git a/llvm/test/Transforms/GVN/hoist.ll b/llvm/test/Transforms/GVN/hoist.ll index 0122bc4..8e18941 100644 --- a/llvm/test/Transforms/GVN/hoist.ll +++ b/llvm/test/Transforms/GVN/hoist.ll @@ -223,10 +223,10 @@ if.end: ; Check that all independent expressions are hoisted. ; CHECK-LABEL: @independentScalarsHoisting -; CHECK: fadd ; CHECK: fsub ; CHECK: fdiv ; CHECK: fmul +; CHECK: fadd ; CHECK-NOT: fsub ; CHECK-NOT: fdiv ; CHECK-NOT: fmul