[llvm] 21a8b9d - [ARM] Limit PerformExtractEltToVMOVRRD to when f64 is legal.
David Green via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 20 08:25:00 PDT 2021
Author: David Green
Date: 2021-04-20T16:24:36+01:00
New Revision: 21a8b9d9e9e110fe82728226f185a35e15d1af0d
URL: https://github.com/llvm/llvm-project/commit/21a8b9d9e9e110fe82728226f185a35e15d1af0d
DIFF: https://github.com/llvm/llvm-project/commit/21a8b9d9e9e110fe82728226f185a35e15d1af0d.diff
LOG: [ARM] Limit PerformExtractEltToVMOVRRD to when f64 is legal.
The generic SoftFloatVectorExtract.ll test was failing when run on arm
machines, as it tries to create a f64 under soft float. Limit the
transform to when f64 is legal.
Also add a missing override, as reported in D100244.
Added:
llvm/test/CodeGen/ARM/SoftFloatVectorExtract.ll
Modified:
llvm/lib/Target/ARM/ARMBaseRegisterInfo.h
llvm/lib/Target/ARM/ARMISelLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h b/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h
index d29535bb91e5..57d7842c63ca 100644
--- a/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h
+++ b/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h
@@ -213,7 +213,7 @@ class ARMBaseRegisterInfo : public ARMGenRegisterInfo {
bool shouldRewriteCopySrc(const TargetRegisterClass *DefRC,
unsigned DefSubReg,
const TargetRegisterClass *SrcRC,
- unsigned SrcSubReg) const;
+ unsigned SrcSubReg) const override;
};
} // end namespace llvm
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 5084860a728a..e5f47939055e 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -14090,7 +14090,8 @@ PerformExtractEltToVMOVRRD(SDNode *N, TargetLowering::DAGCombinerInfo &DCI) {
EVT VT = N->getValueType(0);
SDLoc dl(N);
- if (!DCI.isAfterLegalizeDAG() || VT != MVT::i32)
+ if (!DCI.isAfterLegalizeDAG() || VT != MVT::i32 ||
+ !DCI.DAG.getTargetLoweringInfo().isTypeLegal(MVT::f64))
return SDValue();
SDValue Ext = SDValue(N, 0);
diff --git a/llvm/test/CodeGen/ARM/SoftFloatVectorExtract.ll b/llvm/test/CodeGen/ARM/SoftFloatVectorExtract.ll
new file mode 100644
index 000000000000..b27c0ddbb4e9
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/SoftFloatVectorExtract.ll
@@ -0,0 +1,23 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=armv7a-linux-gnu < %s | FileCheck %s
+
+; Copied from llvm/test/CodeGen/Generic/2009-03-29-SoftFloatVectorExtract.ll,
+; making sure that soft float extract works on v7a soft float triples.
+
+ at m = external global <2 x double>
+
+define double @vector_ex() nounwind #0 {
+; CHECK-LABEL: vector_ex:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: movw r0, :lower16:m
+; CHECK-NEXT: movt r0, :upper16:m
+; CHECK-NEXT: vld1.64 {d16, d17}, [r0]
+; CHECK-NEXT: vmov.32 r0, d17[0]
+; CHECK-NEXT: vmov.32 r1, d17[1]
+; CHECK-NEXT: bx lr
+ %v = load <2 x double>, <2 x double>* @m
+ %x = extractelement <2 x double> %v, i32 1
+ ret double %x
+}
+
+attributes #0 = { "use-soft-float" = "true" }
More information about the llvm-commits
mailing list