[llvm-commits] [llvm] r150356 - in /llvm/trunk: lib/Target/X86/X86ISelDAGToDAG.cpp test/CodeGen/X86/dec-eflags-lower.ll

Pete Cooper peter_cooper at apple.com
Sun Feb 12 16:10:03 PST 2012


Author: pete
Date: Sun Feb 12 18:10:03 2012
New Revision: 150356

URL: http://llvm.org/viewvc/llvm-project?rev=150356&view=rev
Log:
Fixed bug when custom lowering DEC64m on x86.

If the DEC node had more than one user, it was doing this lowering but
leaving the original DEC node around and so decrementing twice.

Fixes PR11964.

Modified:
    llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp
    llvm/trunk/test/CodeGen/X86/dec-eflags-lower.ll

Modified: llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp?rev=150356&r1=150355&r2=150356&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelDAGToDAG.cpp Sun Feb 12 18:10:03 2012
@@ -2378,6 +2378,7 @@
         Chain->getOpcode() != ISD::LOAD ||
         StoredVal->getOpcode() != X86ISD::DEC ||
         StoredVal.getResNo() != 0 ||
+        !StoredVal.getNode()->hasNUsesOfValue(1, 0) ||
         StoredVal->getOperand(0).getNode() != Chain.getNode())
       break;
 

Modified: llvm/trunk/test/CodeGen/X86/dec-eflags-lower.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/dec-eflags-lower.ll?rev=150356&r1=150355&r2=150356&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/dec-eflags-lower.ll (original)
+++ llvm/trunk/test/CodeGen/X86/dec-eflags-lower.ll Sun Feb 12 18:10:03 2012
@@ -2,6 +2,7 @@
 
 %struct.obj = type { i64 }
 
+; CHECK: _Z7releaseP3obj
 define void @_Z7releaseP3obj(%struct.obj* nocapture %o) nounwind uwtable ssp {
 entry:
 ; CHECK: decq	(%{{rdi|rcx}})
@@ -22,8 +23,31 @@
   ret void
 }
 
+ at c = common global i64 0, align 8
+ at a = common global i32 0, align 4
+ at .str = private unnamed_addr constant [5 x i8] c"%ld\0A\00", align 1
+ at b = common global i32 0, align 4
+
+; CHECK: test
+define i32 @test() nounwind uwtable ssp {
+entry:
+; CHECK: decq
+; CHECK-NOT: decq
+%0 = load i64* @c, align 8, !tbaa !0
+%dec.i = add nsw i64 %0, -1
+store i64 %dec.i, i64* @c, align 8, !tbaa !0
+%tobool.i = icmp ne i64 %dec.i, 0
+%lor.ext.i = zext i1 %tobool.i to i32
+store i32 %lor.ext.i, i32* @a, align 4, !tbaa !3
+%call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([5 x i8]* @.str, i64 0, i64 0), i64 %dec.i) nounwind
+ret i32 0
+}
+
+declare i32 @printf(i8* nocapture, ...) nounwind
+
 declare void @free(i8* nocapture) nounwind
 
 !0 = metadata !{metadata !"long", metadata !1}
 !1 = metadata !{metadata !"omnipotent char", metadata !2}
 !2 = metadata !{metadata !"Simple C/C++ TBAA", null}
+!3 = metadata !{metadata !"int", metadata !1}





More information about the llvm-commits mailing list