From 60d393e89c924e71208f72a7007e16dc8720bcc9 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 20 Apr 2016 07:20:16 +0000 Subject: [PATCH] re PR tree-optimization/70726 (Internal compiler error (ICE) on valid code) 2016-04-20 Richard Biener PR tree-optimization/70726 * tree-vect-stmts.c (vectorizable_shift): Do not use scalar shift amounts from a pattern stmt operand. * g++.dg/vect/pr70726.cc: New testcase. From-SVN: r235236 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/vect/pr70726.cc | 19 +++++++++++++++++++ gcc/tree-vect-stmts.c | 10 ++++++++++ 4 files changed, 40 insertions(+) create mode 100644 gcc/testsuite/g++.dg/vect/pr70726.cc diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 685aba31ccb..6e92dde027e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-04-20 Richard Biener + + PR tree-optimization/70726 + * tree-vect-stmts.c (vectorizable_shift): Do not use scalar + shift amounts from a pattern stmt operand. + 2016-04-20 Andreas Krebbel PR target/70674 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 55e7bbda21f..db98dd3f9d5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-20 Richard Biener + + PR tree-optimization/70726 + * g++.dg/vect/pr70726.cc: New testcase. + 2016-04-20 Andreas Krebbel PR target/70674 diff --git a/gcc/testsuite/g++.dg/vect/pr70726.cc b/gcc/testsuite/g++.dg/vect/pr70726.cc new file mode 100644 index 00000000000..d5d2def4f3b --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr70726.cc @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-additional-options "-Ofast" } +// { dg-additional-options "-mavx2" { target x86_64-*-* i?86-*-* } } + +extern long a; +extern int b[100]; +extern unsigned c[5][5][2][4][2][2][3]; +void fn1() { + for (int d = 0; d < 2; d = d + 1) + for (int e = 0; e < 5; e = e + 1) + for (int f = 0; f < 3; f = f + 1) + for (int g = 0; g < 3; g = g + 1) + for (int h = 0; h < 2; h = h + 1) + for (int i = 0; i < 4; i = i + 1) + for (int j = 0; j < 2; j = j + 1) + for (int k = 0; k < 2; k = k + 1) + for (int l = 0; l < 3; l = l + 1) + c[d][e][h][i][j][k][l] = a << b[f * 5 + g] + 4; +} diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 5f054c53447..9ab4af4f97e 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -4532,6 +4532,16 @@ vectorizable_shift (gimple *stmt, gimple_stmt_iterator *gsi, if (!operand_equal_p (gimple_assign_rhs2 (slpstmt), op1, 0)) scalar_shift_arg = false; } + + /* If the shift amount is computed by a pattern stmt we cannot + use the scalar amount directly thus give up and use a vector + shift. */ + if (dt[1] == vect_internal_def) + { + gimple *def = SSA_NAME_DEF_STMT (op1); + if (is_pattern_stmt_p (vinfo_for_stmt (def))) + scalar_shift_arg = false; + } } else {