Index: llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp +++ llvm/trunk/lib/Transforms/Scalar/GVNHoist.cpp @@ -750,12 +750,19 @@ 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(); Index: llvm/trunk/test/Transforms/GVN/hoist-call.ll =================================================================== --- llvm/trunk/test/Transforms/GVN/hoist-call.ll +++ llvm/trunk/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) Index: llvm/trunk/test/Transforms/GVN/hoist-recursive-geps.ll =================================================================== --- llvm/trunk/test/Transforms/GVN/hoist-recursive-geps.ll +++ llvm/trunk/test/Transforms/GVN/hoist-recursive-geps.ll @@ -100,4 +100,4 @@ %53 = load double, double* %9, align 8 %54 = fcmp olt double %52, %53 ret i1 %54 -} \ No newline at end of file +} Index: llvm/trunk/test/Transforms/GVN/hoist.ll =================================================================== --- llvm/trunk/test/Transforms/GVN/hoist.ll +++ llvm/trunk/test/Transforms/GVN/hoist.ll @@ -223,10 +223,10 @@ ; 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