From 5c485e88d60cd5ef69d53b4c82b185a3a09a91b2 Mon Sep 17 00:00:00 2001 From: rguenth Date: Wed, 19 Nov 2008 17:38:15 +0000 Subject: 2008-11-19 Richard Guenther * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@142009 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/expr.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'gcc/expr.c') diff --git a/gcc/expr.c b/gcc/expr.c index 31af3aa9c49..0f46b199883 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -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 expand is able to handle this correctly and get the correct result out 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: /* Check if this is a case for multiplication and addition. */ -- cgit v1.2.1