diff options
author | Jeff Law <jlaw@ventanamicro.com> | 2024-09-01 22:16:04 -0600 |
---|---|---|
committer | Jeff Law <jlaw@ventanamicro.com> | 2024-09-01 22:18:29 -0600 |
commit | 0562976d62e095f3a00c799288dee4e5b20114e2 (patch) | |
tree | 4d22213a967c8b51ac63665f30fc4beb5319150f /gcc | |
parent | f77435aa3911c437cba71991509eee57b333b3ce (diff) | |
download | gcc-0562976d62e095f3a00c799288dee4e5b20114e2.zip gcc-0562976d62e095f3a00c799288dee4e5b20114e2.tar.gz gcc-0562976d62e095f3a00c799288dee4e5b20114e2.tar.bz2 |
[committed][PR rtl-optimization/116544] Fix test for promoted subregs
This is a small bug in the ext-dce code's handling of promoted subregs.
Essentially when we see a promoted subreg we need to make additional bit groups
live as various parts of the RTL path know that an extension of a suitably
promoted subreg can be trivially eliminated.
When I added support for dealing with this quirk I failed to account for the
larger modes properly and it ignored the case when the size of the inner object
was > 32 bits. Opps.
This does _not_ fix the outstanding x86 issue. That's caused by something
completely different and more concerning ;(
Bootstrapped and regression tested on x86. Obviously fixes the testcase on
riscv as well.
Pushing to the trunk.
PR rtl-optimization/116544
gcc/
* ext-dce.cc (ext_dce_process_uses): Fix thinko in promoted subreg
handling.
gcc/testsuite/
* gcc.dg/torture/pr116544.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ext-dce.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr116544.c | 22 |
2 files changed, 23 insertions, 1 deletions
diff --git a/gcc/ext-dce.cc b/gcc/ext-dce.cc index 4a2503f..2f3514a 100644 --- a/gcc/ext-dce.cc +++ b/gcc/ext-dce.cc @@ -846,7 +846,7 @@ ext_dce_process_uses (rtx_insn *insn, rtx obj, bitmap_set_bit (livenow, rn + 1); if (size > 16) bitmap_set_bit (livenow, rn + 2); - if (size == 32) + if (size >= 32) bitmap_set_bit (livenow, rn + 3); iter.skip_subrtxes (); } diff --git a/gcc/testsuite/gcc.dg/torture/pr116544.c b/gcc/testsuite/gcc.dg/torture/pr116544.c new file mode 100644 index 0000000..15f52fe --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr116544.c @@ -0,0 +1,22 @@ +/* { dg-options "-fno-strict-aliasing -fwrapv" } +/* { dg-do run { target longlong64 } } */ + +extern void abort (void); +long long a; +signed char b[60]; +signed char c; +long long d[60]; +int e[30]; +long long *f = d; +static void g(long long *j, long k) { *j = k; } +int main() { + d[5] = 0x100000000; + for (int h = 2; h < 7; h += 3) + for (int i = 0; i < (c || b[h]) + 10; i += 11) + e[2] = f[h]; + g(&a, e[2]); + if (a != 0) + abort (); + return 0; +} + |