[llvm-commits] [llvm] r138794 - /llvm/trunk/lib/CodeGen/InlineSpiller.cpp
Bob Wilson
bob.wilson at apple.com
Wed Aug 31 09:17:25 PDT 2011
Jakob wants to try a less conservative fix. I'm going to leave it up to him to find a testcase.
On Aug 29, 2011, at 10:36 PM, Bob Wilson wrote:
> Author: bwilson
> Date: Tue Aug 30 00:36:02 2011
> New Revision: 138794
>
> URL: http://llvm.org/viewvc/llvm-project?rev=138794&view=rev
> Log:
> Do not try to rematerialize a value from a partial definition.
> I don't currently have a good testcase for this; will try to get one
> tomorrow. <rdar://problem/10032939>
>
> Modified:
> llvm/trunk/lib/CodeGen/InlineSpiller.cpp
>
> Modified: llvm/trunk/lib/CodeGen/InlineSpiller.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/InlineSpiller.cpp?rev=138794&r1=138793&r2=138794&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/InlineSpiller.cpp (original)
> +++ llvm/trunk/lib/CodeGen/InlineSpiller.cpp Tue Aug 30 00:36:02 2011
> @@ -189,6 +189,20 @@
> return 0;
> }
>
> +/// isFullDefOf - Return true if MI defines the full contents of a register.
> +/// Since this is in the context of spilling, it does not do anything special
> +/// for physical registers.
> +static bool isFullDefOf(const MachineInstr *MI, unsigned Reg) {
> + for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
> + const MachineOperand &MO = MI->getOperand(i);
> + if (!MO.isReg() || !MO.isDef() || MO.getSubReg())
> + continue;
> + if (MO.getReg() == Reg)
> + return true;
> + }
> + return false;
> +}
> +
> /// isSnippet - Identify if a live interval is a snippet that should be spilled.
> /// It is assumed that SnipLI is a virtual register with the same original as
> /// Edit->getReg().
> @@ -306,6 +320,7 @@
> MachineBasicBlock *SpillMBB = UseMBB;
> unsigned SpillDepth = Loops.getLoopDepth(SpillMBB);
> bool SeenOrigPHI = false; // Original PHI met.
> + bool SeenNonReloadDef = false;
>
> do {
> unsigned Reg;
> @@ -407,12 +422,18 @@
> }
>
> // Potential remat candidate.
> + SeenNonReloadDef = true;
> + if (!isFullDefOf(MI, Reg)) {
> + DEBUG(dbgs() << " partial def " << PrintReg(Reg) << ':'
> + << VNI->id << '@' << VNI->def << '\t' << *MI);
> + continue;
> + }
> DEBUG(dbgs() << " def " << PrintReg(Reg) << ':'
> << VNI->id << '@' << VNI->def << '\t' << *MI);
> SVI.DefMI = MI;
> } while (!WorkList.empty());
>
> - if (SeenOrigPHI || SVI.DefMI)
> + if (SeenOrigPHI || SeenNonReloadDef)
> SVI.AllDefsAreReloads = false;
>
> DEBUG({
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list