diff options
author | Bernd Edlinger <bernd.edlinger@hotmail.de> | 2021-04-21 14:13:04 +0200 |
---|---|---|
committer | Bernd Edlinger <bernd.edlinger@hotmail.de> | 2021-04-27 17:47:25 +0200 |
commit | c33db31d9ad96f6414460315c12b4b505fad5dd7 (patch) | |
tree | d6eced509e19fdc7efbe871cf8dc418f8485970d /gcc | |
parent | 3bb41228d76b3a3cbd9923d57388f0903f7683de (diff) | |
download | gcc-c33db31d9ad96f6414460315c12b4b505fad5dd7.zip gcc-c33db31d9ad96f6414460315c12b4b505fad5dd7.tar.gz gcc-c33db31d9ad96f6414460315c12b4b505fad5dd7.tar.bz2 |
Fix target/100106 ICE in gen_movdi
As the test case shows, the outer mode may have a higher alignment
requirement than the inner mode here.
2021-04-27 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR target/100106
* simplify-rtx.c (simplify_context::simplify_subreg): Check the
memory alignment for the outer mode.
* gcc.c-torture/compile/pr100106.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/simplify-rtx.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr100106.c | 11 |
2 files changed, 12 insertions, 0 deletions
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index d13c390..ad3b7b2 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -7217,6 +7217,7 @@ simplify_context::simplify_subreg (machine_mode outermode, rtx op, have instruction to move the whole thing. */ && (! MEM_VOLATILE_P (op) || ! have_insn_for (SET, innermode)) + && !(STRICT_ALIGNMENT && MEM_ALIGN (op) < GET_MODE_ALIGNMENT (outermode)) && known_le (outersize, innersize)) return adjust_address_nv (op, outermode, byte); diff --git a/gcc/testsuite/gcc.c-torture/compile/pr100106.c b/gcc/testsuite/gcc.c-torture/compile/pr100106.c new file mode 100644 index 0000000..7f98b4f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr100106.c @@ -0,0 +1,11 @@ +union a { + float _Complex b; + long long c; +}; + +void g(union a); + +void e() { + union a f = {1.0f}; + g(f); +} |