mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
[MergedLoadStoreMotion] Use correct helper for load hoist safety.
It isn't legal to hoist a load past a call which might not return; even if it doesn't throw, it could, for example, call exit(). Fixes http://llvm.org/PR27953. llvm-svn: 272495
This commit is contained in:
parent
aee1d0d19d
commit
97af9f3308
@ -79,6 +79,7 @@
|
||||
#include "llvm/Analysis/Loads.h"
|
||||
#include "llvm/Analysis/MemoryBuiltins.h"
|
||||
#include "llvm/Analysis/MemoryDependenceAnalysis.h"
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/IR/PatternMatch.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
@ -232,7 +233,7 @@ bool MergedLoadStoreMotion::isLoadHoistBarrierInRange(
|
||||
if (!SafeToLoadUnconditionally)
|
||||
for (const Instruction &Inst :
|
||||
make_range(Start.getIterator(), End.getIterator()))
|
||||
if (Inst.mayThrow())
|
||||
if (!isGuaranteedToTransferExecutionToSuccessor(&Inst))
|
||||
return true;
|
||||
MemoryLocation Loc = MemoryLocation::get(LI);
|
||||
return AA->canInstructionRangeModRef(Start, End, Loc, MRI_Mod);
|
||||
|
@ -11,12 +11,12 @@ entry:
|
||||
br i1 %cmp, label %if.then, label %if.else
|
||||
|
||||
if.then: ; preds = %entry
|
||||
call void @may_throw()
|
||||
call void @may_exit() nounwind
|
||||
%arrayidx = getelementptr inbounds i32, i32* %p, i64 1
|
||||
%0 = load i32, i32* %arrayidx, align 4
|
||||
store i32 %0, i32* @r, align 4
|
||||
br label %if.end
|
||||
; CHECK: call void @may_throw()
|
||||
; CHECK: call void @may_exit()
|
||||
; CHECK-NEXT: %[[gep:.*]] = getelementptr inbounds i32, i32* %p, i64 1
|
||||
; CHECK-NEXT: %[[load:.*]] = load i32, i32* %[[gep]], align 4
|
||||
; CHECK-NEXT: store i32 %[[load]], i32* @r, align 4
|
||||
@ -55,3 +55,4 @@ if.end: ; preds = %if.else, %if.then
|
||||
}
|
||||
|
||||
declare void @may_throw()
|
||||
declare void @may_exit() nounwind
|
||||
|
Loading…
Reference in New Issue
Block a user