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

Evan Cheng evan.cheng at apple.com
Thu Jul 30 15:33:35 PDT 2009


On Jul 30, 2009, at 2:35 PM, David Goodwin wrote:

> 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.

Yes, please do. Thanks.

Evan

>
> 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
>
> _______________________________________________
> 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