gcc/revise-type-before-build-MULT.patch

81 lines
2.5 KiB
Diff
Raw Normal View History

diff -uprN a/gcc/testsuite/gcc.dg/affine-add-1.c b/gcc/testsuite/gcc.dg/affine-add-1.c
--- a/gcc/testsuite/gcc.dg/affine-add-1.c 1970-01-01 08:00:00.000000000 +0800
+++ b/gcc/testsuite/gcc.dg/affine-add-1.c 2021-03-18 19:41:21.308000000 +0800
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+extern unsigned char a[][13][23][15][11];
+short b;
+int c, d;
+void e(int f, int g[][3][4][3]) {
+ for (char h = 0;; h = 2)
+ for (; f;)
+ for (short i;; i = d)
+ for (char j; j; j = c)
+ for (char k = 0; k < 4; k = g[h][b][i][j])
+ a[h][b][i][j][k] = 0;
+}
+unsigned char a[3][13][23][15][11];
+int main() {}
diff -uprN a/gcc/testsuite/g++.dg/affine-add-1.C b/gcc/testsuite/g++.dg/affine-add-1.C
--- a/gcc/testsuite/g++.dg/affine-add-1.C 1970-01-01 08:00:00.000000000 +0800
+++ b/gcc/testsuite/g++.dg/affine-add-1.C 2021-03-18 19:40:28.432000000 +0800
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+#include <algorithm>
+
+extern int a[];
+extern unsigned char b[][151800];
+extern long long c[][20][23][22][11];
+char d, e;
+int f;
+unsigned g;
+long h;
+void i(unsigned long long s, unsigned short j) {
+ for (char k = 0; k < 12; k += 3)
+ for (short l = 0; l < 9; l = std::min(j, (unsigned short)4050683)) {
+ for (bool m(h); m < bool(~0); m = 1)
+ for (int t = 0; t < 4; t = std::min(s, (unsigned long long)40808803))
+ for (int n = 0; n < 9; n += e)
+ a[n] = 0;
+ for (char o = 0; o < g; o = 4)
+ for (bool p; p < f; p = d) {
+ for (long q(s); q < 4ULL; q += 1ULL)
+ b[k][o + q] = 0;
+ for (int r = 0; r < 11; r += ~0 || 0)
+ c[k][l][o][d][r] = 0;
+ }
+ }
+}
+int a[0];
+unsigned char b[3][151800];
+long long c[3][20][23][22][11];
+int main() {}
+
diff -uprN a/gcc/tree-affine.c b/gcc/tree-affine.c
--- a/gcc/tree-affine.c 2021-03-15 18:55:31.928000000 +0800
+++ b/gcc/tree-affine.c 2021-03-18 16:34:05.932000000 +0800
@@ -184,9 +184,16 @@ aff_combination_add_elt (aff_tree *comb,
if (scale == 1)
elt = fold_convert (type, elt);
else
- elt = fold_build2 (MULT_EXPR, type,
- fold_convert (type, elt),
- wide_int_to_tree (type, scale));
+ {
+ if (POINTER_TYPE_P (TREE_TYPE (elt)))
+ {
+ elt = copy_node (elt);
+ TREE_TYPE (elt) = sizetype;
+ }
+ elt = fold_build2 (MULT_EXPR, type,
+ fold_convert (type, elt),
+ wide_int_to_tree (type, scale));
+ }
if (comb->rest)
comb->rest = fold_build2 (PLUS_EXPR, type, comb->rest,