Index: lib/Transforms/Scalar/GVNHoist.cpp =================================================================== --- lib/Transforms/Scalar/GVNHoist.cpp +++ 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(); @@ -885,7 +892,10 @@ // that could result in spills later. geps are handled separately. // TODO: We can relax this for targets like AArch64 as they have more // registers than X86. - II.insert(&I1, VN); + + // Also do not bother analyzing the following kinds of instructions. + if (!isa(&I1)) + II.insert(&I1, VN); } } Index: test/Transforms/GVN/hoist-call.ll =================================================================== --- /dev/null +++ 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: test/Transforms/GVN/hoist-recursive-geps.ll =================================================================== --- test/Transforms/GVN/hoist-recursive-geps.ll +++ test/Transforms/GVN/hoist-recursive-geps.ll @@ -8,9 +8,9 @@ ; CHECK: load ; CHECK: load ; CHECK: fsub -; CHECK: fmul ; CHECK: fsub ; CHECK: fmul +; CHECK: fmul ; CHECK-NOT: fsub ; CHECK-NOT: fmul @@ -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: test/Transforms/GVN/hoist.ll =================================================================== --- test/Transforms/GVN/hoist.ll +++ 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