[llvm] r277541 - ARM: only form SMMLS when SUBE flags unused.

Tim Northover via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 2 16:12:37 PDT 2016


Author: tnorthover
Date: Tue Aug  2 18:12:36 2016
New Revision: 277541

URL: http://llvm.org/viewvc/llvm-project?rev=277541&view=rev
Log:
ARM: only form SMMLS when SUBE flags unused.

In this particular example we wouldn't want the smmls anyway (the value is
actually unused), but in general smmls does not provide the required flags
register so if that SUBE result is used we can't replace it.

Modified:
    llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp
    llvm/trunk/test/CodeGen/ARM/smml.ll

Modified: llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp?rev=277541&r1=277540&r2=277541&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMISelDAGToDAG.cpp Tue Aug  2 18:12:36 2016
@@ -3047,7 +3047,8 @@ void ARMDAGToDAGISel::Select(SDNode *N)
     // Look for a pattern to match SMMLS
     // (sube a, (smul_loHi a, b), (subc 0, (smul_LOhi(a, b))))
     if (N->getOperand(1).getOpcode() != ISD::SMUL_LOHI ||
-        N->getOperand(2).getOpcode() != ARMISD::SUBC)
+        N->getOperand(2).getOpcode() != ARMISD::SUBC ||
+        !SDValue(N, 1).use_empty())
       break;
 
     if (Subtarget->isThumb())

Modified: llvm/trunk/test/CodeGen/ARM/smml.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/smml.ll?rev=277541&r1=277540&r2=277541&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/smml.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/smml.ll Tue Aug  2 18:12:36 2016
@@ -44,3 +44,24 @@ entry:
   %conv3 = trunc i64 %shr7 to i32
   ret i32 %conv3
 }
+
+declare void @opaque(i32)
+define void @test_used_flags(i32 %in1, i32 %in2) {
+; CHECK-V7-LABEL: test_used_flags:
+; CHECK-V7: smull [[PROD_LO:r[0-9]+]], [[PROD_HI:r[0-9]+]], r0, r1
+; CHECK-V7: rsbs {{.*}}, [[PROD_LO]], #0
+; CHECK-V7: rscs {{.*}}, [[PROD_HI]], #0
+  %in1.64 = sext i32 %in1 to i64
+  %in2.64 = sext i32 %in2 to i64
+  %mul = mul nsw i64 %in1.64, %in2.64
+  %tst = icmp slt i64 %mul, 1
+  br i1 %tst, label %true, label %false
+
+true:
+  call void @opaque(i32 42)
+  ret void
+
+false:
+  call void @opaque(i32 56)
+  ret void
+}




More information about the llvm-commits mailing list