[llvm-commits] [llvm] r123664 - in /llvm/trunk: lib/CodeGen/SelectionDAG/TargetLowering.cpp test/CodeGen/X86/ctpop-combine.ll

Benjamin Kramer benny.kra at googlemail.com
Mon Jan 17 10:00:28 PST 2011


Author: d0k
Date: Mon Jan 17 12:00:28 2011
New Revision: 123664

URL: http://llvm.org/viewvc/llvm-project?rev=123664&view=rev
Log:
Fix an off-by-one error in ctpop combining.

Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
    llvm/trunk/test/CodeGen/X86/ctpop-combine.ll

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=123664&r1=123663&r2=123664&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Mon Jan 17 12:00:28 2011
@@ -1876,7 +1876,7 @@
       CTPOP = N0.getOperand(0);
 
     if (CTPOP.hasOneUse() && CTPOP.getOpcode() == ISD::CTPOP &&
-        (N0 == CTPOP || N0.getValueType().getSizeInBits() >=
+        (N0 == CTPOP || N0.getValueType().getSizeInBits() >
                         Log2_32_Ceil(CTPOP.getValueType().getSizeInBits()))) {
       EVT CTVT = CTPOP.getValueType();
       SDValue CTOp = CTPOP.getOperand(0);

Modified: llvm/trunk/test/CodeGen/X86/ctpop-combine.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/ctpop-combine.ll?rev=123664&r1=123663&r2=123664&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/ctpop-combine.ll (original)
+++ llvm/trunk/test/CodeGen/X86/ctpop-combine.ll Mon Jan 17 12:00:28 2011
@@ -18,8 +18,7 @@
 
 define i32 @test2(i64 %x) nounwind readnone {
   %count = tail call i64 @llvm.ctpop.i64(i64 %x)
-  %cast = trunc i64 %count to i32
-  %cmp = icmp ult i32 %cast, 2
+  %cmp = icmp ult i64 %count, 2
   %conv = zext i1 %cmp to i32
   ret i32 %conv
 ; CHECK: test2:
@@ -29,3 +28,13 @@
 ; CHECK: ret
 }
 
+define i32 @test3(i64 %x) nounwind readnone {
+  %count = tail call i64 @llvm.ctpop.i64(i64 %x)
+  %cast = trunc i64 %count to i6 ; Too small for 0-64
+  %cmp = icmp ult i6 %cast, 2
+  %conv = zext i1 %cmp to i32
+  ret i32 %conv
+; CHECK: test3:
+; CHECK: cmpb $2
+; CHECK: ret
+}





More information about the llvm-commits mailing list