From 86c5abb4c0edfffdd24729e142a62b9b949f025d Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Tue, 20 Apr 2010 01:25:01 +0000 Subject: [PATCH] The visitXOR method can return the same SDNode. If so, we don't want to delete it as it's not dead. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101855 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 2 +- .../CodeGen/X86/2010-04-19-DAGCombineCrash.ll | 58 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index f15c121668f..7ece6e85216 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -4911,7 +4911,7 @@ SDValue DAGCombiner::visitBRCOND(SDNode *N) { if (Op0.getOpcode() == Op1.getOpcode()) { // Avoid missing important xor optimizations. SDValue Tmp = visitXOR(TheXor); - if (Tmp.getNode()) { + if (Tmp.getNode() && Tmp.getNode() != TheXor) { DEBUG(dbgs() << "\nReplacing.8 "; TheXor->dump(&DAG); dbgs() << "\nWith: "; diff --git a/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll b/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll new file mode 100644 index 00000000000..4d73c648433 --- /dev/null +++ b/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll @@ -0,0 +1,58 @@ +; RUN: llc < %s -mtriple=i386-apple-darwin +; rdar://7869290 + +%struct.anon = type { float } + +define void @func() nounwind ssp { +entry: + br label %bb66 + +bb: ; preds = %bb66 + br i1 undef, label %bb65, label %bb2 + +bb2: ; preds = %bb + br i1 undef, label %bb65, label %bb3 + +bb3: ; preds = %bb2 + br i1 undef, label %bb65, label %bb4 + +bb4: ; preds = %bb3 + br i1 undef, label %bb65, label %bb5 + +bb5: ; preds = %bb4 + br i1 undef, label %bb65, label %bb6 + +bb6: ; preds = %bb5 + br i1 undef, label %bb65, label %bb11 + +bb11: ; preds = %bb6 + br i1 undef, label %bb65, label %bb12 + +bb12: ; preds = %bb11 + br i1 undef, label %bb65, label %bb13 + +bb13: ; preds = %bb12 + br i1 undef, label %bb65, label %bb14 + +bb14: ; preds = %bb13 + %0 = trunc i16 undef to i1 ; [#uses=1] + %1 = load i8* undef, align 8 ; [#uses=1] + %2 = shl i8 %1, 4 ; [#uses=1] + %3 = lshr i8 %2, 7 ; [#uses=1] + %4 = trunc i8 %3 to i1 ; [#uses=1] + %5 = icmp ne i1 %0, %4 ; [#uses=1] + br i1 %5, label %bb65, label %bb15 + +bb15: ; preds = %bb14 + %6 = load %struct.anon** undef, align 8 ; <%struct.anon*> [#uses=0] + br label %bb65 + +bb65: ; preds = %bb15, %bb14, %bb13, %bb12, %bb11, %bb6, %bb5, %bb4, %bb3, %bb2, %bb + br label %bb66 + +bb66: ; preds = %bb65, %entry + br i1 undef, label %bb, label %bb67 + +bb67: ; preds = %bb66 + ret void +}