From e8a5c7b37007b76733fcafb8b03e4a5407ebb03b Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 30 Aug 2019 13:38:28 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 4 ++++ gcc/combine.c | 1 + gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.c-torture/execute/pr89195.c | 22 +++++++++++++++++++ 4 files changed, 30 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr89195.c 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; +} -- 2.47.2