[llvm-commits] Patch to implement UMLAL/SMLAL Instructions for the ARM Architecture

Jiangning Liu liujiangning1 at gmail.com
Sun Aug 5 13:58:31 PDT 2012


+class AsMla1I64<bits<7> opcod, dag oops, dag iops, InstrItinClass itin,
+             string opc, string asm, list<dag> pattern>
+  : AsMul1I<opcod, oops, iops, itin, opc, asm, pattern> {
+  bits<4> RdLo;
+  bits<4> RdHi;
+  bits<4> Rm;
+  bits<4> Rn;
+  bits<4> RLo;
+  bits<4> RHi;
+  let Inst{19-16} = RdHi;
+  let Inst{15-12} = RdLo;
+  let Inst{11-8}  = Rm;
+  let Inst{3-0}   = Rn;
+}
 
Hi Arnold,
 
Here it seems that RLo and RHi are useless in this class, right? If it's no, could you please point me where they are being referenced?
 
Thanks,
-Jiangning

在 2012-8-2,下午10:57,Arnold Schwaighofer <arnolds at codeaurora.org> 写道:

> Patch to implement UMLAL/SMLAL Instructions for the ARM Architecture
> 
> This patch corrects the definition of umlal/smlal instructions and adds support for matching them to the ARM dag combiner.
> 
> 
> 
> This patch got lost on my end. Sorry.
> 
> Is it okay to commit?
> 
> Prior discussion:
> http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20120507/142351.html
> http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20120416/141153.html
> 
> Bug:
> http://llvm.org/bugs/show_bug.cgi?id=12213
> 
>> I understand Anton has not gotten back to you. That's fine, I don't think
>> you need to wait for him. However, it looks like Arnold has some concerns
>> about the patch? Please address his concerns first.
>> 
>> Once you have addressed Arnold's concerns, he can commit it for you.
>> Arnold has commit privilege.
>> 
>> Evan
>> 
>> On May 9, 2012, at 4:32 PM, Yin Ma wrote:
>> 
>>> Hi Evan,
>>> 
>>>     Sorry for bothering you. I would like to know if this patch is
>>> likely to be reviewed
>>> And merged into the main trunk eventually? It has been a while after I
>>> submitted this
>>> patch to the list. We hope this change could be merged into main trunk
>>> so my team could
>>> use it in the llvm official version. But we have waited for quite a
>>> while. We like to know
>>> if this is still possible. Please take a look and give us some advice.
>>> Thank you.
>>> 
>>> Sincerely,
>>> 
>>>                         Yin
>>> 
>>> From: Evan Cheng [mailto:evan.cheng at apple.com]
>>> Sent: Tuesday, April 17, 2012 10:36 PM
>>> To: Yin Ma
>>> Cc: llvm-commits at cs.uiuc.edu
>>> Subject: Re: [llvm-commits] LLVM patch to implement UMLAL/SMLAL
>>> Instructions for ARM Architecture.
>>> 
>>> Thanks. I think the patch is correct now. But I would very much
>>> appreciate another pair of eyes on it.
>>> 
>>> Evan
>>> 
>>> On Apr 17, 2012, at 11:29 AM, Yin Ma <yinma at codeaurora.org> wrote:
>>> 
>>> HI Evan,
>>> 
>>>     I have updated the source based on your latest comments.
>>> Thank you for reviewing.
>>> 
>>>                            Yin
>>> 
>>> From: Evan Cheng [mailto:evan.cheng at apple.com]
>>> Sent: Saturday, April 14, 2012 11:51 AM
>>> To: Yin Ma
>>> Cc: llvm-commits at cs.uiuc.edu
>>> Subject: Re: [llvm-commits] LLVM patch to implement UMLAL/SMLAL
>>> Instructions for ARM Architecture.
>>> 
>>> Sorry, I took a closer look and I find some issues.
>>> 
>>> // Multiply + accumulate
>>> -def SMLAL : AsMul1I64<0b0000111, (outs GPR:$RdLo, GPR:$RdHi),
>>> -                               (ins GPR:$Rn, GPR:$Rm), IIC_iMAC64,
>>> +def SMLAL : AsMla1I64<0b0000111, (outs GPR:$RdLo, GPR:$RdHi),
>>> +                               (ins GPR:$Rn, GPR:$Rm, GPR:$RLo,
>>> GPR:$RHi), IIC_iMAC64,
>>>                     "smlal", "\t$RdLo, $RdHi, $Rn, $Rm", []>,
>>> -                    Requires<[IsARM, HasV6]>;
>>> -def UMLAL : AsMul1I64<0b0000101, (outs GPR:$RdLo, GPR:$RdHi),
>>> -                               (ins GPR:$Rn, GPR:$Rm), IIC_iMAC64,
>>> +                    RegConstraint<"$RLo = $RdLo, $RHi = $RdHi">,
>>> Requires<[IsARM, HasV6]>;
>>> +def UMLAL : AsMla1I64<0b0000101, (outs GPR:$RdLo, GPR:$RdHi),
>>> +                               (ins GPR:$Rn, GPR:$Rm, GPR:$RLo,
>>> GPR:$RHi), IIC_iMAC64,
>>>                     "umlal", "\t$RdLo, $RdHi, $Rn, $Rm", []>,
>>> -                    Requires<[IsARM, HasV6]>;
>>> +                    RegConstraint<"$RLo = $RdLo, $RHi = $RdHi">,
>>> Requires<[IsARM, HasV6]>;
>>> 
>>> -let Constraints = "@earlyclobber $RdLo, at earlyclobber $RdHi" in {
>>> +let Constraints = "$RLo = $RdLo,$RHi = $RdHi" in {
>>> def SMLALv5 : ARMPseudoExpand<(outs GPR:$RdLo, GPR:$RdHi),
>>> -                              (ins GPR:$Rn, GPR:$Rm, pred:$p,
>>> cc_out:$s),
>>> +                              (ins GPR:$Rn, GPR:$Rm, GPR:$RLo,
>>> GPR:$RHi, pred:$p, cc_out:$s),
>>>                               4, IIC_iMAC64, [],
>>> -          (SMLAL GPR:$RdLo, GPR:$RdHi, GPR:$Rn, GPR:$Rm, pred:$p,
>>> cc_out:$s)>,
>>> +          (SMLAL GPR:$RdLo, GPR:$RdHi, GPR:$Rn, GPR:$Rm, GPR:$RLo,
>>> GPR:$RHi, pred:$p, cc_out:$s)>,
>>>                            Requires<[IsARM, NoV6]>;
>>> def UMLALv5 : ARMPseudoExpand<(outs GPR:$RdLo, GPR:$RdHi),
>>> -                              (ins GPR:$Rn, GPR:$Rm, pred:$p,
>>> cc_out:$s),
>>> -                              4, IIC_iMAC64, [],
>>> -          (UMLAL GPR:$RdLo, GPR:$RdHi, GPR:$Rn, GPR:$Rm, pred:$p,
>>> cc_out:$s)>,
>>> -                           Requires<[IsARM, NoV6]>;
>>> +                               (ins GPR:$Rn, GPR:$Rm, GPR:$RLo,
>>> GPR:$RHi, pred:$p, cc_out:$s),
>>> +                               4, IIC_iMAC64, [],
>>> +          (UMLAL GPR:$RdLo, GPR:$RdHi, GPR:$Rn, GPR:$Rm, GPR:$RLo,
>>> GPR:$RHi, pred:$p, cc_out:$s)>,
>>> +                            Requires<[IsARM, NoV6]>;
>>> +}
>>> +
>>> 
>>> These are beyond 80 columns.
>>> 
>>> +  // follow the glue value to get the second add
>>> +  // don't know how much uses of the first add
>>> +  // use while check
>>> 
>>> This comment doesn't make sense. Please correct.
>>> 
>>> Evan
>>> 
>>> On Apr 12, 2012, at 11:15 AM, Evan Cheng wrote:
>>> 
>>> 
>>> 
>>> LGTM. Can someone commit this for you?
>>> 
>>> Evan
>>> 
>>> On Apr 2, 2012, at 10:22 AM, Yin Ma wrote:
>>> 
>>> 
>>> 
>>> Hi,
>>> 
>>> I have updated the code based on your comments. I have put more comments
>>> on the code, especially for some conditional statements I cannot remove.
>>> Please
>>> review again.
>>> 
>>> Llmlal.diff is the code diff for the updated version
>>> Reports.simple.txt and result.txt are the new test results
>>> 
>>> Thanks,
>>> 
>>>                           Yin
>>> 
>>> 
>>> From: Evan Cheng [mailto:evan.cheng at apple.com]
>>> Sent: Thursday, March 15, 2012 11:07 AM
>>> To: Yin Ma
>>> Cc: llvm-commits at cs.uiuc.edu
>>> Subject: Re: [llvm-commits] LLVM patch to implement UMLAL/SMLAL
>>> Instructions for ARM Architecture.
>>> 
>>> 
>>> On Mar 15, 2012, at 10:17 AM, Yin Ma wrote:
>>> 
>>> 
>>> 
>>> 
>>> Hi Evan,
>>> 
>>>     Thank you for review this patch. I will rework on the code style
>>> based
>>> on your advice. Then please review it again.
>>> 
>>> For the question #8
>>> 8.
>>> There are a lot of failures in report.simple.txt. Why is that?
>>> 
>>> Those failures are not caused by my change. It is due to our current
>>> test machine setup.
>>> This patch didn’t increase any number of failures. After reworking on
>>> the style, I will
>>> Look for a better machine to run unit test. The failure number will
>>> change.
>>> 
>>> Ok. Please try to get a clean run. Otherwise it's not particularly
>>> useful to include as part of the patch review.
>>> 
>>> Evan
>>> 
>>> 
>>> 
>>> 
>>> 
>>> Thanks,
>>> 
>>>                 Yin
>>> 
>>> 
>>> 
>>> From: Evan Cheng [mailto:evan.cheng at apple.com]
>>> Sent: Thursday, March 15, 2012 12:01 AM
>>> To: Yin Ma
>>> Cc: llvm-commits at cs.uiuc.edu
>>> Subject: Re: [llvm-commits] LLVM patch to implement UMLAL/SMLAL
>>> Instructions for ARM Architecture.
>>> 
>>> Thanks. Preliminary reviews below.
>>> 
>>> The first thing I noticed is some of your stylistic choices are
>>> different from the rest of the code:
>>> 
>>> if( nValue != 2 ) return SDValue();
>>> 
>>> LLVM doesn't use camel case for variable name. Also, there should be a
>>> space before '(', not after.
>>> 
>>> +    }else{
>>> Should be } else {
>>> 
>>> Now onto the rest of the patch.
>>> 
>>> 1.
>>> +  case ARMISD::UMLAL:{
>>> +    if (Subtarget->isThumb1Only())
>>> +      break;
>>> 
>>> The check should not be needed, right? ARMISD::UMLAL cannot be formed
>>> for Thumb1.
>>> 
>>> +  // For UMLAL/SMLAL
>>> +  setTargetDAGCombine(ISD::ADDC);
>>> +  setTargetDAGCombine(ISD::ADDE);
>>> +
>>> 
>>> Should these be guarded with !(Subtarget->isThumb1Only()?
>>> 
>>> 2.
>>> +  case ISD::ADDE:       return PerformADDECCombine(N, DCI, Subtarget);
>>> +  case ISD::ADDC:       return PerformADDECCombine(N, DCI, Subtarget);
>>> 
>>> That's silly. It should be:
>>> +  case ISD::ADDE:
>>> +  case ISD::ADDC:       return PerformADDECCombine(N, DCI, Subtarget);
>>> 
>>> 3. Can you add more comments to AddCombineTo64bitMLAL()? Please describe
>>> what the routine is trying to match.
>>> 
>>> 4.
>>> +  // The second use must be a glue to a add
>>> +  int nValue = N->getNumValues();
>>> +  if( nValue != 2 ) return SDValue();
>>> 
>>> if (N->getNumValues() != 2) return SDValue();
>>> 
>>> The check isn't necessary. ADDE always produce two values.
>>> 
>>> 5.
>>> 
>>> +  EVT GVT = N->getValueType(1);
>>> +  if( VT != MVT::i32 || GVT != MVT::Glue ) return SDValue();
>>> 
>>> VT must be MVT::i32 after legalization, right? Are there cases where GVT
>>> might not be MVT::Glue?
>>> 
>>> +
>>> +  // look for glue value
>>> +  SDNode::use_iterator UI = N->use_begin();
>>> +  SDNode::use_iterator UE = N->use_end();
>>> +  SDNode* HiAdd = NULL;
>>> +  while( UI != UE ){
>>> +    SDUse& Nuse = UI.getUse();
>>> +    if( Nuse.getResNo() == 1 ){
>>> +      HiAdd = Nuse.getUser();
>>> +      break;
>>> +    }
>>> +    UI++;
>>> +  }
>>> 
>>> Is a loop necessary? A glue value can only have a single use.
>>> 
>>> 6. The rest of the routine has more stylistic issues. Also it's hard to
>>> understand without high level description.
>>> 
>>> 7.
>>> +/// PerformADDECCombine - Target-specific dag combine xforms for
>>> ISD::ADDE & ISD::ADDC for UMLAL.
>>> +///
>>> 
>>> Please be aware of 80 col violation.
>>> 
>>> +  SDValue Result = AddCombineTo64bitMLAL(N, DCI, Subtarget);
>>> +  if (Result.getNode())
>>> +      return Result;
>>> +
>>> +  // If that didn't work, try again with the operands commuted.
>>> +  return SDValue();
>>> +}
>>> 
>>> Isn't this just?
>>> return AddCombineTo64bitMLAL(N, DCI, Subtarget);
>>> 
>>> This routine seems unnecessary.
>>> 
>>> The comment indicates it should try again with operands commuted. That
>>> should be done in AddCombineTo64bitMLAL, no?
>>> 
>>> 8.
>>> There are a lot of failures in report.simple.txt. Why is that?
>>> 
>>> Evan
>>> 
>>> On Mar 8, 2012, at 4:15 PM, Yin Ma <yinma at codeaurora.org> wrote:
>>> 
>>> 
>>> 
>>> 
>>> 
>>> The current definition of UMLAL/SMLAL in LLVM for ARM is not used and
>>> the
>>> definition is not correct because the instruction reads the four values
>>> as the input values instead of two values defined in the .td file.
>>> 
>>> I have created a bugzilla entry  regarding to this issue:
>>> http://llvm.org/bugs/show_bug.cgi?id=12213
>>> 
>>> I am proposing a patch not only fixed the definition but also added the
>>> corresponding
>>> generation algorithm on DAG. This algorithm only operates on ARM
>>> backend. It identifies the
>>> opportunity of conversions during DAG process.
>>> 
>>> llmla.diff is the code change
>>> longMAC.ll is the test case for ARM
>>> longMACt.ll is the test case for Thumb2
>>> report.simple.txt is the result from test-suites
>>> result.txt is the result from test
>>> 
>>> Please give a review. Thanks,
>>> 
>>>                                        Yin
>>> 
>>> 
>>> <llmlal.diff><longMAC.ll><longMACt.ll><report.simple.txt><result.txt>_______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>> 
>>> 
>>> <llmlal.diff><longMAC.ll><longMACt.ll><report.simple.txt><result.txt>
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>> 
>>> <llmlal.diff>
>>> <longMAC.ll>
>>> <longMACt.ll>
>>> <report.simple.txt>
>>> <result.txt>
>> 
>> 
> 
> 
> -- 
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum.
> <yinmas_mla.patch>
> _______________________________________________
> 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