summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2016-08-02 23:12:36 +0000
committerTim Northover <tnorthover@apple.com>2016-08-02 23:12:36 +0000
commit765777ce67e87365be0c0df178b85a877accb6a1 (patch)
tree4b83e080c53ddb5a401b4cf245ee6dda11920dfc
parent395cc09444b114bfb0f860bcd5c3d0365e7ca18c (diff)
downloadbcm5719-llvm-765777ce67e87365be0c0df178b85a877accb6a1.tar.gz
bcm5719-llvm-765777ce67e87365be0c0df178b85a877accb6a1.zip
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. llvm-svn: 277541
-rw-r--r--llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp3
-rw-r--r--llvm/test/CodeGen/ARM/smml.ll21
2 files changed, 23 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
index ab20e4dee7b..d11de555fa3 100644
--- a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -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())
diff --git a/llvm/test/CodeGen/ARM/smml.ll b/llvm/test/CodeGen/ARM/smml.ll
index 807445fcad9..1d6273ca204 100644
--- a/llvm/test/CodeGen/ARM/smml.ll
+++ b/llvm/test/CodeGen/ARM/smml.ll
@@ -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
+}
OpenPOWER on IntegriCloud