Commit 98665861 by Richard Guenther Committed by Richard Biener

tree.c (build2_stat): Allow non-POINTER_PLUS_EXPRs with non-sizetype offsets if...

2008-11-19  Richard Guenther  <rguenther@suse.de>

	* tree.c (build2_stat): Allow non-POINTER_PLUS_EXPRs with
	non-sizetype offsets if their precision matches that of
	the pointer.
	* expr.c (expand_expr_real_1): Always sign-extend the offset
	operand of a POINTER_PLUS_EXPR.

From-SVN: r142009
parent 059c51ec
2008-11-19 Richard Guenther <rguenther@suse.de>
* tree.c (build2_stat): Allow non-POINTER_PLUS_EXPRs with
non-sizetype offsets if their precision matches that of
the pointer.
* expr.c (expand_expr_real_1): Always sign-extend the offset
operand of a POINTER_PLUS_EXPR.
2008-11-19 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> 2008-11-19 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* config.gcc: Unobsolete mips-sgi-irix[56]*. * config.gcc: Unobsolete mips-sgi-irix[56]*.
......
...@@ -8334,6 +8334,14 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, ...@@ -8334,6 +8334,14 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
/* Even though the sizetype mode and the pointer's mode can be different /* Even though the sizetype mode and the pointer's mode can be different
expand is able to handle this correctly and get the correct result out expand is able to handle this correctly and get the correct result out
of the PLUS_EXPR code. */ of the PLUS_EXPR code. */
/* Make sure to sign-extend the sizetype offset in a POINTER_PLUS_EXPR
if sizetype precision is smaller than pointer precision. */
if (TYPE_PRECISION (sizetype) < TYPE_PRECISION (type))
exp = build2 (PLUS_EXPR, type,
TREE_OPERAND (exp, 0),
fold_convert (type,
fold_convert (ssizetype,
TREE_OPERAND (exp, 1))));
case PLUS_EXPR: case PLUS_EXPR:
/* Check if this is a case for multiplication and addition. */ /* Check if this is a case for multiplication and addition. */
......
...@@ -3289,8 +3289,13 @@ build2_stat (enum tree_code code, tree tt, tree arg0, tree arg1 MEM_STAT_DECL) ...@@ -3289,8 +3289,13 @@ build2_stat (enum tree_code code, tree tt, tree arg0, tree arg1 MEM_STAT_DECL)
gcc_assert (TREE_CODE_LENGTH (code) == 2); gcc_assert (TREE_CODE_LENGTH (code) == 2);
if ((code == MINUS_EXPR || code == PLUS_EXPR || code == MULT_EXPR) if ((code == MINUS_EXPR || code == PLUS_EXPR || code == MULT_EXPR)
&& arg0 && arg1 && tt && POINTER_TYPE_P (tt)) && arg0 && arg1 && tt && POINTER_TYPE_P (tt)
gcc_assert (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST); /* When sizetype precision doesn't match that of pointers
we need to be able to build explicit extensions or truncations
of the offset argument. */
&& TYPE_PRECISION (sizetype) == TYPE_PRECISION (tt))
gcc_assert (TREE_CODE (arg0) == INTEGER_CST
&& TREE_CODE (arg1) == INTEGER_CST);
if (code == POINTER_PLUS_EXPR && arg0 && arg1 && tt) if (code == POINTER_PLUS_EXPR && arg0 && arg1 && tt)
gcc_assert (POINTER_TYPE_P (tt) && POINTER_TYPE_P (TREE_TYPE (arg0)) gcc_assert (POINTER_TYPE_P (tt) && POINTER_TYPE_P (TREE_TYPE (arg0))
......
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