[llvm-commits] LLVM patch to implement UMLAL/SMLAL Instructions for ARM Architecture.

Evan Cheng evan.cheng at apple.com
Thu Mar 15 00:01:20 PDT 2012


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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120315/7efc7de1/attachment.html>


More information about the llvm-commits mailing list