[llvm-commits] [llvm] r50987 - /llvm/trunk/lib/CodeGen/MachineLICM.cpp

Bill Wendling isanbard at gmail.com
Mon May 12 12:59:00 PDT 2008


Yeah. I realized my error afterwards. Reverted.

-bw

On Mon, May 12, 2008 at 12:44 PM, Evan Cheng <evan.cheng at apple.com> wrote:
> This is wrong. We definitely *want* to hoist instructions that are
> rematerializable. These instructions can be remat at the uses in case
> LICM increases register pressure and spilling ensues.
>
> Evan
>
> On May 12, 2008, at 12:38 PM, Bill Wendling wrote:
>
>> Author: void
>> Date: Mon May 12 14:38:32 2008
>> New Revision: 50987
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=50987&view=rev
>> Log:
>> One real change - don't hoist something that's trivially
>> rematerializable. It's
>> possible for it to produce worse code than before.
>>
>> The rest of this patch is code cleanup.
>>
>> Modified:
>>    llvm/trunk/lib/CodeGen/MachineLICM.cpp
>>
>> Modified: llvm/trunk/lib/CodeGen/MachineLICM.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineLICM.cpp?rev=50987&r1=50986&r2=50987&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> ======================================================================
>> --- llvm/trunk/lib/CodeGen/MachineLICM.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/MachineLICM.cpp Mon May 12 14:38:32 2008
>> @@ -34,16 +34,16 @@
>>   class VISIBILITY_HIDDEN MachineLICM : public MachineFunctionPass {
>>     const TargetMachine   *TM;
>>     const TargetInstrInfo *TII;
>> -    MachineFunction       *CurMF; // Current MachineFunction
>> +    MachineFunction       *CurMF;  // Current MachineFunction
>>
>>     // Various analyses that we use...
>> -    MachineLoopInfo      *LI;   // Current MachineLoopInfo
>> -    MachineDominatorTree *DT;   // Machine dominator tree for the
>> current Loop
>> +    MachineLoopInfo      *LI;      // Current MachineLoopInfo
>> +    MachineDominatorTree *DT;      // Machine dominator tree for
>> the cur loop
>>     MachineRegisterInfo  *RegInfo; // Machine register information
>>
>>     // State that is updated as we process loops
>> -    bool         Changed;       // True if a loop is changed.
>> -    MachineLoop *CurLoop;       // The current loop we are working
>> on.
>> +    bool         Changed;          // True if a loop is changed.
>> +    MachineLoop *CurLoop;          // The current loop we are
>> working on.
>>   public:
>>     static char ID; // Pass identification, replacement for typeid
>>     MachineLICM() : MachineFunctionPass((intptr_t)&ID) {}
>> @@ -233,15 +233,14 @@
>>     return false;
>>
>>   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(&I)) {
>> +    // Okay, this instruction does a load. As a refinement, we
>> 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(&I))
>>       // 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.
>> +      // block. This is a trivial form of alias analysis.
>>       return false;
>> -    }
>>   }
>>
>>   DEBUG({
>> @@ -263,12 +262,9 @@
>>              *ImpDefs; ++ImpDefs)
>>           DOUT << "      -> " << TRI->getName(*ImpDefs) << "\n";
>>       }
>> -
>> -        //if (TII->hasUnmodelledSideEffects(&I))
>> -        //DOUT << "  * Instruction has side effects.\n";
>>     });
>>
>> -  // The instruction is loop invariant if all of its operands are
>> loop-invariant
>> +  // The instruction is loop invariant if all of its operands are.
>>   for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) {
>>     const MachineOperand &MO = I.getOperand(i);
>>
>> @@ -282,7 +278,8 @@
>>     if (TargetRegisterInfo::isPhysicalRegister(Reg))
>>       return false;
>>
>> -    assert(RegInfo->getVRegDef(Reg)&&"Machine instr not mapped for
>> this vreg?");
>> +    assert(RegInfo->getVRegDef(Reg) &&
>> +           "Machine instr not mapped for this vreg?!");
>>
>>     // If the loop contains the definition of an operand, then the
>> instruction
>>     // isn't loop invariant.
>> @@ -294,12 +291,16 @@
>>   return true;
>> }
>>
>> -/// Hoist - When an instruction is found to only use loop invariant
>> operands
>> -/// that is safe to hoist, this instruction is called to do the
>> dirty work.
>> +/// Hoist - When an instruction is found to use only loop invariant
>> operands
>> +/// that are safe to hoist, this instruction is called to do the
>> dirty work.
>> ///
>> void MachineLICM::Hoist(MachineInstr &MI) {
>>   if (!IsLoopInvariantInst(MI)) return;
>>
>> +  // Hoisting things that are trivially rematerializable may result
>> in worse
>> +  // code than before.
>> +  if (TII->isTriviallyReMaterializable(&MI)) return;
>> +
>>   std::vector<MachineBasicBlock*> Preds;
>>
>>   // Non-back-edge predecessors.
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> 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