aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-02-05 15:38:57 +0000
committerJakub Jelinek <jakub@redhat.com>2019-02-05 15:38:57 +0000
commitcf5a745c4d54dc07500e6ab5214638b146a8b8b9 (patch)
tree7e1963ea7a68f515f1a35d79294711996b35c81e
parent737c1a9082fe209d55a198ec2fe480e3f5ee33e7 (diff)
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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@268542 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/combine.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr89195.c22
4 files changed, 34 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a6c7f8c6c7a..c3340dbaf40 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-02-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/89195
+ * combine.c (make_extraction): For MEMs, don't extract bytes outside
+ of the original MEM.
+
2019-02-05 Martin Liska <mliska@suse.cz>
PR gcov-profile/89000
diff --git a/gcc/combine.c b/gcc/combine.c
index 7e1992f866f..a2492481693 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -7687,6 +7687,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). */
&& !paradoxical_subreg_p (tmode, inner_mode)
+ && known_le (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 90366221555..b232907be17 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-02-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/89195
+ * gcc.c-torture/execute/pr89195.c: New test.
+
2019-02-05 Kelvin Nilsen <kelvin@gcc.gnu.org>
* gcc.target/powerpc/vec-extract-slong-1.c: Require p8 execution
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 00000000000..017f5b4309a
--- /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;
+}