Simplify the side effect stuff a bit more and make licm/sinking

both work right according to the new flags.

This removes the TII::isReallySideEffectFree predicate, and adds
TII::isInvariantLoad. 

It removes NeverHasSideEffects+MayHaveSideEffects and adds
UnmodeledSideEffects as machine instr flags.  Now the clients
can decide everything they need.

I think isRematerializable can be implemented in terms of the
flags we have now, though I will let others tackle that.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45843 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2008-01-10 23:08:24 +00:00
parent 2445888208
commit a22edc82ca
7 changed files with 74 additions and 77 deletions
+13 -11
View File
@@ -133,19 +133,21 @@ bool MachineSinking::SinkInstruction(MachineInstr *MI) {
const TargetInstrDesc &TID = MI->getDesc();
// Ignore stuff that we obviously can't sink.
if (TID.mayStore() || TID.isCall() || TID.isReturn() || TID.isBranch())
if (TID.mayStore() || TID.isCall() || TID.isReturn() || TID.isBranch() ||
TID.hasUnmodeledSideEffects())
return false;
if (TID.mayLoad())
return false;
// Don't sink things with side-effects we don't understand.
if (TII->hasUnmodelledSideEffects(MI))
return false;
// FIXME: we should be able to sink loads with no other side effects if there
// is nothing that can change memory from here until the end of block. This
// is a trivial form of alias analysis.
if (TID.mayLoad()) {
// Okay, this instruction does a load. As a refinement, allow the target
// to decide whether the loaded value is actually a constant. If so, we
// can actually use it as a load.
if (!TII->isInvariantLoad(MI)) {
// FIXME: we should be able to sink loads with no other side effects if
// there is nothing that can change memory from here until the end of
// block. This is a trivial form of alias analysis.
return false;
}
}
// FIXME: This should include support for sinking instructions within the
// block they are currently in to shorten the live ranges. We often get