diff options
Diffstat (limited to 'contrib/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp')
-rw-r--r-- | contrib/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp | 78 |
1 files changed, 41 insertions, 37 deletions
diff --git a/contrib/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp b/contrib/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp index 7c22cb2..f6d20ce 100644 --- a/contrib/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp +++ b/contrib/llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp @@ -21,6 +21,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/LiveIntervalAnalysis.h" +#include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstrBuilder.h" @@ -74,7 +75,7 @@ protected: const TargetRegisterInfo *TRI = &TII->getRegisterInfo(); for (MachineBasicBlock::iterator I = MBB.begin(), IE = MBB.end(); I != IE; ++I) { - MachineInstr *MI = I; + MachineInstr &MI = *I; // The default (A-type) VSX FMA form kills the addend (it is taken from // the target register, which is then updated to reflect the result of @@ -82,7 +83,7 @@ protected: // used for the product, then we can use the M-form instruction (which // will take that value from the to-be-defined register). - int AltOpc = PPC::getAltVSXFMAOpcode(MI->getOpcode()); + int AltOpc = PPC::getAltVSXFMAOpcode(MI.getOpcode()); if (AltOpc == -1) continue; @@ -105,10 +106,10 @@ protected: // %RM<imp-use>; VSLRC:%vreg16,%vreg18,%vreg9 // and we remove: %vreg5<def> = COPY %vreg9; VSLRC:%vreg5,%vreg9 - SlotIndex FMAIdx = LIS->getInstructionIndex(*MI); + SlotIndex FMAIdx = LIS->getInstructionIndex(MI); VNInfo *AddendValNo = - LIS->getInterval(MI->getOperand(1).getReg()).Query(FMAIdx).valueIn(); + LIS->getInterval(MI.getOperand(1).getReg()).Query(FMAIdx).valueIn(); // This can be null if the register is undef. if (!AddendValNo) @@ -118,7 +119,7 @@ protected: // The addend and this instruction must be in the same block. - if (!AddendMI || AddendMI->getParent() != MI->getParent()) + if (!AddendMI || AddendMI->getParent() != MI.getParent()) continue; // The addend must be a full copy within the same register class. @@ -182,12 +183,12 @@ protected: // %vreg5 = A-form-op %vreg5, %vreg5, %vreg11; // where vreg5 and vreg11 are both kills. This case would be skipped // otherwise. - unsigned OldFMAReg = MI->getOperand(0).getReg(); + unsigned OldFMAReg = MI.getOperand(0).getReg(); // Find one of the product operands that is killed by this instruction. unsigned KilledProdOp = 0, OtherProdOp = 0; - unsigned Reg2 = MI->getOperand(2).getReg(); - unsigned Reg3 = MI->getOperand(3).getReg(); + unsigned Reg2 = MI.getOperand(2).getReg(); + unsigned Reg3 = MI.getOperand(3).getReg(); if (LIS->getInterval(Reg2).Query(FMAIdx).isKill() && Reg2 != OldFMAReg) { KilledProdOp = 2; @@ -214,20 +215,20 @@ protected: // Transform: (O2 * O3) + O1 -> (O2 * O1) + O3. - unsigned KilledProdReg = MI->getOperand(KilledProdOp).getReg(); - unsigned OtherProdReg = MI->getOperand(OtherProdOp).getReg(); + unsigned KilledProdReg = MI.getOperand(KilledProdOp).getReg(); + unsigned OtherProdReg = MI.getOperand(OtherProdOp).getReg(); unsigned AddSubReg = AddendMI->getOperand(1).getSubReg(); - unsigned KilledProdSubReg = MI->getOperand(KilledProdOp).getSubReg(); - unsigned OtherProdSubReg = MI->getOperand(OtherProdOp).getSubReg(); + unsigned KilledProdSubReg = MI.getOperand(KilledProdOp).getSubReg(); + unsigned OtherProdSubReg = MI.getOperand(OtherProdOp).getSubReg(); bool AddRegKill = AddendMI->getOperand(1).isKill(); - bool KilledProdRegKill = MI->getOperand(KilledProdOp).isKill(); - bool OtherProdRegKill = MI->getOperand(OtherProdOp).isKill(); + bool KilledProdRegKill = MI.getOperand(KilledProdOp).isKill(); + bool OtherProdRegKill = MI.getOperand(OtherProdOp).isKill(); bool AddRegUndef = AddendMI->getOperand(1).isUndef(); - bool KilledProdRegUndef = MI->getOperand(KilledProdOp).isUndef(); - bool OtherProdRegUndef = MI->getOperand(OtherProdOp).isUndef(); + bool KilledProdRegUndef = MI.getOperand(KilledProdOp).isUndef(); + bool OtherProdRegUndef = MI.getOperand(OtherProdOp).isUndef(); // If there isn't a class that fits, we can't perform the transform. // This is needed for correctness with a mixture of VSX and Altivec @@ -240,39 +241,39 @@ protected: assert(OldFMAReg == AddendMI->getOperand(0).getReg() && "Addend copy not tied to old FMA output!"); - DEBUG(dbgs() << "VSX FMA Mutation:\n " << *MI;); + DEBUG(dbgs() << "VSX FMA Mutation:\n " << MI); - MI->getOperand(0).setReg(KilledProdReg); - MI->getOperand(1).setReg(KilledProdReg); - MI->getOperand(3).setReg(AddendSrcReg); + MI.getOperand(0).setReg(KilledProdReg); + MI.getOperand(1).setReg(KilledProdReg); + MI.getOperand(3).setReg(AddendSrcReg); - MI->getOperand(0).setSubReg(KilledProdSubReg); - MI->getOperand(1).setSubReg(KilledProdSubReg); - MI->getOperand(3).setSubReg(AddSubReg); + MI.getOperand(0).setSubReg(KilledProdSubReg); + MI.getOperand(1).setSubReg(KilledProdSubReg); + MI.getOperand(3).setSubReg(AddSubReg); - MI->getOperand(1).setIsKill(KilledProdRegKill); - MI->getOperand(3).setIsKill(AddRegKill); + MI.getOperand(1).setIsKill(KilledProdRegKill); + MI.getOperand(3).setIsKill(AddRegKill); - MI->getOperand(1).setIsUndef(KilledProdRegUndef); - MI->getOperand(3).setIsUndef(AddRegUndef); + MI.getOperand(1).setIsUndef(KilledProdRegUndef); + MI.getOperand(3).setIsUndef(AddRegUndef); - MI->setDesc(TII->get(AltOpc)); + MI.setDesc(TII->get(AltOpc)); // If the addend is also a multiplicand, replace it with the addend // source in both places. if (OtherProdReg == AddendMI->getOperand(0).getReg()) { - MI->getOperand(2).setReg(AddendSrcReg); - MI->getOperand(2).setSubReg(AddSubReg); - MI->getOperand(2).setIsKill(AddRegKill); - MI->getOperand(2).setIsUndef(AddRegUndef); + MI.getOperand(2).setReg(AddendSrcReg); + MI.getOperand(2).setSubReg(AddSubReg); + MI.getOperand(2).setIsKill(AddRegKill); + MI.getOperand(2).setIsUndef(AddRegUndef); } else { - MI->getOperand(2).setReg(OtherProdReg); - MI->getOperand(2).setSubReg(OtherProdSubReg); - MI->getOperand(2).setIsKill(OtherProdRegKill); - MI->getOperand(2).setIsUndef(OtherProdRegUndef); + MI.getOperand(2).setReg(OtherProdReg); + MI.getOperand(2).setSubReg(OtherProdSubReg); + MI.getOperand(2).setIsKill(OtherProdRegKill); + MI.getOperand(2).setIsUndef(OtherProdRegUndef); } - DEBUG(dbgs() << " -> " << *MI); + DEBUG(dbgs() << " -> " << MI); // The killed product operand was killed here, so we can reuse it now // for the result of the fma. @@ -374,6 +375,8 @@ public: AU.addPreserved<LiveIntervals>(); AU.addRequired<SlotIndexes>(); AU.addPreserved<SlotIndexes>(); + AU.addRequired<MachineDominatorTree>(); + AU.addPreserved<MachineDominatorTree>(); MachineFunctionPass::getAnalysisUsage(AU); } }; @@ -383,6 +386,7 @@ INITIALIZE_PASS_BEGIN(PPCVSXFMAMutate, DEBUG_TYPE, "PowerPC VSX FMA Mutation", false, false) INITIALIZE_PASS_DEPENDENCY(LiveIntervals) INITIALIZE_PASS_DEPENDENCY(SlotIndexes) +INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) INITIALIZE_PASS_END(PPCVSXFMAMutate, DEBUG_TYPE, "PowerPC VSX FMA Mutation", false, false) |