From: Jakub Jelinek Date: Fri, 30 Aug 2019 11:38:28 +0000 (+0200) Subject: backport: re PR rtl-optimization/89195 (Corrupted stack offset after combine) X-Git-Tag: releases/gcc-7.5.0~262 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e8a5c7b37007b76733fcafb8b03e4a5407ebb03b;p=thirdparty%2Fgcc.git backport: re PR rtl-optimization/89195 (Corrupted stack offset after combine) Backported from mainline 2019-02-05 Jakub Jelinek PR rtl-optimization/89195 * combine.c (make_extraction): For MEMs, don't extract bytes outside of the original MEM. * gcc.c-torture/execute/pr89195.c: New test. From-SVN: r275099 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 824bedc31707..ff921609067c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,6 +3,10 @@ Backported from mainline 2019-02-05 Jakub Jelinek + PR rtl-optimization/89195 + * combine.c (make_extraction): For MEMs, don't extract bytes outside + of the original MEM. + PR target/89186 * optabs.c (prepare_cmp_insn): Pass x and y to emit_block_comp_via_libcall rather than XEXP (x, 0) and XEXP (y, 0). diff --git a/gcc/combine.c b/gcc/combine.c index 56f7f4912343..685b0db62e58 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -7481,6 +7481,7 @@ make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos, /* We can't do this if we are widening INNER_MODE (it may not be aligned, for one thing). */ && GET_MODE_PRECISION (inner_mode) >= GET_MODE_PRECISION (tmode) + && pos + len <= GET_MODE_PRECISION (is_mode) && (inner_mode == tmode || (! mode_dependent_address_p (XEXP (inner, 0), MEM_ADDR_SPACE (inner)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8b5d6d16085a..063fbdbca951 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backported from mainline 2019-02-05 Jakub Jelinek + PR rtl-optimization/89195 + * gcc.c-torture/execute/pr89195.c: New test. + PR target/89186 * g++.dg/ext/vector36.C: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr89195.c b/gcc/testsuite/gcc.c-torture/execute/pr89195.c new file mode 100644 index 000000000000..017f5b4309aa --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr89195.c @@ -0,0 +1,22 @@ +/* PR rtl-optimization/89195 */ +/* { dg-require-effective-target int32plus } */ + +struct S { unsigned i : 24; }; + +volatile unsigned char x; + +__attribute__((noipa)) int +foo (struct S d) +{ + return d.i & x; +} + +int +main () +{ + struct S d = { 0x123456 }; + x = 0x75; + if (foo (d) != (0x56 & 0x75)) + __builtin_abort (); + return 0; +}