re PR rtl-optimization/82192 (gcc produces incorrect code with -O2 and bit-field)
PR rtl-optimization/82192 * combine.c (make_extraction): Don't look through non-paradoxical SUBREGs or TRUNCATE if pos + len is or might be bigger than inner's mode. * gcc.c-torture/execute/pr82192.c: New test. From-SVN: r252824
This commit is contained in:
parent
681f5b7cc8
commit
a1189286e5
@ -1,3 +1,10 @@
|
||||
2017-09-15 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/82192
|
||||
* combine.c (make_extraction): Don't look through non-paradoxical
|
||||
SUBREGs or TRUNCATE if pos + len is or might be bigger than
|
||||
inner's mode.
|
||||
|
||||
2017-09-15 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
Alan Hayward <alan.hayward@arm.com>
|
||||
David Sherwood <david.sherwood@arm.com>
|
||||
|
@ -7442,7 +7442,14 @@ make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos,
|
||||
if (pos_rtx && CONST_INT_P (pos_rtx))
|
||||
pos = INTVAL (pos_rtx), pos_rtx = 0;
|
||||
|
||||
if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
|
||||
if (GET_CODE (inner) == SUBREG
|
||||
&& subreg_lowpart_p (inner)
|
||||
&& (paradoxical_subreg_p (inner)
|
||||
/* If trying or potentionally trying to extract
|
||||
bits outside of is_mode, don't look through
|
||||
non-paradoxical SUBREGs. See PR82192. */
|
||||
|| (pos_rtx == NULL_RTX
|
||||
&& pos + len <= GET_MODE_PRECISION (is_mode))))
|
||||
{
|
||||
/* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
|
||||
consider just the QI as the memory to extract from.
|
||||
@ -7468,7 +7475,12 @@ make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos,
|
||||
if (new_rtx != 0)
|
||||
return gen_rtx_ASHIFT (mode, new_rtx, XEXP (inner, 1));
|
||||
}
|
||||
else if (GET_CODE (inner) == TRUNCATE)
|
||||
else if (GET_CODE (inner) == TRUNCATE
|
||||
/* If trying or potentionally trying to extract
|
||||
bits outside of is_mode, don't look through
|
||||
TRUNCATE. See PR82192. */
|
||||
&& pos_rtx == NULL_RTX
|
||||
&& pos + len <= GET_MODE_PRECISION (is_mode))
|
||||
inner = XEXP (inner, 0);
|
||||
|
||||
inner_mode = GET_MODE (inner);
|
||||
|
@ -1,3 +1,8 @@
|
||||
2017-09-15 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/82192
|
||||
* gcc.c-torture/execute/pr82192.c: New test.
|
||||
|
||||
2017-09-15 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/82217
|
||||
|
22
gcc/testsuite/gcc.c-torture/execute/pr82192.c
Normal file
22
gcc/testsuite/gcc.c-torture/execute/pr82192.c
Normal file
@ -0,0 +1,22 @@
|
||||
/* PR rtl-optimization/82192 */
|
||||
|
||||
unsigned long long int a = 0x95dd3d896f7422e2ULL;
|
||||
struct S { unsigned int m : 13; } b;
|
||||
|
||||
__attribute__((noinline, noclone)) void
|
||||
foo (void)
|
||||
{
|
||||
b.m = ((unsigned) a) >> (0x644eee9667723bf7LL
|
||||
| a & ~0xdee27af8U) - 0x644eee9667763bd8LL;
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
if (__INT_MAX__ != 0x7fffffffULL)
|
||||
return 0;
|
||||
foo ();
|
||||
if (b.m != 0)
|
||||
__builtin_abort ();
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user