1263320SdimPull in r200141 from upstream llvm trunk (by Jakob Stoklund Olesen):
2263320Sdim
3263320Sdim  Clean up the Legal/Expand logic for SPARC popc.
4263320Sdim
5269012SemasteIntroduced here: http://svnweb.freebsd.org/changeset/base/262261
6263320Sdim
7263320SdimIndex: lib/Target/Sparc/SparcSubtarget.cpp
8263320Sdim===================================================================
9263320Sdim--- lib/Target/Sparc/SparcSubtarget.cpp
10263320Sdim+++ lib/Target/Sparc/SparcSubtarget.cpp
11263320Sdim@@ -41,6 +41,10 @@ SparcSubtarget::SparcSubtarget(const std::string &
12263320Sdim 
13263320Sdim   // Parse features string.
14263320Sdim   ParseSubtargetFeatures(CPUName, FS);
15263320Sdim+
16263320Sdim+  // Popc is a v9-only instruction.
17263320Sdim+  if (!IsV9)
18263320Sdim+    UsePopc = false;
19263320Sdim }
20263320Sdim 
21263320Sdim 
22263320SdimIndex: lib/Target/Sparc/SparcISelLowering.cpp
23263320Sdim===================================================================
24263320Sdim--- lib/Target/Sparc/SparcISelLowering.cpp
25263320Sdim+++ lib/Target/Sparc/SparcISelLowering.cpp
26263320Sdim@@ -1461,8 +1461,8 @@ SparcTargetLowering::SparcTargetLowering(TargetMac
27263320Sdim     setOperationAction(ISD::BR_CC, MVT::i64, Custom);
28263320Sdim     setOperationAction(ISD::SELECT_CC, MVT::i64, Custom);
29263320Sdim 
30263320Sdim-    if (Subtarget->usePopc())
31263320Sdim-      setOperationAction(ISD::CTPOP, MVT::i64, Legal);
32263320Sdim+    setOperationAction(ISD::CTPOP, MVT::i64,
33263320Sdim+                       Subtarget->usePopc() ? Legal : Expand);
34263320Sdim     setOperationAction(ISD::CTTZ , MVT::i64, Expand);
35263320Sdim     setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i64, Expand);
36263320Sdim     setOperationAction(ISD::CTLZ , MVT::i64, Expand);
37263320Sdim@@ -1518,7 +1518,6 @@ SparcTargetLowering::SparcTargetLowering(TargetMac
38263320Sdim   setOperationAction(ISD::FSINCOS, MVT::f32, Expand);
39263320Sdim   setOperationAction(ISD::FREM , MVT::f32, Expand);
40263320Sdim   setOperationAction(ISD::FMA  , MVT::f32, Expand);
41263320Sdim-  setOperationAction(ISD::CTPOP, MVT::i32, Expand);
42263320Sdim   setOperationAction(ISD::CTTZ , MVT::i32, Expand);
43263320Sdim   setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32, Expand);
44263320Sdim   setOperationAction(ISD::CTLZ , MVT::i32, Expand);
45263320Sdim@@ -1568,8 +1567,8 @@ SparcTargetLowering::SparcTargetLowering(TargetMac
46263320Sdim 
47263320Sdim   setStackPointerRegisterToSaveRestore(SP::O6);
48263320Sdim 
49263320Sdim-  if (Subtarget->isV9() && Subtarget->usePopc())
50263320Sdim-    setOperationAction(ISD::CTPOP, MVT::i32, Legal);
51263320Sdim+  setOperationAction(ISD::CTPOP, MVT::i32,
52263320Sdim+                     Subtarget->usePopc() ? Legal : Expand);
53263320Sdim 
54263320Sdim   if (Subtarget->isV9() && Subtarget->hasHardQuad()) {
55263320Sdim     setOperationAction(ISD::LOAD, MVT::f128, Legal);
56263320SdimIndex: test/CodeGen/SPARC/64bit.ll
57263320Sdim===================================================================
58263320Sdim--- test/CodeGen/SPARC/64bit.ll
59263320Sdim+++ test/CodeGen/SPARC/64bit.ll
60263320Sdim@@ -1,5 +1,5 @@
61263320Sdim-; RUN: llc < %s -march=sparcv9 -disable-sparc-delay-filler -disable-sparc-leaf-proc | FileCheck %s
62263320Sdim-; RUN: llc < %s -march=sparcv9  | FileCheck %s -check-prefix=OPT
63263320Sdim+; RUN: llc < %s -march=sparcv9 -mattr=+popc -disable-sparc-delay-filler -disable-sparc-leaf-proc | FileCheck %s
64263320Sdim+; RUN: llc < %s -march=sparcv9 -mattr=+popc | FileCheck %s -check-prefix=OPT
65263320Sdim 
66263320Sdim ; CHECK-LABEL: ret2:
67263320Sdim ; CHECK: or %g0, %i1, %i0
68