From 11a82e2597c54016345beb99e5339e37851c7d59 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 4 Sep 2017 14:10:11 +0000 Subject: [PATCH] re PR c++/82084 (ICE: constructing wstring with -O3) 2017-09-04 Richard Biener PR tree-optimization/82084 * fold-const.h (can_native_encode_string_p): Declare. * fold-const.c (can_native_encode_string_p): Factor out from ... (native_encode_string): ... here. * tree-vect-stmts.c (vectorizable_store): Call it to avoid vectorizing stores from constants we later cannot handle. * g++.dg/torture/pr82084.C: New testcase. From-SVN: r251661 --- gcc/ChangeLog | 9 +++++++++ gcc/fold-const.c | 29 ++++++++++++++++++++--------- gcc/fold-const.h | 1 + gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/torture/pr82084.C | 9 +++++++++ gcc/tree-vect-stmts.c | 6 ++++++ 6 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr82084.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 721b0b9..012c519 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-09-04 Richard Biener + + PR tree-optimization/82084 + * fold-const.h (can_native_encode_string_p): Declare. + * fold-const.c (can_native_encode_string_p): Factor out from ... + (native_encode_string): ... here. + * tree-vect-stmts.c (vectorizable_store): Call it to avoid + vectorizing stores from constants we later cannot handle. + 2017-09-04 Marek Polacek PR c/81783 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index f3c84a8..4904830 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -7184,16 +7184,10 @@ native_encode_vector (const_tree expr, unsigned char *ptr, int len, int off) static int native_encode_string (const_tree expr, unsigned char *ptr, int len, int off) { - tree type = TREE_TYPE (expr); - HOST_WIDE_INT total_bytes; - - if (TREE_CODE (type) != ARRAY_TYPE - || TREE_CODE (TREE_TYPE (type)) != INTEGER_TYPE - || (GET_MODE_BITSIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (type))) - != BITS_PER_UNIT) - || !tree_fits_shwi_p (TYPE_SIZE_UNIT (type))) + if (! can_native_encode_string_p (expr)) return 0; - total_bytes = tree_to_shwi (TYPE_SIZE_UNIT (type)); + + HOST_WIDE_INT total_bytes = tree_to_shwi (TYPE_SIZE_UNIT (TREE_TYPE (expr))); if ((off == -1 && total_bytes > len) || off >= total_bytes) return 0; @@ -7487,6 +7481,23 @@ can_native_encode_type_p (tree type) } } +/* Return true iff a STRING_CST S is accepted by + native_encode_expr. */ + +bool +can_native_encode_string_p (const_tree expr) +{ + tree type = TREE_TYPE (expr); + + if (TREE_CODE (type) != ARRAY_TYPE + || TREE_CODE (TREE_TYPE (type)) != INTEGER_TYPE + || (GET_MODE_BITSIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (type))) + != BITS_PER_UNIT) + || !tree_fits_shwi_p (TYPE_SIZE_UNIT (type))) + return false; + return true; +} + /* Fold a VIEW_CONVERT_EXPR of a constant expression EXPR to type TYPE at compile-time. If we're unable to perform the conversion return NULL_TREE. */ diff --git a/gcc/fold-const.h b/gcc/fold-const.h index 8380d42..46d5639 100644 --- a/gcc/fold-const.h +++ b/gcc/fold-const.h @@ -28,6 +28,7 @@ extern int folding_initializer; extern int native_encode_expr (const_tree, unsigned char *, int, int off = -1); extern tree native_interpret_expr (tree, const unsigned char *, int); extern bool can_native_encode_type_p (tree); +extern bool can_native_encode_string_p (const_tree); /* Fold constants as much as possible in an expression. Returns the simplified expression. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 04a95f9..2893847 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-09-04 Richard Biener + + PR tree-optimization/82084 + * g++.dg/torture/pr82084.C: New testcase. + 2017-09-04 Marek Polacek PR c/81783 diff --git a/gcc/testsuite/g++.dg/torture/pr82084.C b/gcc/testsuite/g++.dg/torture/pr82084.C new file mode 100644 index 0000000..416684d --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr82084.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +#include +int main() +{ + wchar_t strs[4][2]= { L"A", L"B", L"C" , L"D"}; + std::wstring ss(strs[0]); + return 0; +} diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index c9a0aaf..ce43893 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -5733,6 +5733,12 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, op = gimple_assign_rhs1 (stmt); + /* In the case this is a store from a STRING_CST make sure + native_encode_expr can handle it. */ + if (TREE_CODE (op) == STRING_CST + && ! can_native_encode_string_p (op)) + return false; + if (!vect_is_simple_use (op, vinfo, &def_stmt, &dt, &rhs_vectype)) { if (dump_enabled_p ()) -- 2.7.4