mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-02 07:32:52 +00:00
Fix a DAG combine bug visitBRCOND() is transforming br(xor(x, y)) to br(x != y).
It cahced XOR's operands before calling visitXOR() but failed to update the operands when visitXOR changed the XOR node. rdar://12968664 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171999 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f48acd5ecd
commit
78ec0255d9
@ -6735,7 +6735,8 @@ SDValue DAGCombiner::visitBRCOND(SDNode *N) {
|
|||||||
if (Op0.getOpcode() == Op1.getOpcode()) {
|
if (Op0.getOpcode() == Op1.getOpcode()) {
|
||||||
// Avoid missing important xor optimizations.
|
// Avoid missing important xor optimizations.
|
||||||
SDValue Tmp = visitXOR(TheXor);
|
SDValue Tmp = visitXOR(TheXor);
|
||||||
if (Tmp.getNode() && Tmp.getNode() != TheXor) {
|
if (Tmp.getNode()) {
|
||||||
|
if (Tmp.getNode() != TheXor) {
|
||||||
DEBUG(dbgs() << "\nReplacing.8 ";
|
DEBUG(dbgs() << "\nReplacing.8 ";
|
||||||
TheXor->dump(&DAG);
|
TheXor->dump(&DAG);
|
||||||
dbgs() << "\nWith: ";
|
dbgs() << "\nWith: ";
|
||||||
@ -6748,6 +6749,11 @@ SDValue DAGCombiner::visitBRCOND(SDNode *N) {
|
|||||||
return DAG.getNode(ISD::BRCOND, N->getDebugLoc(),
|
return DAG.getNode(ISD::BRCOND, N->getDebugLoc(),
|
||||||
MVT::Other, Chain, Tmp, N2);
|
MVT::Other, Chain, Tmp, N2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// visitXOR has changed XOR's operands.
|
||||||
|
Op0 = TheXor->getOperand(0);
|
||||||
|
Op1 = TheXor->getOperand(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Op0.getOpcode() != ISD::SETCC && Op1.getOpcode() != ISD::SETCC) {
|
if (Op0.getOpcode() != ISD::SETCC && Op1.getOpcode() != ISD::SETCC) {
|
||||||
|
41
test/CodeGen/X86/2013-01-09-DAGCombineBug.ll
Normal file
41
test/CodeGen/X86/2013-01-09-DAGCombineBug.ll
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
; RUN: llc -mtriple=x86_64-apple-macosx10.5.0 < %s
|
||||||
|
|
||||||
|
; rdar://12968664
|
||||||
|
|
||||||
|
define void @t() nounwind uwtable ssp {
|
||||||
|
br label %4
|
||||||
|
|
||||||
|
; <label>:1 ; preds = %4, %2
|
||||||
|
ret void
|
||||||
|
|
||||||
|
; <label>:2 ; preds = %6, %5, %3, %2
|
||||||
|
switch i32 undef, label %2 [
|
||||||
|
i32 1090573978, label %1
|
||||||
|
i32 1090573938, label %3
|
||||||
|
i32 1090573957, label %5
|
||||||
|
]
|
||||||
|
|
||||||
|
; <label>:3 ; preds = %4, %2
|
||||||
|
br i1 undef, label %2, label %4
|
||||||
|
|
||||||
|
; <label>:4 ; preds = %6, %5, %3, %0
|
||||||
|
switch i32 undef, label %11 [
|
||||||
|
i32 1090573938, label %3
|
||||||
|
i32 1090573957, label %5
|
||||||
|
i32 1090573978, label %1
|
||||||
|
i32 165205179, label %6
|
||||||
|
]
|
||||||
|
|
||||||
|
; <label>:5 ; preds = %4, %2
|
||||||
|
br i1 undef, label %2, label %4
|
||||||
|
|
||||||
|
; <label>:6 ; preds = %4
|
||||||
|
%7 = icmp eq i32 undef, 590901838
|
||||||
|
%8 = or i1 false, %7
|
||||||
|
%9 = or i1 true, %8
|
||||||
|
%10 = xor i1 %8, %9
|
||||||
|
br i1 %10, label %4, label %2
|
||||||
|
|
||||||
|
; <label>:11 ; preds = %11, %4
|
||||||
|
br label %11
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user