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 + +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,