diff options
author | Richard Guenther <rguenther@suse.de> | 2008-11-05 12:17:10 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2008-11-05 12:17:10 +0000 |
commit | f7c0ffb441e9f1164809bd3165a614e46680e38e (patch) | |
tree | c33b55ff21ac34fcc6846d0faa6ad347ae2c4bde /gcc/tree-ssa.c | |
parent | 08906bf8a2a9d9aa0263e7f183be7315d985b00d (diff) | |
download | gcc-f7c0ffb441e9f1164809bd3165a614e46680e38e.zip gcc-f7c0ffb441e9f1164809bd3165a614e46680e38e.tar.gz gcc-f7c0ffb441e9f1164809bd3165a614e46680e38e.tar.bz2 |
re PR middle-end/37742 (ICE in vectorizer with restrict pointer)
2008-11-05 Richard Guenther <rguenther@suse.de>
PR middle-end/37742
* tree-ssa.c (useless_type_conversion_p_1): Check different restrict
qualified pointer conversion before stripping qualifiers.
* gimplify.c (create_tmp_from_val): Use correctly qualified type.
* tree-flow.h (may_propagate_address_into_dereference): Declare.
* tree-ssa-ccp.c (may_propagate_address_into_dereference): New function.
(ccp_fold): Use it.
* tree-ssa-forwprop.c (rhs_to_tree): Remove useless conversions,
properly canonicalize binary ops.
(forward_propagate_addr_expr_1): Use
may_propagate_address_into_dereference.
cp/
* decl.c (start_preparsed_function): Use the correct type for
building the RESULT_DECL.
* gcc.c-torture/compile/pr37742.c: New testcase.
* g++.dg/pr37742.C: Likewise.
* gcc.dg/tree-ssa/forwprop-7.c: Check for two volatile loads.
From-SVN: r141606
Diffstat (limited to 'gcc/tree-ssa.c')
-rw-r--r-- | gcc/tree-ssa.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 8f238a3..935cad6 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -1071,7 +1071,18 @@ delete_tree_ssa (void) static bool useless_type_conversion_p_1 (tree outer_type, tree inner_type) { - /* Qualifiers on value types do not matter. */ + /* Do the following before stripping toplevel qualifiers. */ + if (POINTER_TYPE_P (inner_type) + && POINTER_TYPE_P (outer_type)) + { + /* Do not lose casts to restrict qualified pointers. */ + if ((TYPE_RESTRICT (outer_type) + != TYPE_RESTRICT (inner_type)) + && TYPE_RESTRICT (outer_type)) + return false; + } + + /* From now on qualifiers on value types do not matter. */ inner_type = TYPE_MAIN_VARIANT (inner_type); outer_type = TYPE_MAIN_VARIANT (outer_type); @@ -1147,12 +1158,6 @@ useless_type_conversion_p_1 (tree outer_type, tree inner_type) /* We do not care for const qualification of the pointed-to types as const qualification has no semantic value to the middle-end. */ - /* Do not lose casts to restrict qualified pointers. */ - if ((TYPE_RESTRICT (outer_type) - != TYPE_RESTRICT (inner_type)) - && TYPE_RESTRICT (outer_type)) - return false; - /* Otherwise pointers/references are equivalent if their pointed to types are effectively the same. We can strip qualifiers on pointed-to types for further comparison, which is done in |