diff options
| author | Artyom Skrobov <Artyom.Skrobov@arm.com> | 2017-03-22 15:09:30 +0000 |
|---|---|---|
| committer | Artyom Skrobov <Artyom.Skrobov@arm.com> | 2017-03-22 15:09:30 +0000 |
| commit | 50a066b3138a2cda4be733fdc51b35aaf631bfce (patch) | |
| tree | 010772c7498a827956bd7c83ef4df91da6677ae5 | |
| parent | 0f3a52b8c9ef8a3298a1c4b9771c72a516fb1075 (diff) | |
| download | bcm5719-llvm-50a066b3138a2cda4be733fdc51b35aaf631bfce.tar.gz bcm5719-llvm-50a066b3138a2cda4be733fdc51b35aaf631bfce.zip | |
[ARM] t2_so_imm_neg had a subtle bug in the conversion, and could trigger UB by negating (int)-2147483648. By pure luck, none of the pre-existing tests triggered this; so I'm adding one.
Summary: Thanks to Vitaly Buka for helping catch this.
Reviewers: rengolin, jmolloy, efriedma, vitalybuka
Subscribers: llvm-commits, aemerson
Differential Revision: https://reviews.llvm.org/D31242
llvm-svn: 298512
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrThumb2.td | 4 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Thumb/ispositive.ll | 9 |
2 files changed, 12 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMInstrThumb2.td b/llvm/lib/Target/ARM/ARMInstrThumb2.td index 557099590c3..45ab65580d4 100644 --- a/llvm/lib/Target/ARM/ARMInstrThumb2.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb2.td @@ -111,7 +111,9 @@ def t2_so_imm_notSext : Operand<i32>, PatLeaf<(imm), [{ // t2_so_imm_neg - Match an immediate that is a negation of a t2_so_imm. def t2_so_imm_neg_asmoperand : AsmOperandClass { let Name = "T2SOImmNeg"; } def t2_so_imm_neg : Operand<i32>, PatLeaf<(imm), [{ - int64_t Value = -(int)N->getZExtValue(); + int64_t Value = N->getZExtValue(); + if (Value == 1LL<<31) return false; // INT_MIN cannot be negated + Value = -(int)Value; return Value && ARM_AM::getT2SOImmVal(Value) != -1; }], t2_so_imm_neg_XFORM> { let ParserMatchClass = t2_so_imm_neg_asmoperand; diff --git a/llvm/test/CodeGen/Thumb/ispositive.ll b/llvm/test/CodeGen/Thumb/ispositive.ll index 8d396878932..a9b2c139797 100644 --- a/llvm/test/CodeGen/Thumb/ispositive.ll +++ b/llvm/test/CodeGen/Thumb/ispositive.ll @@ -9,3 +9,12 @@ entry: ret i32 %1 } +define i32 @test2(i32 %X) { +entry: +; CHECK-LABEL: test2: +; CHECK: lsls r1, r1, #31 +; CHECK-NEXT: adds + %tmp1 = sub i32 %X, 2147483648 + ret i32 %tmp1 +} + |

