Fixed bug when custom lowering DEC64m on x86.
authorPete Cooper <peter_cooper@apple.com>
Mon, 13 Feb 2012 00:10:03 +0000 (00:10 +0000)
committerPete Cooper <peter_cooper@apple.com>
Mon, 13 Feb 2012 00:10:03 +0000 (00:10 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150356 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelDAGToDAG.cpp
test/CodeGen/X86/dec-eflags-lower.ll

index 830cb65878e2d00b5ed9f6ce48d42016e9550747..709be5f8530d75d7ebf7324002f00e39654b8ae7 100644 (file)
@@ -2378,6 +2378,7 @@ SDNode *X86DAGToDAGISel::Select(SDNode *Node) {
         Chain->getOpcode() != ISD::LOAD ||
         StoredVal->getOpcode() != X86ISD::DEC ||
         StoredVal.getResNo() != 0 ||
+        !StoredVal.getNode()->hasNUsesOfValue(1, 0) ||
         StoredVal->getOperand(0).getNode() != Chain.getNode())
       break;
 
index 458160a4bfc005e63d33b91879736d56cf509da1..841a4615f53992b7e2ef3b4bda0ed17d89e97792 100644 (file)
@@ -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 @@ return:                                           ; preds = %entry, %if.end
   ret void
 }
 
+@c = common global i64 0, align 8
+@a = common global i32 0, align 4
+@.str = private unnamed_addr constant [5 x i8] c"%ld\0A\00", align 1
+@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}