[llvm-commits] [llvm] r77622 - in /llvm/trunk: lib/Target/ARM/ARMISelDAGToDAG.cpp test/CodeGen/Thumb2/pic-load.ll

David Goodwin david_goodwin at apple.com
Thu Jul 30 14:35:17 PDT 2009


That is true. I thought that there might be a context where only one  
address mode would be available for matching, but perhaps that can't  
happen. I can remove the code in imm8 if you like. But it probably  
doesn't matter because frame index elimination recognizes both address  
modes and will switch the opcode as necessary to match the immediate.

David

On Jul 30, 2009, at 1:33 PM, Evan Cheng wrote:

> Hi David,
>
> Given your change, then it's possible both [R + imm12] and [R - imm8]
> can match a frameindex address. Is that what we want? Don't we want to
> canonicalize on one?
>
> Evan
>
> On Jul 30, 2009, at 11:56 AM, David Goodwin wrote:
>
>> Author: david_goodwin
>> Date: Thu Jul 30 13:56:48 2009
>> New Revision: 77622
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=77622&view=rev
>> Log:
>> Cleanup and include code selection for some frame index cases.
>>
>> Modified:
>>   llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp
>>   llvm/trunk/test/CodeGen/Thumb2/pic-load.ll
>>
>> Modified: llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp?rev=77622&r1=77621&r2=77622&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> = 
>> =====================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp Thu Jul 30
>> 13:56:48 2009
>> @@ -598,7 +598,7 @@
>>  // Match simple R + imm12 operands.
>>
>>  // Match frame index...
>> -  if (N.getOpcode() != ISD::ADD) {
>> +  if ((N.getOpcode() != ISD::ADD) && (N.getOpcode() != ISD::SUB)) {
>>    if (N.getOpcode() == ISD::FrameIndex) {
>>      int FI = cast<FrameIndexSDNode>(N)->getIndex();
>>      Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
>> @@ -610,8 +610,15 @@
>>
>>  if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand
>> (1))) {
>>    int RHSC = (int)RHS->getZExtValue();
>> -    if (RHSC >= 0 && RHSC < 0x1000) { // 12 bits.
>> +    if (N.getOpcode() == ISD::SUB)
>> +      RHSC = -RHSC;
>> +
>> +    if (RHSC >= 0 && RHSC < 0x1000) { // 12 bits (unsigned)
>>      Base   = N.getOperand(0);
>> +      if (Base.getOpcode() == ISD::FrameIndex) {
>> +        int FI = cast<FrameIndexSDNode>(Base)->getIndex();
>> +        Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
>> +      }
>>      OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32);
>>      return true;
>>    }
>> @@ -622,20 +629,31 @@
>>
>> bool ARMDAGToDAGISel::SelectT2AddrModeImm8(SDValue Op, SDValue N,
>>                                           SDValue &Base, SDValue
>> &OffImm) {
>> -  if ((N.getOpcode() == ISD::ADD) || (N.getOpcode() == ISD::SUB)) {
>> -    if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand
>> (1))) {
>> -      int RHSC = (int)RHS->getSExtValue();
>> -      if (N.getOpcode() == ISD::SUB)
>> -        RHSC = -RHSC;
>> +  // Match simple R - imm8 operands.
>>
>> -      if ((RHSC >= -255) && (RHSC <= 0)) { // 8 bits (always
>> negative)
>> -        Base   = N.getOperand(0);
>> -        OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32);
>> -        return true;
>> +  // Match frame index...
>> +  if ((N.getOpcode() != ISD::ADD) && (N.getOpcode() != ISD::SUB)) {
>> +    if (N.getOpcode() == ISD::FrameIndex) {
>> +      int FI = cast<FrameIndexSDNode>(N)->getIndex();
>> +      Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
>> +      OffImm  = CurDAG->getTargetConstant(0, MVT::i32);
>> +      return true;
>> +    }
>> +    return false;
>> +  }
>> +
>> +  if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand
>> (1))) {
>> +    int RHSC = (int)RHS->getSExtValue();
>> +    if (N.getOpcode() == ISD::SUB)
>> +      RHSC = -RHSC;
>> +
>> +    if ((RHSC >= -255) && (RHSC <= 0)) { // 8 bits (always negative)
>> +      Base   = N.getOperand(0);
>> +      if (Base.getOpcode() == ISD::FrameIndex) {
>> +        int FI = cast<FrameIndexSDNode>(Base)->getIndex();
>> +        Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
>>      }
>> -    } else if (N.getOpcode() == ISD::SUB) {
>> -      Base   = N;
>> -      OffImm = CurDAG->getTargetConstant(0, MVT::i32);
>> +      OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32);
>>      return true;
>>    }
>>  }
>> @@ -706,9 +724,24 @@
>>    return true;
>>  }
>>
>> +  // Leave (R +/- imm) for other address modes... unless they can't
>> +  // handle them
>> +  if (dyn_cast<ConstantSDNode>(N.getOperand(1)) != NULL) {
>> +    SDValue OffImm;
>> +    if (SelectT2AddrModeImm12(Op, N, Base, OffImm) ||
>> +        SelectT2AddrModeImm8 (Op, N, Base, OffImm))
>> +      return false;
>> +  }
>> +
>>  // Thumb2 does not support (R - R) or (R - (R << [1,2,3])).
>> -  if (N.getOpcode() != ISD::ADD)
>> -    return false;
>> +  if (N.getOpcode() == ISD::SUB) {
>> +    Base = N;
>> +    OffReg = CurDAG->getRegister(0, MVT::i32);
>> +    ShImm  = CurDAG->getTargetConstant(0, MVT::i32);
>> +    return true;
>> +  }
>> +
>> +  assert(N.getOpcode() == ISD::ADD);
>>
>>  // Look for (R + R) or (R + (R << [1,2,3])).
>>  unsigned ShAmt = 0;
>> @@ -736,10 +769,6 @@
>>    } else {
>>      ShOpcVal = ARM_AM::no_shift;
>>    }
>> -  } else if (SelectT2AddrModeImm12(Op, N, Base, ShImm) ||
>> -             SelectT2AddrModeImm8 (Op, N, Base, ShImm)) {
>> -    // Don't match if it's possible to match to one of the r +/-
>> imm cases.
>> -    return false;
>>  }
>>
>>  ShImm = CurDAG->getTargetConstant(ShAmt, MVT::i32);
>>
>> Modified: llvm/trunk/test/CodeGen/Thumb2/pic-load.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb2/pic-load.ll?rev=77622&r1=77621&r2=77622&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> = 
>> =====================================================================
>> --- llvm/trunk/test/CodeGen/Thumb2/pic-load.ll (original)
>> +++ llvm/trunk/test/CodeGen/Thumb2/pic-load.ll Thu Jul 30 13:56:48
>> 2009
>> @@ -8,7 +8,7 @@
>> define hidden arm_apcscc i32 @atexit(void ()* %func) nounwind {
>> entry:
>> ; CHECK: atexit:
>> -; CHECK: add.w r1, r1, pc
>> +; CHECK: add.w r0, r0, pc
>> 	%r = alloca %struct.one_atexit_routine, align 4		; <
>> %struct.one_atexit_routine*> [#uses=3]
>> 	%0 = getelementptr %struct.one_atexit_routine* %r, i32 0, i32 0,
>> i32 0		; <void ()**> [#uses=1]
>> 	store void ()* %func, void ()** %0, align 4
>>
>>
>> _______________________________________________
>> 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