summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/patches/patch-r262261-llvm-r200141-sparc.diff
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/patches/patch-r262261-llvm-r200141-sparc.diff')
-rw-r--r--contrib/llvm/patches/patch-r262261-llvm-r200141-sparc.diff67
1 files changed, 67 insertions, 0 deletions
diff --git a/contrib/llvm/patches/patch-r262261-llvm-r200141-sparc.diff b/contrib/llvm/patches/patch-r262261-llvm-r200141-sparc.diff
new file mode 100644
index 0000000..d8016e8
--- /dev/null
+++ b/contrib/llvm/patches/patch-r262261-llvm-r200141-sparc.diff
@@ -0,0 +1,67 @@
+Pull in r200141 from upstream llvm trunk (by Jakob Stoklund Olesen):
+
+ Clean up the Legal/Expand logic for SPARC popc.
+
+Introduced here: http://svn.freebsd.org/changeset/base/262261
+
+Index: lib/Target/Sparc/SparcSubtarget.cpp
+===================================================================
+--- lib/Target/Sparc/SparcSubtarget.cpp
++++ lib/Target/Sparc/SparcSubtarget.cpp
+@@ -41,6 +41,10 @@ SparcSubtarget::SparcSubtarget(const std::string &
+
+ // Parse features string.
+ ParseSubtargetFeatures(CPUName, FS);
++
++ // Popc is a v9-only instruction.
++ if (!IsV9)
++ UsePopc = false;
+ }
+
+
+Index: lib/Target/Sparc/SparcISelLowering.cpp
+===================================================================
+--- lib/Target/Sparc/SparcISelLowering.cpp
++++ lib/Target/Sparc/SparcISelLowering.cpp
+@@ -1461,8 +1461,8 @@ SparcTargetLowering::SparcTargetLowering(TargetMac
+ setOperationAction(ISD::BR_CC, MVT::i64, Custom);
+ setOperationAction(ISD::SELECT_CC, MVT::i64, Custom);
+
+- if (Subtarget->usePopc())
+- setOperationAction(ISD::CTPOP, MVT::i64, Legal);
++ setOperationAction(ISD::CTPOP, MVT::i64,
++ Subtarget->usePopc() ? Legal : Expand);
+ setOperationAction(ISD::CTTZ , MVT::i64, Expand);
+ setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i64, Expand);
+ setOperationAction(ISD::CTLZ , MVT::i64, Expand);
+@@ -1518,7 +1518,6 @@ SparcTargetLowering::SparcTargetLowering(TargetMac
+ setOperationAction(ISD::FSINCOS, MVT::f32, Expand);
+ setOperationAction(ISD::FREM , MVT::f32, Expand);
+ setOperationAction(ISD::FMA , MVT::f32, Expand);
+- setOperationAction(ISD::CTPOP, MVT::i32, Expand);
+ setOperationAction(ISD::CTTZ , MVT::i32, Expand);
+ setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32, Expand);
+ setOperationAction(ISD::CTLZ , MVT::i32, Expand);
+@@ -1568,8 +1567,8 @@ SparcTargetLowering::SparcTargetLowering(TargetMac
+
+ setStackPointerRegisterToSaveRestore(SP::O6);
+
+- if (Subtarget->isV9() && Subtarget->usePopc())
+- setOperationAction(ISD::CTPOP, MVT::i32, Legal);
++ setOperationAction(ISD::CTPOP, MVT::i32,
++ Subtarget->usePopc() ? Legal : Expand);
+
+ if (Subtarget->isV9() && Subtarget->hasHardQuad()) {
+ setOperationAction(ISD::LOAD, MVT::f128, Legal);
+Index: test/CodeGen/SPARC/64bit.ll
+===================================================================
+--- test/CodeGen/SPARC/64bit.ll
++++ test/CodeGen/SPARC/64bit.ll
+@@ -1,5 +1,5 @@
+-; RUN: llc < %s -march=sparcv9 -disable-sparc-delay-filler -disable-sparc-leaf-proc | FileCheck %s
+-; RUN: llc < %s -march=sparcv9 | FileCheck %s -check-prefix=OPT
++; RUN: llc < %s -march=sparcv9 -mattr=+popc -disable-sparc-delay-filler -disable-sparc-leaf-proc | FileCheck %s
++; RUN: llc < %s -march=sparcv9 -mattr=+popc | FileCheck %s -check-prefix=OPT
+
+ ; CHECK-LABEL: ret2:
+ ; CHECK: or %g0, %i1, %i0
OpenPOWER on IntegriCloud