[llvm-commits] [llvm] r82834 - in /llvm/trunk/lib/CodeGen: MachineLICM.cpp MachineSink.cpp
Dan Gohman
gohman at apple.com
Mon Sep 28 08:20:29 PDT 2009
I don't understand what you're asking here. What do you mean, and
what problem would it fix?
Dan
On Sep 26, 2009, at 10:17 PM, Evan Cheng wrote:
> Why not just add the phys register uses to the destination's livein
> set?
>
> Evan
>
> On Sep 25, 2009, at 7:34 PM, Dan Gohman wrote:
>
>> Author: djg
>> Date: Fri Sep 25 21:34:00 2009
>> New Revision: 82834
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=82834&view=rev
>> Log:
>> Don't hoist or sink instructions with physreg uses if the physreg is
>> allocatable. Even if it doesn't appear to have any defs, it may
>> latter
>> on after register allocation.
>>
>> Modified:
>> llvm/trunk/lib/CodeGen/MachineLICM.cpp
>> llvm/trunk/lib/CodeGen/MachineSink.cpp
>>
>> Modified: llvm/trunk/lib/CodeGen/MachineLICM.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineLICM.cpp?rev=82834&r1=82833&r2=82834&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- llvm/trunk/lib/CodeGen/MachineLICM.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/MachineLICM.cpp Fri Sep 25 21:34:00 2009
>> @@ -44,6 +44,7 @@
>> const TargetMachine *TM;
>> const TargetInstrInfo *TII;
>> const TargetRegisterInfo *TRI;
>> + BitVector AllocatableSet;
>>
>> // Various analyses that we use...
>> MachineLoopInfo *LI; // Current MachineLoopInfo
>> @@ -138,6 +139,7 @@
>> TII = TM->getInstrInfo();
>> TRI = TM->getRegisterInfo();
>> RegInfo = &MF.getRegInfo();
>> + AllocatableSet = TRI->getAllocatableSet(MF);
>>
>> // Get our Loop information...
>> LI = &getAnalysis<MachineLoopInfo>();
>> @@ -261,13 +263,20 @@
>> // we can move it, but only if the def is dead.
>> if (MO.isUse()) {
>> // If the physreg has no defs anywhere, it's just an ambient
>> register
>> - // and we can freely move its uses.
>> + // and we can freely move its uses. Alternatively, if it's
>> allocatable,
>> + // it could get allocated to something with a def during
>> allocation.
>> if (!RegInfo->def_empty(Reg))
>> return false;
>> + if (AllocatableSet.test(Reg))
>> + return false;
>> // Check for a def among the register's aliases too.
>> - for (const unsigned *Alias = TRI->getAliasSet(Reg);
>> *Alias; ++Alias)
>> - if (!RegInfo->def_empty(*Alias))
>> + for (const unsigned *Alias = TRI->getAliasSet(Reg);
>> *Alias; ++Alias) {
>> + unsigned AliasReg = *Alias;
>> + if (!RegInfo->def_empty(AliasReg))
>> + return false;
>> + if (AllocatableSet.test(AliasReg))
>> return false;
>> + }
>> // Otherwise it's safe to move.
>> continue;
>> } else if (!MO.isDead()) {
>>
>> Modified: llvm/trunk/lib/CodeGen/MachineSink.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineSink.cpp?rev=82834&r1=82833&r2=82834&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- llvm/trunk/lib/CodeGen/MachineSink.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/MachineSink.cpp Fri Sep 25 21:34:00 2009
>> @@ -39,6 +39,7 @@
>> MachineFunction *CurMF; // Current MachineFunction
>> MachineRegisterInfo *RegInfo; // Machine register information
>> MachineDominatorTree *DT; // Machine dominator tree
>> + BitVector AllocatableSet; // Which physregs are allocatable?
>>
>> public:
>> static char ID; // Pass identification
>> @@ -99,6 +100,7 @@
>> TRI = TM->getRegisterInfo();
>> RegInfo = &CurMF->getRegInfo();
>> DT = &getAnalysis<MachineDominatorTree>();
>> + AllocatableSet = TRI->getAllocatableSet(*CurMF);
>>
>> bool EverMadeChange = false;
>>
>> @@ -180,13 +182,20 @@
>> // we can move it, but only if the def is dead.
>> if (MO.isUse()) {
>> // If the physreg has no defs anywhere, it's just an ambient
>> register
>> - // and we can freely move its uses.
>> + // and we can freely move its uses. Alternatively, if it's
>> allocatable,
>> + // it could get allocated to something with a def during
>> allocation.
>> if (!RegInfo->def_empty(Reg))
>> return false;
>> + if (AllocatableSet.test(Reg))
>> + return false;
>> // Check for a def among the register's aliases too.
>> - for (const unsigned *Alias = TRI->getAliasSet(Reg);
>> *Alias; ++Alias)
>> - if (!RegInfo->def_empty(*Alias))
>> + for (const unsigned *Alias = TRI->getAliasSet(Reg);
>> *Alias; ++Alias) {
>> + unsigned AliasReg = *Alias;
>> + if (!RegInfo->def_empty(AliasReg))
>> + return false;
>> + if (AllocatableSet.test(AliasReg))
>> return false;
>> + }
>> } else if (!MO.isDead()) {
>> // A def that isn't dead. We can't move it.
>> return false;
>>
>>
>> _______________________________________________
>> 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