mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[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
This commit is contained in:
parent
51a1f661a4
commit
5e7c493374
@ -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;
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user