diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -17218,6 +17218,10 @@ for (auto I2 = (*I)->use_begin(), E2 = (*I)->use_end(); I2 != E2; ++I2) TryToAddCandidate(I2); } + // Check stores that depend on the root (e.g. Store 3 in the chart above). + if (I.getOperandNo() == 0 && isa(*I)) { + TryToAddCandidate(I); + } } } else { for (auto I = RootNode->use_begin(), E = RootNode->use_end(); diff --git a/llvm/test/CodeGen/X86/MergeConsecutiveStores.ll b/llvm/test/CodeGen/X86/MergeConsecutiveStores.ll --- a/llvm/test/CodeGen/X86/MergeConsecutiveStores.ll +++ b/llvm/test/CodeGen/X86/MergeConsecutiveStores.ll @@ -920,3 +920,16 @@ ret void } +define i32 @merge_store_load_store_seq(i32* nocapture %buff) { +entry: +; CHECK-LABEL: merge_store_load_store_seq: +; CHECK: movl 4(%rdi), %eax +; CHECK-NEXT: movq $0, (%rdi) +; CHECK-NEXT: retq + + store i32 0, i32* %buff, align 4 + %arrayidx1 = getelementptr inbounds i32, i32* %buff, i64 1 + %0 = load i32, i32* %arrayidx1, align 4 + store i32 0, i32* %arrayidx1, align 4 + ret i32 %0 +}