diff options
author | Chris Lattner <sabre@nondot.org> | 2008-01-05 06:10:42 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-01-05 06:10:42 +0000 |
commit | f29495a22f3ce2c0cc74eadd5bf074e5fa6ca8bd (patch) | |
tree | a0426976f6683018360f1f087c90be8d82fdca16 | |
parent | 3b5a221f815f66775ee58f0e3bd8205cdf4288b2 (diff) |
enable sinking and licm of loads from the argument area. I'd like to enable this
for remat, but can't due to an RA bug.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45623 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/X86/X86InstrInfo.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/Target/X86/X86InstrInfo.cpp b/lib/Target/X86/X86InstrInfo.cpp index 3818836914..ede88f28ff 100644 --- a/lib/Target/X86/X86InstrInfo.cpp +++ b/lib/Target/X86/X86InstrInfo.cpp @@ -141,6 +141,18 @@ bool X86InstrInfo::isReallyTriviallyReMaterializable(MachineInstr *MI) const { MI->getOperand(2).getImm() == 1 && MI->getOperand(3).getReg() == 0) return true; + + // If this is a load from a fixed argument slot, we know the value is + // invariant across the whole function, because we don't redefine argument + // values. +#if 0 + // FIXME: This is disabled due to a remat bug. rdar://5671644 + MachineFunction *MF = MI->getParent()->getParent(); + if (MI->getOperand(1).isFI() && + MF->getFrameInfo()->isFixedObjectIndex(MI->getOperand(1).getIndex())) + return true; +#endif + return false; } // All other instructions marked M_REMATERIALIZABLE are always trivially @@ -188,6 +200,15 @@ bool X86InstrInfo::isReallySideEffectFree(MachineInstr *MI) const { MI->getOperand(2).getImm() == 1 && MI->getOperand(3).getReg() == 0) return true; + + // If this is a load from a fixed argument slot, we know the value is + // invariant across the whole function, because we don't redefine argument + // values. + MachineFunction *MF = MI->getParent()->getParent(); + if (MI->getOperand(1).isFI() && + MF->getFrameInfo()->isFixedObjectIndex(MI->getOperand(1).getIndex())) + return true; + return false; } |