[llvm-commits] [llvm] r112393 - in /llvm/trunk/lib/Target/ARM: ARMISelLowering.cpp ARMISelLowering.h ARMInstrThumb2.td

Bill Wendling isanbard at gmail.com
Mon Aug 30 11:54:55 PDT 2010


Hi Jim,

It's for a future optimization I have in mind. I want to generate good code for this function:

int x(int a) {
  if (a & 256)
    return -26;
  return 0;
}

Right now, we generate something like this:

    tst   r0, r0, 256
    mvn   r0, #25
    it    eq
    moveq r0, #0

gcc generates something like this:

    ands  r0, r0, 256
    it    ne
    mvnne r0, #25

I want to do this transformation during instruction selection time. So basically I have something like:

  (ARMISD::MOVCC CC, (ARMISD::CMPZ (and X, 256), 0), -26)

This will be converted to:

  (ARM::t2MOVCC nCC, -26, (ARM::t2ANDri X, 256))

where the ARM::t2ANDri instruction sets CPSR and the t2MOVCC acts upon that flag, and nCC is the opposite condcode of CC.

So, um, that's why. :-) It's vague and I'll talk to you in person more in depth...

-bw

On Aug 30, 2010, at 8:27 AM, Jim Grosbach wrote:

> Hi Bill,
> 
> I'm not sure I follow why this is needed. I'm probably just missing some context. Mind dropping by to enlighten me?
> 
> Thanks,
> -Jim
> 
> On Aug 28, 2010, at 8:02 PM, Bill Wendling wrote:
> 
>> Author: void
>> Date: Sat Aug 28 22:02:11 2010
>> New Revision: 112393
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=112393&view=rev
>> Log:
>> Create an ARMISD::AND node. This node is exactly like the "ARM::AND" node, but
>> it sets the CPSR register.
>> 
>> Modified:
>>   llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
>>   llvm/trunk/lib/Target/ARM/ARMISelLowering.h
>>   llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td
>> 
>> Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=112393&r1=112392&r2=112393&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Sat Aug 28 22:02:11 2010
>> @@ -609,6 +609,7 @@
>>  case ARMISD::BR2_JT:        return "ARMISD::BR2_JT";
>>  case ARMISD::RET_FLAG:      return "ARMISD::RET_FLAG";
>>  case ARMISD::PIC_ADD:       return "ARMISD::PIC_ADD";
>> +  case ARMISD::AND:           return "ARMISD::AND";
>>  case ARMISD::CMP:           return "ARMISD::CMP";
>>  case ARMISD::CMPZ:          return "ARMISD::CMPZ";
>>  case ARMISD::CMPFP:         return "ARMISD::CMPFP";
>> 
>> Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.h?rev=112393&r1=112392&r2=112393&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMISelLowering.h (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.h Sat Aug 28 22:02:11 2010
>> @@ -47,6 +47,8 @@
>> 
>>      PIC_ADD,      // Add with a PC operand and a PIC label.
>> 
>> +      AND,          // ARM "and" instruction that sets the 's' flag in CPSR.
>> +
>>      CMP,          // ARM compare instructions.
>>      CMPZ,         // ARM compare that sets only Z flag.
>>      CMPFP,        // ARM VFP compare instruction, sets FPSCR.
>> 
>> Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td?rev=112393&r1=112392&r2=112393&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMInstrThumb2.td Sat Aug 28 22:02:11 2010
>> @@ -1631,6 +1631,10 @@
>> defm t2BIC  : T2I_bin_w_irs<0b0001, "bic",
>>                            BinOpFrag<(and node:$LHS, (not node:$RHS))>>;
>> 
>> +let Defs = [CPSR] in
>> +defm t2ANDflag : T2I_bin_w_irs<0b0000, "and",
>> +                               BinOpFrag<(ARMand node:$LHS, node:$RHS)>, 1>;
>> +
>> let Constraints = "$src = $dst" in
>> def t2BFC : T2I<(outs rGPR:$dst), (ins rGPR:$src, bf_inv_mask_imm:$imm),
>>                IIC_iUNAsi, "bfc", "\t$dst, $imm",
>> 
>> 
>> _______________________________________________
>> 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