Commit cc99c5fe by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/45633 (internal compiler error: verify_stmts failed)

	PR tree-optimization/45633
	* tree-cfg.c (verify_gimple_assign_binary): Allow
	MINUS_EXPR with lhs and rhs1 pointer vector and
	rhs2 sizetype vector.
	* expr.c (expand_expr_real_2) <case PLUS_EXPR>: For pointer
	or vector pointer use TER to optimize pointer subtraction.

	* gcc.dg/vect/pr45633.c: New test.

From-SVN: r164312
parent 21b6aca3
2010-09-15 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/45633
* tree-cfg.c (verify_gimple_assign_binary): Allow
MINUS_EXPR with lhs and rhs1 pointer vector and
rhs2 sizetype vector.
* expr.c (expand_expr_real_2) <case PLUS_EXPR>: For pointer
or vector pointer use TER to optimize pointer subtraction.
2010-09-15 Jie Zhang <jie@codesourcery.com> 2010-09-15 Jie Zhang <jie@codesourcery.com>
* config/arm/vfp.md (cmpsf_trap_vfp): Change type from * config/arm/vfp.md (cmpsf_trap_vfp): Change type from
......
...@@ -7572,6 +7572,24 @@ expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode, ...@@ -7572,6 +7572,24 @@ expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode,
} }
} }
/* Use TER to expand pointer addition of a negated value
as pointer subtraction. */
if ((POINTER_TYPE_P (TREE_TYPE (treeop0))
|| (TREE_CODE (TREE_TYPE (treeop0)) == VECTOR_TYPE
&& POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (treeop0)))))
&& TREE_CODE (treeop1) == SSA_NAME
&& TYPE_MODE (TREE_TYPE (treeop0))
== TYPE_MODE (TREE_TYPE (treeop1)))
{
gimple def = get_def_for_expr (treeop1, NEGATE_EXPR);
if (def)
{
treeop1 = gimple_assign_rhs1 (def);
code = MINUS_EXPR;
goto do_minus;
}
}
/* No sense saving up arithmetic to be done /* No sense saving up arithmetic to be done
if it's all in the wrong mode to form part of an address. if it's all in the wrong mode to form part of an address.
And force_operand won't know whether to sign-extend or And force_operand won't know whether to sign-extend or
...@@ -7593,6 +7611,7 @@ expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode, ...@@ -7593,6 +7611,7 @@ expand_expr_real_2 (sepops ops, rtx target, enum machine_mode tmode,
return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1)); return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1));
case MINUS_EXPR: case MINUS_EXPR:
do_minus:
/* For initializers, we are allowed to return a MINUS of two /* For initializers, we are allowed to return a MINUS of two
symbolic constants. Here we handle all cases when both operands symbolic constants. Here we handle all cases when both operands
are constant. */ are constant. */
......
2010-09-15 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/45633
* gcc.dg/vect/pr45633.c: New test.
2010-09-15 Janus Weil <janus@gcc.gnu.org> 2010-09-15 Janus Weil <janus@gcc.gnu.org>
PR fortran/45577 PR fortran/45577
......
/* PR tree-optimization/45633 */
/* { dg-do compile } */
int s[32];
unsigned char *t[32];
void
foo (void)
{
int i;
for (i = 0; i < 32; i++)
t[i] -= s[i];
}
/* { dg-final { cleanup-tree-dump "vect" } } */
...@@ -3448,8 +3448,9 @@ verify_gimple_assign_binary (gimple stmt) ...@@ -3448,8 +3448,9 @@ verify_gimple_assign_binary (gimple stmt)
} }
case PLUS_EXPR: case PLUS_EXPR:
case MINUS_EXPR:
{ {
/* We use regular PLUS_EXPR for vectors. /* We use regular PLUS_EXPR and MINUS_EXPR for vectors.
??? This just makes the checker happy and may not be what is ??? This just makes the checker happy and may not be what is
intended. */ intended. */
if (TREE_CODE (lhs_type) == VECTOR_TYPE if (TREE_CODE (lhs_type) == VECTOR_TYPE
...@@ -3474,10 +3475,6 @@ verify_gimple_assign_binary (gimple stmt) ...@@ -3474,10 +3475,6 @@ verify_gimple_assign_binary (gimple stmt)
} }
goto do_pointer_plus_expr_check; goto do_pointer_plus_expr_check;
} }
}
/* Fallthru. */
case MINUS_EXPR:
{
if (POINTER_TYPE_P (lhs_type) if (POINTER_TYPE_P (lhs_type)
|| POINTER_TYPE_P (rhs1_type) || POINTER_TYPE_P (rhs1_type)
|| POINTER_TYPE_P (rhs2_type)) || POINTER_TYPE_P (rhs2_type))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment