Pull in r201718 from upstream llvm trunk (by Roman Divacky): Expand 64bit {SHL,SHR,SRA}_PARTS on sparcv9. Introduced here: http://svnweb.freebsd.org/changeset/base/262265 Index: test/CodeGen/SPARC/parts.ll =================================================================== --- test/CodeGen/SPARC/parts.ll +++ test/CodeGen/SPARC/parts.ll @@ -0,0 +1,14 @@ +; RUN: llc < %s -march=sparcv9 | FileCheck %s + +; CHECK-LABEL: test +; CHECK: srl %i1, 0, %o2 +; CHECK-NEXT: or %g0, %i2, %o0 +; CHECK-NEXT: call __ashlti3 +; CHECK-NEXT: or %g0, %i3, %o1 +; CHECK-NEXT: or %g0, %o0, %i0 + +define i128 @test(i128 %a, i128 %b) { +entry: + %tmp = shl i128 %b, %a + ret i128 %tmp +} Index: lib/Target/Sparc/SparcISelLowering.cpp =================================================================== --- lib/Target/Sparc/SparcISelLowering.cpp +++ lib/Target/Sparc/SparcISelLowering.cpp @@ -1554,6 +1554,10 @@ SparcTargetLowering::SparcTargetLowering(TargetMac setOperationAction(ISD::UMULO, MVT::i64, Custom); setOperationAction(ISD::SMULO, MVT::i64, Custom); + + setOperationAction(ISD::SHL_PARTS, MVT::i64, Expand); + setOperationAction(ISD::SRA_PARTS, MVT::i64, Expand); + setOperationAction(ISD::SRL_PARTS, MVT::i64, Expand); } // VASTART needs to be custom lowered to use the VarArgsFrameIndex.