1
0
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:
Eli Friedman 2019-01-24 21:31:13 +00:00
parent 45c98f5090
commit d0caf58911
2 changed files with 20 additions and 0 deletions

View File

@ -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

View File

@ -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
}