Index: llvm/lib/Transforms/Scalar/MergeICmps.cpp =================================================================== --- llvm/lib/Transforms/Scalar/MergeICmps.cpp +++ llvm/lib/Transforms/Scalar/MergeICmps.cpp @@ -248,9 +248,9 @@ bool BCECmpBlock::canSinkBCECmpInst(const Instruction *Inst, DenseSet &BlockInsts, AliasAnalysis &AA) const { - // If this instruction has side effects and its in middle of the BCE cmp block - // instructions, then bail for now. - if (Inst->mayHaveSideEffects()) { + // If this instruction may clobber the loads and is in middle of the BCE cmp + // block instructions, then bail for now. + if (Inst->mayWriteToMemory()) { // Bail if this is not a simple load or store if (!isSimpleLoadOrStore(Inst)) return false; Index: llvm/test/Transforms/MergeICmps/X86/split-block-does-work.ll =================================================================== --- llvm/test/Transforms/MergeICmps/X86/split-block-does-work.ll +++ llvm/test/Transforms/MergeICmps/X86/split-block-does-work.ll @@ -3,7 +3,7 @@ %S = type { i32, i32, i32, i32 } -declare void @foo(...) nounwind readnone +declare void @foo(...) readonly ; We can split %entry and create a memcmp(16 bytes). define zeroext i1 @opeq1(