Pull in r198280 from upstream llvm trunk (by Venkatraman Govindaraju): [SparcV9]: Use SRL instead of SLL to clear top 32-bits in ctpop:i32. SLL does not clear top 32 bit, only SRL does. Introduced here: http://svnweb.freebsd.org/changeset/base/262261 Index: lib/Target/Sparc/SparcInstrInfo.td =================================================================== --- lib/Target/Sparc/SparcInstrInfo.td +++ lib/Target/Sparc/SparcInstrInfo.td @@ -967,13 +967,13 @@ let Predicates = [HasV9] in { } // POPCrr - This does a ctpop of a 64-bit register. As such, we have to clear -// the top 32-bits before using it. To do this clearing, we use a SLLri X,0. +// the top 32-bits before using it. To do this clearing, we use a SRLri X,0. let rs1 = 0 in def POPCrr : F3_1<2, 0b101110, (outs IntRegs:$dst), (ins IntRegs:$src), "popc $src, $dst", []>, Requires<[HasV9]>; def : Pat<(ctpop i32:$src), - (POPCrr (SLLri $src, 0))>; + (POPCrr (SRLri $src, 0))>; //===----------------------------------------------------------------------===// // Non-Instruction Patterns Index: test/CodeGen/SPARC/ctpop.ll =================================================================== --- test/CodeGen/SPARC/ctpop.ll +++ test/CodeGen/SPARC/ctpop.ll @@ -1,8 +1,22 @@ -; RUN: llc < %s -march=sparc -mattr=-v9 | not grep popc -; RUN: llc < %s -march=sparc -mattr=+v9 | grep popc +; RUN: llc < %s -march=sparc -mattr=-v9 | FileCheck %s -check-prefix=V8 +; RUN: llc < %s -march=sparc -mattr=+v9 | FileCheck %s -check-prefix=V9 +; RUN: llc < %s -march=sparcv9 | FileCheck %s -check-prefix=SPARC64 declare i32 @llvm.ctpop.i32(i32) +; V8-LABEL: test +; V8-NOT : popc + +; V9-LABEL: test +; V9: srl %o0, 0, %o0 +; V9-NEXT: jmp %o7+8 +; V9-NEXT: popc %o0, %o0 + +; SPARC64-LABEL: test +; SPARC64: srl %o0, 0, %o0 +; SPARC64: jmp %o7+8 +; SPARC64: popc %o0, %o0 + define i32 @test(i32 %X) { %Y = call i32 @llvm.ctpop.i32( i32 %X ) ; [#uses=1] ret i32 %Y