diff options
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 12 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/crash.ll | 15 | 
2 files changed, 22 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 82bf4784943..aa283ad894e 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -4605,7 +4605,7 @@ SDValue DAGCombiner::visitBRCOND(SDNode *N) {    SDNode *Trunc = 0;    if (N1.getOpcode() == ISD::TRUNCATE && N1.hasOneUse()) { -    // Look pass truncate. +    // Look past truncate.      Trunc = N1.getNode();      N1 = N1.getOperand(0);    } @@ -4700,7 +4700,9 @@ SDValue DAGCombiner::visitBRCOND(SDNode *N) {            Equal = true;          } -      EVT SetCCVT = N1.getValueType(); +      SDValue NodeToReplace = Trunc ? SDValue(Trunc, 0) : N1; +       +      EVT SetCCVT = NodeToReplace.getValueType();        if (LegalTypes)          SetCCVT = TLI.getSetCCResultType(SetCCVT);        SDValue SetCC = DAG.getSetCC(TheXor->getDebugLoc(), @@ -4709,9 +4711,9 @@ SDValue DAGCombiner::visitBRCOND(SDNode *N) {                                     Equal ? ISD::SETEQ : ISD::SETNE);        // Replace the uses of XOR with SETCC        WorkListRemover DeadNodes(*this); -      DAG.ReplaceAllUsesOfValueWith(N1, SetCC, &DeadNodes); -      removeFromWorkList(N1.getNode()); -      DAG.DeleteNode(N1.getNode()); +      DAG.ReplaceAllUsesOfValueWith(NodeToReplace, SetCC, &DeadNodes); +      removeFromWorkList(NodeToReplace.getNode()); +      DAG.DeleteNode(NodeToReplace.getNode());        return DAG.getNode(ISD::BRCOND, N->getDebugLoc(),                           MVT::Other, Chain, SetCC, N2);      } diff --git a/llvm/test/CodeGen/X86/crash.ll b/llvm/test/CodeGen/X86/crash.ll index 1e13046f2ac..b9037f35929 100644 --- a/llvm/test/CodeGen/X86/crash.ll +++ b/llvm/test/CodeGen/X86/crash.ll @@ -18,3 +18,18 @@ entry:    volatile store i32 %conv19.i, i32* undef    ret i32 undef  } + +; PR6533 +define void @test2(i1 %x, i32 %y) nounwind { +  %land.ext = zext i1 %x to i32                   ; <i32> [#uses=1] +  %and = and i32 %y, 1                        ; <i32> [#uses=1] +  %xor = xor i32 %and, %land.ext                  ; <i32> [#uses=1] +  %cmp = icmp eq i32 %xor, 1                      ; <i1> [#uses=1] +  br i1 %cmp, label %if.end, label %if.then + +if.then:                                          ; preds = %land.end +  ret void + +if.end:                                           ; preds = %land.end +  ret void +}  | 

