Index: llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp =================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp +++ llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -120,6 +120,10 @@ "Controls which instructions are visited"); static cl::opt +EnableCodeSinking("instcombine-code-sinking", cl::desc("Enable code sinking"), + cl::init(true)); + +static cl::opt EnableExpensiveCombines("expensive-combines", cl::desc("Enable expensive instruction combines")); @@ -3103,7 +3107,7 @@ } // See if we can trivially sink this instruction to a successor basic block. - if (I->hasOneUse()) { + if (EnableCodeSinking && I->hasOneUse()) { BasicBlock *BB = I->getParent(); Instruction *UserInst = cast(*I->user_begin()); BasicBlock *UserParent; Index: llvm/trunk/test/Transforms/InstCombine/no_sink_instruction.ll =================================================================== --- llvm/trunk/test/Transforms/InstCombine/no_sink_instruction.ll +++ llvm/trunk/test/Transforms/InstCombine/no_sink_instruction.ll @@ -0,0 +1,19 @@ +; RUN: opt -instcombine -instcombine-code-sinking=0 -S < %s | FileCheck %s + +define i32 @test(i1 %C, i32 %A, i32 %B) { +; CHECK-LABEL: @test( +; CHECK: sdiv i32 +; CHECK-NEXT: add i32 +entry: + %tmp.2 = sdiv i32 %A, %B ; [#uses=1] + %tmp.9 = add i32 %B, %A ; [#uses=1] + br i1 %C, label %then, label %endif + +then: ; preds = %entry +; CHECK: ret i32 + ret i32 %tmp.9 + +endif: ; preds = %entry +; CHECK: ret i32 + ret i32 %tmp.2 +}