[llvm] r181423 - PPCInstrInfo::optimizeCompareInstr should not optimize FP compares

Bill Wendling isanbard at gmail.com
Wed May 8 11:11:49 PDT 2013


Hi Hal,

I'm okay with the code owners merging the changes into the tree. Just let me know when you do it. :-)

Thanks!

-bw

On May 8, 2013, at 5:23 AM, Hal Finkel <hfinkel at anl.gov> wrote:

> Bill,
> 
> This should go into the release branch. Do you prefer to do all of the merging yourself, or would you prefer that the code owners do it?
> 
> Thanks again,
> Hal
> 
> ----- Original Message -----
>> Author: hfinkel
>> Date: Wed May  8 07:16:14 2013
>> New Revision: 181423
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=181423&view=rev
>> Log:
>> PPCInstrInfo::optimizeCompareInstr should not optimize FP compares
>> 
>> The floating-point record forms on PPC don't set the condition
>> register bits
>> based on a comparison with zero (like the integer record forms do),
>> but rather
>> based on the exception status bits.
>> 
>> Modified:
>>    llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp
>>    llvm/trunk/test/CodeGen/PowerPC/optcmp.ll
>> 
>> Modified: llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp?rev=181423&r1=181422&r2=181423&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp (original)
>> +++ llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp Wed May  8
>> 07:16:14 2013
>> @@ -1096,8 +1096,11 @@ bool PPCInstrInfo::optimizeCompareInstr(
>> 
>>   int OpC = CmpInstr->getOpcode();
>>   unsigned CRReg = CmpInstr->getOperand(0).getReg();
>> -  bool isFP = OpC == PPC::FCMPUS || OpC == PPC::FCMPUD;
>> -  unsigned CRRecReg = isFP ? PPC::CR1 : PPC::CR0;
>> +
>> +  // FP record forms set CR1 based on the execption status bits, not
>> a
>> +  // comparison with zero.
>> +  if (OpC == PPC::FCMPUS || OpC == PPC::FCMPUD)
>> +    return false;
>> 
>>   // The record forms set the condition register based on a signed
>>   comparison
>>   // with zero (so says the ISA manual). This is not as
>>   straightforward as it
>> @@ -1140,9 +1143,9 @@ bool PPCInstrInfo::optimizeCompareInstr(
>>         equalityOnly = true;
>>       } else
>>         return false;
>> -    } else if (!isFP)
>> +    } else
>>       equalityOnly = is64BitUnsignedCompare;
>> -  } else if (!isFP)
>> +  } else
>>     equalityOnly = is32BitUnsignedCompare;
>> 
>>   if (equalityOnly) {
>> @@ -1211,8 +1214,8 @@ bool PPCInstrInfo::optimizeCompareInstr(
>>     unsigned IOpC = Instr.getOpcode();
>> 
>>     if (&*I != CmpInstr && (
>> -        Instr.modifiesRegister(CRRecReg, TRI) ||
>> -        Instr.readsRegister(CRRecReg, TRI)))
>> +        Instr.modifiesRegister(PPC::CR0, TRI) ||
>> +        Instr.readsRegister(PPC::CR0, TRI)))
>>       // This instruction modifies or uses the record condition
>>       register after
>>       // the one we want to change. While we could do this
>>       transformation, it
>>       // would likely not be profitable. This transformation removes
>>       one
>> @@ -1232,15 +1235,6 @@ bool PPCInstrInfo::optimizeCompareInstr(
>>       break;
>>     }
>> 
>> -    if (isFP && (IOpC == PPC::FSUB || IOpC == PPC::FSUBS) &&
>> -        ((Instr.getOperand(1).getReg() == SrcReg &&
>> -          Instr.getOperand(2).getReg() == SrcReg2) ||
>> -        (Instr.getOperand(1).getReg() == SrcReg2 &&
>> -         Instr.getOperand(2).getReg() == SrcReg))) {
>> -      Sub = &*I;
>> -      break;
>> -    }
>> -
>>     if (I == B)
>>       // The 'and' is below the comparison instruction.
>>       return false;
>> @@ -1286,8 +1280,7 @@ bool PPCInstrInfo::optimizeCompareInstr(
>> 
>>     // The operands to subf are the opposite of sub, so only in the
>>     fixed-point
>>     // case, invert the order.
>> -    if (!isFP)
>> -      ShouldSwap = !ShouldSwap;
>> +    ShouldSwap = !ShouldSwap;
>>   }
>> 
>>   if (ShouldSwap)
>> @@ -1326,7 +1319,7 @@ bool PPCInstrInfo::optimizeCompareInstr(
>>   MachineBasicBlock::iterator MII = MI;
>>   BuildMI(*MI->getParent(), llvm::next(MII), MI->getDebugLoc(),
>>           get(TargetOpcode::COPY), CRReg)
>> -    .addReg(CRRecReg, MIOpC != NewOpC ? RegState::Kill : 0);
>> +    .addReg(PPC::CR0, MIOpC != NewOpC ? RegState::Kill : 0);
>> 
>>   if (MIOpC != NewOpC) {
>>     // We need to be careful here: we're replacing one instruction
>>     with
>> 
>> Modified: llvm/trunk/test/CodeGen/PowerPC/optcmp.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/optcmp.ll?rev=181423&r1=181422&r2=181423&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/CodeGen/PowerPC/optcmp.ll (original)
>> +++ llvm/trunk/test/CodeGen/PowerPC/optcmp.ll Wed May  8 07:16:14
>> 2013
>> @@ -118,7 +118,7 @@ entry:
>>   ret double %cond
>> 
>> ; CHECK: @food
>> -; CHECK: fsub. 0, 1, 2
>> +; CHECK-NOT: fsub. 0, 1, 2
>> ; CHECK: stfd 0, 0(5)
>> }
>> 
>> @@ -131,7 +131,7 @@ entry:
>>   ret float %cond
>> 
>> ; CHECK: @foof
>> -; CHECK: fsubs. 0, 1, 2
>> +; CHECK-NOT: fsubs. 0, 1, 2
>> ; CHECK: stfs 0, 0(5)
>> }
>> 
>> 
>> 
>> _______________________________________________
>> 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