re PR middle-end/67442 (GCC 5.2.0 on x86_64 creates invalid address on specific array...
authorRichard Biener <rguenther@suse.de>
Wed, 16 Sep 2015 07:25:15 +0000 (07:25 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 16 Sep 2015 07:25:15 +0000 (07:25 +0000)
2015-09-16  Richard Biener  <rguenther@suse.de>

PR middle-end/67442
* fold-const.c (extract_muldiv_1): Properly extend multiplication
result before builting a tree via wide_int_to_tree.

* gcc.dg/torture/pr67442.c: New testcase.

From-SVN: r227818

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr67442.c [new file with mode: 0644]

index 92ed286935c85dbc167f79568fa0c5b3b61ed894..fca25b9b867a330dea7dabe2ad47e292b5cf1efa 100644 (file)
@@ -1,3 +1,9 @@
+2015-09-16  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/67442
+       * fold-const.c (extract_muldiv_1): Properly extend multiplication
+       result before builting a tree via wide_int_to_tree.
+
 2015-09-16  Mikhail Maltsev  <maltsevm@gmail.com>
 
        * Makefile.in: Add memory-block.cc
index e9366e2de6e8a7684bf0a0f51fc63ebd2c2154e8..fd1c87ed5ad08af7b38d0cc4a3c8b2418da65f3a 100644 (file)
@@ -6166,8 +6166,12 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
              && ((sign == UNSIGNED && tcode != MULT_EXPR) || sign == SIGNED))
            overflow_p = true;
          if (!overflow_p)
-           return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
-                               wide_int_to_tree (ctype, mul));
+           {
+             mul = wide_int::from (mul, TYPE_PRECISION (ctype),
+                                   TYPE_SIGN (TREE_TYPE (op1)));
+             return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
+                                 wide_int_to_tree (ctype, mul));
+           }
        }
 
       /* If these operations "cancel" each other, we have the main
index b4eaf3de35d892c0559538c1ef467c8445b2bb18..9035db974d012345014688ca4ea585f41ed362b9 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-16  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/67442
+       * gcc.dg/torture/pr67442.c: New testcase.
+
 2015-09-15  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/array24.adb: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr67442.c b/gcc/testsuite/gcc.dg/torture/pr67442.c
new file mode 100644 (file)
index 0000000..bc214d6
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do run } */
+
+short foo[100];
+
+int main()
+{
+  short* bar = &foo[50];
+  short i = 1;
+  short j = 1;
+  short value = bar[8 - i * 2 * j];
+  return value;
+}