summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2009-05-15 13:09:53 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2009-05-15 13:09:53 +0000
commita1157bfecf3a552d12e2c43d7d0520c3c7530437 (patch)
treef22e80535ee47a66c5898bcd81363b613840d2c2 /gcc
parent408c3c778db3bf85c896dd76fd281b190d06cb3e (diff)
downloadgcc-a1157bfecf3a552d12e2c43d7d0520c3c7530437.tar.gz
2009-05-15 Richard Guenther <rguenther@suse.de>
PR tree-optimization/39999 * gimple.h (gimple_expr_type): Use the expression type looking through useless conversions. * tree-ssa-sccvn.c (vn_nary_op_lookup_stmt): Use gimple_expr_type. (vn_nary_op_insert_stmt): Likewise. (simplify_binary_expression): Likewise. * gcc.c-torture/compile/pr39999.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147573 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/gimple.h67
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr39999.c18
-rw-r--r--gcc/tree-ssa-sccvn.c6
5 files changed, 73 insertions, 32 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f3b70b09c48..40546fbf092 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
2009-05-15 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/39999
+ * gimple.h (gimple_expr_type): Use the expression type looking
+ through useless conversions.
+ * tree-ssa-sccvn.c (vn_nary_op_lookup_stmt): Use gimple_expr_type.
+ (vn_nary_op_insert_stmt): Likewise.
+ (simplify_binary_expression): Likewise.
+
+2009-05-15 Richard Guenther <rguenther@suse.de>
+
* common.opt (-ftree-forwprop, -ftree-phiprop, -ftree-pta):
New options, enabled by default.
* doc/invoke.texi (-ftree-forwprop, -ftree-phiprop, -ftree-pta):
diff --git a/gcc/gimple.h b/gcc/gimple.h
index d3f8f8fb8c4..ffcf9aa95ae 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -1360,35 +1360,6 @@ gimple_modified_p (const_gimple g)
return (gimple_has_ops (g)) ? (bool) g->gsbase.modified : false;
}
-/* Return the type of the main expression computed by STMT. Return
- void_type_node if the statement computes nothing. */
-
-static inline tree
-gimple_expr_type (const_gimple stmt)
-{
- enum gimple_code code = gimple_code (stmt);
-
- if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
- {
- tree type = TREE_TYPE (gimple_get_lhs (stmt));
- /* Integral sub-types are never the type of the expression,
- but they still can be the type of the result as the base
- type (in which expressions are computed) is trivially
- convertible to one of its sub-types. So always return
- the base type here. */
- if (INTEGRAL_TYPE_P (type)
- && TREE_TYPE (type)
- /* But only if they are trivially convertible. */
- && useless_type_conversion_p (type, TREE_TYPE (type)))
- type = TREE_TYPE (type);
- return type;
- }
- else if (code == GIMPLE_COND)
- return boolean_type_node;
- else
- return void_type_node;
-}
-
/* Return the tree code for the expression computed by STMT. This is
only valid for GIMPLE_COND, GIMPLE_CALL and GIMPLE_ASSIGN. For
@@ -4242,6 +4213,44 @@ gimple_predict_set_outcome (gimple gs, enum prediction outcome)
}
+/* Return the type of the main expression computed by STMT. Return
+ void_type_node if the statement computes nothing. */
+
+static inline tree
+gimple_expr_type (const_gimple stmt)
+{
+ enum gimple_code code = gimple_code (stmt);
+
+ if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
+ {
+ tree type;
+ /* In general we want to pass out a type that can be substituted
+ for both the RHS and the LHS types if there is a possibly
+ useless conversion involved. That means returning the
+ original RHS type as far as we can reconstruct it. */
+ if (code == GIMPLE_CALL)
+ type = gimple_call_return_type (stmt);
+ else
+ switch (gimple_assign_rhs_code (stmt))
+ {
+ case POINTER_PLUS_EXPR:
+ type = TREE_TYPE (gimple_assign_rhs1 (stmt));
+ break;
+
+ default:
+ /* As fallback use the type of the LHS. */
+ type = TREE_TYPE (gimple_get_lhs (stmt));
+ break;
+ }
+ return type;
+ }
+ else if (code == GIMPLE_COND)
+ return boolean_type_node;
+ else
+ return void_type_node;
+}
+
+
/* Return a new iterator pointing to GIMPLE_SEQ's first statement. */
static inline gimple_stmt_iterator
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b8ab7d472eb..63c8e671b8d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-05-15 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/39999
+ * gcc.c-torture/compile/pr39999.c: New testcase.
+
2009-05-15 Joseph Myers <joseph@codesourcery.com>
* gcc.c-torture/compile/ptr-conv-1.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr39999.c b/gcc/testsuite/gcc.c-torture/compile/pr39999.c
new file mode 100644
index 00000000000..c46a651a18a
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr39999.c
@@ -0,0 +1,18 @@
+void foo(void *);
+void
+MMAPGCD (int *A1, int *A2)
+{
+ int *t;
+
+ do
+ {
+ t = A1;
+ A1 = A2;
+ A2 = t;
+ }
+ while (A2[-1]);
+
+ foo (A1-1);
+ foo (A2-1);
+}
+
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 539afd2458a..e64b7ee050c 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -1232,7 +1232,7 @@ vn_nary_op_lookup_stmt (gimple stmt, vn_nary_op_t *vnresult)
*vnresult = NULL;
vno1.opcode = gimple_assign_rhs_code (stmt);
vno1.length = gimple_num_ops (stmt) - 1;
- vno1.type = TREE_TYPE (gimple_assign_lhs (stmt));
+ vno1.type = gimple_expr_type (stmt);
for (i = 0; i < vno1.length; ++i)
vno1.op[i] = gimple_op (stmt, i + 1);
if (vno1.opcode == REALPART_EXPR
@@ -1340,7 +1340,7 @@ vn_nary_op_insert_stmt (gimple stmt, tree result)
vno1->value_id = VN_INFO (result)->value_id;
vno1->opcode = gimple_assign_rhs_code (stmt);
vno1->length = length;
- vno1->type = TREE_TYPE (gimple_assign_lhs (stmt));
+ vno1->type = gimple_expr_type (stmt);
for (i = 0; i < vno1->length; ++i)
vno1->op[i] = gimple_op (stmt, i + 1);
if (vno1->opcode == REALPART_EXPR
@@ -2065,7 +2065,7 @@ simplify_binary_expression (gimple stmt)
fold_defer_overflow_warnings ();
result = fold_binary (gimple_assign_rhs_code (stmt),
- TREE_TYPE (gimple_get_lhs (stmt)), op0, op1);
+ gimple_expr_type (stmt), op0, op1);
if (result)
STRIP_USELESS_TYPE_CONVERSION (result);