From 3e4fb70c6af53a2d00e057a7e4a8f93eb2ff2112 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Wed, 24 Sep 2008 00:06:15 +0000 Subject: [PATCH] Add a method to MachineInstr for testing whether it makes any volatile memory references. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56528 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/MachineInstr.h | 8 ++++++ lib/CodeGen/MachineInstr.cpp | 39 ++++++++++++++++++++++------- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/include/llvm/CodeGen/MachineInstr.h b/include/llvm/CodeGen/MachineInstr.h index 3171af9606e..8efea624425 100644 --- a/include/llvm/CodeGen/MachineInstr.h +++ b/include/llvm/CodeGen/MachineInstr.h @@ -250,8 +250,16 @@ public: /// the instruction's location and its intended destination. bool isSafeToMove(const TargetInstrInfo *TII, bool &SawStore); + /// isSafeToReMat - Return true if it's safe to rematerialize the specified + /// instruction which defined the specified register instead of copying it. bool isSafeToReMat(const TargetInstrInfo *TII, unsigned DstReg); + /// hasVolatileMemoryRef - Return true if this instruction may have a + /// volatile memory reference, or if the information describing the + /// memory reference is not available. Return false if it is known to + /// have no volatile memory references. + bool hasVolatileMemoryRef() const; + // // Debugging support // diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp index a365f20300f..7d44d4ee79f 100644 --- a/lib/CodeGen/MachineInstr.cpp +++ b/lib/CodeGen/MachineInstr.cpp @@ -711,16 +711,11 @@ bool MachineInstr::isSafeToMove(const TargetInstrInfo *TII, bool &SawStore) { // destination. The check for isInvariantLoad gives the targe the chance to // classify the load as always returning a constant, e.g. a constant pool // load. - if (TID->mayLoad() && !TII->isInvariantLoad(this)) { + if (TID->mayLoad() && !TII->isInvariantLoad(this)) // Otherwise, this is a real load. If there is a store between the load and - // end of block, we can't sink the load. - // - // FIXME: we can't do this transformation until we know that the load is - // not volatile, and machineinstrs don't keep this info. :( - // - //if (SawStore) - return false; - } + // end of block, or if the laod is volatile, we can't move it. + return SawStore || hasVolatileMemoryRef(); + return true; } @@ -749,6 +744,32 @@ bool MachineInstr::isSafeToReMat(const TargetInstrInfo *TII, unsigned DstReg) { return true; } +/// hasVolatileMemoryRef - Return true if this instruction may have a +/// volatile memory reference, or if the information describing the +/// memory reference is not available. Return false if it is known to +/// have no volatile memory references. +bool MachineInstr::hasVolatileMemoryRef() const { + // An instruction known never to access memory won't have a volatile access. + if (!TID->mayStore() && + !TID->mayLoad() && + !TID->isCall() && + !TID->hasUnmodeledSideEffects()) + return false; + + // Otherwise, if the instruction has no memory reference information, + // conservatively assume it wasn't preserved. + if (memoperands_empty()) + return true; + + // Check the memory reference information for volatile references. + for (std::list::const_iterator I = memoperands_begin(), + E = memoperands_end(); I != E; ++I) + if (I->isVolatile()) + return true; + + return false; +} + void MachineInstr::dump() const { cerr << " " << *this; }