X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fcfgexpand.c;h=3a36ee1794460077785c4445780fb5403b5090c2;hb=41bad6995351f6de06586894de5fe4a494a3206d;hp=48173d9b992b4e795cc83c1157d41a272f27f7e9;hpb=1a981e1a975098bd537556d2b36f275f3bc075c7;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 48173d9b992..3a36ee17944 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -36,6 +36,8 @@ along with GCC; see the file COPYING3. If not see #include "except.h" #include "flags.h" #include "diagnostic.h" +#include "tree-pretty-print.h" +#include "gimple-pretty-print.h" #include "toplev.h" #include "debug.h" #include "params.h" @@ -43,7 +45,8 @@ along with GCC; see the file COPYING3. If not see #include "value-prof.h" #include "target.h" #include "ssaexpand.h" - +#include "bitmap.h" +#include "sbitmap.h" /* This variable holds information helping the rewriting of SSA trees into RTL. */ @@ -2561,13 +2564,14 @@ expand_debug_expr (tree exp) if (bitpos < 0) return NULL; + if (GET_MODE (op0) == BLKmode) + return NULL; + if ((bitpos % BITS_PER_UNIT) == 0 && bitsize == GET_MODE_BITSIZE (mode1)) { enum machine_mode opmode = GET_MODE (op0); - gcc_assert (opmode != BLKmode); - if (opmode == VOIDmode) opmode = mode1; @@ -2616,6 +2620,22 @@ expand_debug_expr (tree exp) return gen_rtx_FIX (mode, op0); case POINTER_PLUS_EXPR: + /* For the rare target where pointers are not the same size as + size_t, we need to check for mis-matched modes and correct + the addend. */ + if (op0 && op1 + && GET_MODE (op0) != VOIDmode && GET_MODE (op1) != VOIDmode + && GET_MODE (op0) != GET_MODE (op1)) + { + if (GET_MODE_BITSIZE (GET_MODE (op0)) < GET_MODE_BITSIZE (GET_MODE (op1))) + op1 = gen_rtx_TRUNCATE (GET_MODE (op0), op1); + else + /* We always sign-extend, regardless of the signedness of + the operand, because the operand is always unsigned + here even if the original C expression is signed. */ + op1 = gen_rtx_SIGN_EXTEND (GET_MODE (op0), op1); + } + /* Fall through. */ case PLUS_EXPR: return gen_rtx_PLUS (mode, op0, op1); @@ -3007,14 +3027,15 @@ expand_debug_expr (tree exp) if (SCALAR_INT_MODE_P (GET_MODE (op0)) && SCALAR_INT_MODE_P (mode)) { + enum machine_mode inner_mode = GET_MODE (op0); if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))) - op0 = gen_rtx_ZERO_EXTEND (mode, op0); + op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode); else - op0 = gen_rtx_SIGN_EXTEND (mode, op0); + op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode); if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 1)))) - op1 = gen_rtx_ZERO_EXTEND (mode, op1); + op1 = simplify_gen_unary (ZERO_EXTEND, mode, op1, inner_mode); else - op1 = gen_rtx_SIGN_EXTEND (mode, op1); + op1 = simplify_gen_unary (SIGN_EXTEND, mode, op1, inner_mode); return gen_rtx_MULT (mode, op0, op1); } return NULL;