mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[Analysis] Fix isSafeToLoadUnconditionally handling of volatile.
A volatile operation cannot be used to prove an address points to normal memory. (LangRef was recently updated to state it explicitly.) Differential Revision: https://reviews.llvm.org/D57040 llvm-svn: 352109
This commit is contained in:
parent
45c98f5090
commit
d0caf58911
@ -280,9 +280,17 @@ bool llvm::isSafeToLoadUnconditionally(Value *V, unsigned Align,
|
||||
Value *AccessedPtr;
|
||||
unsigned AccessedAlign;
|
||||
if (LoadInst *LI = dyn_cast<LoadInst>(BBI)) {
|
||||
// Ignore volatile loads. The execution of a volatile load cannot
|
||||
// be used to prove an address is backed by regular memory; it can,
|
||||
// for example, point to an MMIO register.
|
||||
if (LI->isVolatile())
|
||||
continue;
|
||||
AccessedPtr = LI->getPointerOperand();
|
||||
AccessedAlign = LI->getAlignment();
|
||||
} else if (StoreInst *SI = dyn_cast<StoreInst>(BBI)) {
|
||||
// Ignore volatile stores (see comment for loads).
|
||||
if (SI->isVolatile())
|
||||
continue;
|
||||
AccessedPtr = SI->getPointerOperand();
|
||||
AccessedAlign = SI->getAlignment();
|
||||
} else
|
||||
|
@ -632,3 +632,15 @@ exit:
|
||||
%result = load i32, i32* %phi, align 4
|
||||
ret i32 %result
|
||||
}
|
||||
|
||||
; Don't speculate a load based on an earlier volatile operation.
|
||||
define i8 @volatile_select(i8* %p, i1 %b) {
|
||||
; CHECK-LABEL: @volatile_select(
|
||||
; CHECK: select i1 %b, i8* %p, i8* %p2
|
||||
%p2 = alloca i8
|
||||
store i8 0, i8* %p2
|
||||
store volatile i8 0, i8* %p
|
||||
%px = select i1 %b, i8* %p, i8* %p2
|
||||
%v2 = load i8, i8* %px
|
||||
ret i8 %v2
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user