Fix two ubsan failures (PR85164)
Two fixes for UB when handling very large offsets. The calculation in force_int_to_mode would have been correct if signed integers used modulo arithmetic, so just switch to unsigned types. The calculation in rtx_addr_can_trap_p_1 didn't handle overflow properly, so switch to known_subrange_p instead (which is supposed to handle all cases). 2019-04-18 Richard Sandiford <richard.sandiford@arm.com> gcc/ PR middle-end/85164 * combine.c (force_int_to_mode): Cast the argument rather than the result of known_alignment. * rtlanal.c (rtx_addr_can_trap_p_1): Use known_subrange_p. gcc/testsuite/ PR middle-end/85164 * gcc.dg/pr85164-1.c, gcc.dg/pr85164-2.c: New tests. From-SVN: r270442
This commit is contained in:
parent
e62817edae
commit
cd7f7c54a4
6 changed files with 25 additions and 2 deletions
|
@ -1,3 +1,10 @@
|
|||
2019-04-18 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
PR middle-end/85164
|
||||
* combine.c (force_int_to_mode): Cast the argument rather than
|
||||
the result of known_alignment.
|
||||
* rtlanal.c (rtx_addr_can_trap_p_1): Use known_subrange_p.
|
||||
|
||||
2019-04-18 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR debug/90131
|
||||
|
|
|
@ -8946,7 +8946,7 @@ force_int_to_mode (rtx x, scalar_int_mode mode, scalar_int_mode xmode,
|
|||
/* If X is (minus C Y) where C's least set bit is larger than any bit
|
||||
in the mask, then we may replace with (neg Y). */
|
||||
if (poly_int_rtx_p (XEXP (x, 0), &const_op0)
|
||||
&& (unsigned HOST_WIDE_INT) known_alignment (const_op0) > mask)
|
||||
&& known_alignment (poly_uint64 (const_op0)) > mask)
|
||||
{
|
||||
x = simplify_gen_unary (NEG, xmode, XEXP (x, 1), xmode);
|
||||
return force_to_mode (x, mode, mask, next_select);
|
||||
|
|
|
@ -521,7 +521,7 @@ rtx_addr_can_trap_p_1 (const_rtx x, poly_int64 offset, poly_int64 size,
|
|||
|
||||
return (!known_size_p (decl_size) || known_eq (decl_size, 0)
|
||||
? maybe_ne (offset, 0)
|
||||
: maybe_gt (offset + size, decl_size));
|
||||
: !known_subrange_p (offset, size, 0, decl_size));
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2019-04-18 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
PR middle-end/85164
|
||||
* gcc.dg/pr85164-1.c, gcc.dg/pr85164-2.c: New tests.
|
||||
|
||||
2019-04-18 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR debug/90131
|
||||
|
|
7
gcc/testsuite/gcc.dg/pr85164-1.c
Normal file
7
gcc/testsuite/gcc.dg/pr85164-1.c
Normal file
|
@ -0,0 +1,7 @@
|
|||
/* { dg-options "-O2 -w" } */
|
||||
a[];
|
||||
b;
|
||||
c() {
|
||||
unsigned long d;
|
||||
b = a[d - 1 >> 3];
|
||||
}
|
4
gcc/testsuite/gcc.dg/pr85164-2.c
Normal file
4
gcc/testsuite/gcc.dg/pr85164-2.c
Normal file
|
@ -0,0 +1,4 @@
|
|||
/* { dg-options "-O2 -w" } */
|
||||
int a;
|
||||
long b;
|
||||
void c() { b = -9223372036854775807L - 1 - a; }
|
Loading…
Add table
Reference in a new issue