Fix for regression: [Bug 20369] wrong code at -O3 on x86_64-linux-gnu in 64-bit mode

Prevents hoisting of loads above stores and sinking of stores below loads
in MergedLoadStoreMotion.cpp (rdar://15991737)

llvm-svn: 213497
This commit is contained in:
Gerolf Hoflehner 2014-07-21 03:02:46 +00:00
parent 4c904adf7c
commit ae1ec299df
1 changed files with 9 additions and 1 deletions

View File

@ -243,6 +243,10 @@ bool MergedLoadStoreMotion::isLoadHoistBarrier(Instruction *Inst) {
return true;
if (isa<TerminatorInst>(Inst))
return true;
// FIXME: Conservatively let a store instruction block the load.
// Use alias analysis instead.
if (isa<StoreInst>(Inst))
return true;
// Note: mayHaveSideEffects covers all instructions that could
// trigger a change to state. Eg. in-flight stores have to be executed
// before ordered loads or fences, calls could invoke functions that store
@ -411,8 +415,12 @@ bool MergedLoadStoreMotion::mergeLoads(BasicBlock *BB) {
///
/// \brief True when instruction is sink barrier for a store
///
///
bool MergedLoadStoreMotion::isStoreSinkBarrier(Instruction *Inst) {
// FIXME: Conservatively let a load instruction block the store.
// Use alias analysis instead.
if (isa<LoadInst>(Inst))
return true;
if (isa<CallInst>(Inst))
return true;
if (isa<TerminatorInst>(Inst) && !isa<BranchInst>(Inst))