On Sat, 2011-04-16 at 00:49 +0200, Michael Matz wrote:

> Callers of expand_expr are expected to deal with the situation that the 
> returned object doesn't have the desired mode, hence I think it's okay for 
> expand_expr to return a DImode code_label rtx.  Meaning we have to deal 
> with it.  The patch of HJ is a first step but doesn't cater for op0 being 
> a CONST_INT, which doesn't have a mode, hence at the very least the code 
> should look like:
> 
>     enum machine_mode inner_mode = GET_MODE (op0);
>     if (inner_mode == VOIDmode)
>       inner_mode = TYPE_MODE (inner_type);
> 
> I do wonder what other places in expand really would need something 
> similar.  Right now nothing else ICEs but perhaps silently generates code 
> that only works by accident.  Well, I guess we'll see.
> 
> 
> Ciao,
> Michael.

I tested your patch and it fixed the problem with labels-3.c.  It also
ran through the test suite with no regressions on IA64 HP-UX and Linux
and on x86 Linux.  I do see other places in the compiler where we call
GET_MODE and then check for VOIDmode to do something special/different
if we got that return value (in cfgexpand.c for example) so maybe this
is just one more place where we need this type of check.

Steve Ellcey
s...@cup.hp.com

Can someone approve this patch?



2011-05-18  Michael Matz  <m...@suse.de>
            Steve Ellcey  <s...@cup.hp.com>

        * expr.c (expand_expr_real_2): Use GET_MODE instead of TYPE_MODE.


Index: expr.c
===================================================================
--- expr.c      (revision 172632)
+++ expr.c      (working copy)
@@ -7360,8 +7360,11 @@
       else if (CONSTANT_P (op0))
        {
          tree inner_type = TREE_TYPE (treeop0);
-         enum machine_mode inner_mode = TYPE_MODE (inner_type);
+         enum machine_mode inner_mode = GET_MODE (op0);
 
+         if (inner_mode == VOIDmode)
+           inner_mode = TYPE_MODE (inner_type);
+
          if (modifier == EXPAND_INITIALIZER)
            op0 = simplify_gen_subreg (mode, op0, inner_mode,
                                       subreg_lowpart_offset (mode,

Reply via email to