diff options
| author | Tim Northover <tnorthover@apple.com> | 2017-05-02 22:45:19 +0000 |
|---|---|---|
| committer | Tim Northover <tnorthover@apple.com> | 2017-05-02 22:45:19 +0000 |
| commit | 4a01ffbd6aca4a26f4a7b6f9112e920a56ff6e07 (patch) | |
| tree | 12488b10098b01dc35949673a950b333c3020c77 /llvm/lib | |
| parent | 9decbfee32cd1ff8538cbb97e1ec4d7ee7cb577e (diff) | |
| download | bcm5719-llvm-4a01ffbd6aca4a26f4a7b6f9112e920a56ff6e07.tar.gz bcm5719-llvm-4a01ffbd6aca4a26f4a7b6f9112e920a56ff6e07.zip | |
ARM: avoid handing a deleted node back to TableGen during ISel.
When we replaced the multiplicand the destination node might already exist.
When that happens the original gets CSEd and deleted. However, it's actually
used as the offset so nonsense is produced.
Should fix PR32726.
llvm-svn: 301983
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp index e9df9449103..7f9fe55a5c3 100644 --- a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp +++ b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp @@ -740,7 +740,9 @@ bool ARMDAGToDAGISel::SelectLdStSOReg(SDValue N, SDValue &Base, SDValue &Offset, unsigned PowerOfTwo = 0; SDValue NewMulConst; if (canExtractShiftFromMul(Offset, 31, PowerOfTwo, NewMulConst)) { + HandleSDNode Handle(Offset); replaceDAGValue(Offset.getOperand(1), NewMulConst); + Offset = Handle.getValue(); ShAmt = PowerOfTwo; ShOpcVal = ARM_AM::lsl; } @@ -1420,7 +1422,9 @@ bool ARMDAGToDAGISel::SelectT2AddrModeSoReg(SDValue N, unsigned PowerOfTwo = 0; SDValue NewMulConst; if (canExtractShiftFromMul(OffReg, 3, PowerOfTwo, NewMulConst)) { + HandleSDNode Handle(OffReg); replaceDAGValue(OffReg.getOperand(1), NewMulConst); + OffReg = Handle.getValue(); ShAmt = PowerOfTwo; } } |

