diff options
author | Bill Wendling <isanbard@gmail.com> | 2010-04-20 01:25:01 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2010-04-20 01:25:01 +0000 |
commit | 467e6c2deb2fb47fa22b5ff02651daade327c78f (patch) | |
tree | a19f51947d4860719d73ef2fbb1fad0899c4e57e | |
parent | 4025306a91c78ecfc23cde2311d90b1b65f28e2a (diff) | |
download | bcm5719-llvm-467e6c2deb2fb47fa22b5ff02651daade327c78f.tar.gz bcm5719-llvm-467e6c2deb2fb47fa22b5ff02651daade327c78f.zip |
The visitXOR method can return the same SDNode. If so, we don't want to delete
it as it's not dead.
llvm-svn: 101855
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll | 58 |
2 files changed, 59 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index f15c121668f..7ece6e85216 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/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/llvm/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll b/llvm/test/CodeGen/X86/2010-04-19-DAGCombineCrash.ll new file mode 100644 index 00000000000..4d73c648433 --- /dev/null +++ b/llvm/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 ; <i1> [#uses=1] + %1 = load i8* undef, align 8 ; <i8> [#uses=1] + %2 = shl i8 %1, 4 ; <i8> [#uses=1] + %3 = lshr i8 %2, 7 ; <i8> [#uses=1] + %4 = trunc i8 %3 to i1 ; <i1> [#uses=1] + %5 = icmp ne i1 %0, %4 ; <i1> [#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 +} |