Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -23518,6 +23518,10 @@ /// LEA + SHL, LEA + LEA. static SDValue PerformMulCombine(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI) { + // An imul is usually smaller than the alternative sequence + if (DAG.getMachineFunction().getFunction()->optForMinSize()) + return SDValue(); + if (DCI.isBeforeLegalize() || DCI.isCalledByLegalizer()) return SDValue(); Index: test/CodeGen/X86/imul.ll =================================================================== --- test/CodeGen/X86/imul.ll +++ test/CodeGen/X86/imul.ll @@ -108,3 +108,21 @@ %mul = mul i64 %A, 40 ret i64 %mul } + +define i32 @mul4_32_minsize(i32 %A) minsize { +; X64-LABEL: mul4_32_minsize: +; X64: leal +; X86-LABEL: mul4_32_minsize: +; X86: shll + %mul = mul i32 %A, 4 + ret i32 %mul +} + +define i32 @mul40_32_minsize(i32 %A) minsize { +; X64-LABEL: mul40_32_minsize: +; X64: imull +; X86-LABEL: mul40_32_minsize: +; X86: imull + %mul = mul i32 %A, 40 + ret i32 %mul +}