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