Skip to content

Commit

Permalink
[DAGCombine] Fix multi-use miscompile in load combine
Browse files Browse the repository at this point in the history
The load combine replaces a number of original loads with one new
loads and also replaces the output chains of the original loads
with the output chain of the new load. This is incorrect if the
original load is retained (due to multi-use), as it may get
incorrectly reordered.

Fix this by using makeEquivalentMemoryOrdering() instead, which
will create a TokenFactor with both chains.
  • Loading branch information
nikic committed Feb 13, 2024
1 parent f0db35b commit 98359f2
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 3 deletions.
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9252,7 +9252,7 @@ SDValue DAGCombiner::MatchLoadCombine(SDNode *N) {

// Transfer chain users from old loads to the new load.
for (LoadSDNode *L : Loads)
DAG.ReplaceAllUsesOfValueWith(SDValue(L, 1), SDValue(NewLoad.getNode(), 1));
DAG.makeEquivalentMemoryOrdering(L, NewLoad);

if (!NeedsBswap)
return NewLoad;
Expand Down
3 changes: 1 addition & 2 deletions llvm/test/CodeGen/X86/load-combine.ll
Original file line number Diff line number Diff line change
Expand Up @@ -1283,7 +1283,6 @@ define i32 @zext_load_i32_by_i8_bswap_shl_16(ptr %arg) {
ret i32 %tmp8
}

; FIXME: This is a miscompile.
define i32 @pr80911_vector_load_multiuse(ptr %ptr, ptr %clobber) nounwind {
; CHECK-LABEL: pr80911_vector_load_multiuse:
; CHECK: # %bb.0:
Expand All @@ -1299,9 +1298,9 @@ define i32 @pr80911_vector_load_multiuse(ptr %ptr, ptr %clobber) nounwind {
;
; CHECK64-LABEL: pr80911_vector_load_multiuse:
; CHECK64: # %bb.0:
; CHECK64-NEXT: movl (%rdi), %ecx
; CHECK64-NEXT: movzwl (%rdi), %eax
; CHECK64-NEXT: movl $0, (%rsi)
; CHECK64-NEXT: movl (%rdi), %ecx
; CHECK64-NEXT: movl %ecx, (%rdi)
; CHECK64-NEXT: retq
%load = load <4 x i8>, ptr %ptr, align 16
Expand Down

0 comments on commit 98359f2

Please sign in to comment.