forked from OSchip/llvm-project
[InstCombine] Do not combine atomic and non-atomic loads
Before this change, InstCombine was willing to fold atomic and non-atomic loads through a PHI node as long as the first PHI argument is not an atomic load. The combined load would be non-atomic, which is incorrect. Fix this by only combining the loads in a PHI node when all of the arguments are non-atomic loads. Thanks to Eli Friedman for pointing out the bug at https://github.com/llvm/llvm-project/issues/50777#issuecomment-981045342! Fixes #50777 Differential Revision: https://reviews.llvm.org/D115113
This commit is contained in:
parent
de80b53d1a
commit
a2bb7313e6
|
@ -547,6 +547,31 @@ bb2: ; preds = %bb1, %entry
|
|||
ret i32 %res
|
||||
}
|
||||
|
||||
; FIXME: Atomic and non-atomic loads should not be combined.
|
||||
define i32 @PR51435(i32* %ptr, i32* %atomic_ptr, i1 %c) {
|
||||
; CHECK-LABEL: @PR51435(
|
||||
; CHECK: entry:
|
||||
; CHECK-NEXT: br i1 %c, label %if, label %end
|
||||
; CHECK: if:
|
||||
; CHECK-NEXT: [[ATOMIC:%.*]] = load atomic i32, i32* %atomic_ptr acquire, align 4
|
||||
; CHECK-NEXT: br label %end
|
||||
; CHECK: end:
|
||||
; CHECK-NEXT: [[COND_IN:%.*]] = phi i32* [ %ptr, %entry ], [ %atomic_ptr, %if ]
|
||||
; CHECK-NEXT: [[COND:%.*]] = load i32, i32* [[COND_IN]], align 4
|
||||
; CHECK-NEXT: ret i32 [[COND]]
|
||||
entry:
|
||||
%x = load i32, i32* %ptr, align 4
|
||||
br i1 %c, label %if, label %end
|
||||
|
||||
if:
|
||||
%y = load atomic i32, i32* %atomic_ptr acquire, align 4
|
||||
br label %end
|
||||
|
||||
end:
|
||||
%cond = phi i32 [ %x, %entry ], [ %y, %if ]
|
||||
ret i32 %cond
|
||||
}
|
||||
|
||||
define i1 @test18(i1 %cond) {
|
||||
; CHECK-LABEL: @test18(
|
||||
; CHECK-NEXT: br i1 [[COND:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
|
||||
|
|
Loading…
Reference in New Issue