http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47727
H.J. Lu <hjl.tools at gmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Component|target |middle-end
Summary|[x32] internal compiler |[x32] Many passes can't
|error: Segmentation fault |handle const symbol when
| |Pmode != ptr_mode
--- Comment #4 from H.J. Lu <hjl.tools at gmail dot com> 2011-02-14 06:16:04
UTC ---
Various passes can't handle
(insn 36 62 37 3 (set (reg/f:SI 95)
(const:SI (plus:SI (symbol_ref:SI ("__CTOR_END__") [flags 0x2]
<var_dec
l 0x7ffff0cf0000 __CTOR_END__>)
(const_int -4 [0xfffffffffffffffc])))) c.i:7 64
{*movsi_internal
}
(nil))
(insn 37 36 38 3 (set (reg/v/f:DI 93 [ p ])
(zero_extend:DI (reg/f:SI 95))) c.i:7 115 {*zero_extendsidi2_rex64}
(expr_list:REG_EQUAL (const:DI (reg:DI 98))
(nil)))
properly when Pmode != ptr_mode. cse, cprop and combine do things
like
#0 emit_insn (x=0x7ffff0d46900)
at /export/gnu/import/git/gcc-x32/gcc/emit-rtl.c:4791
#1 0x00000000006f0e87 in emit_move_insn_1 (x=0x7ffff0d42dc0, y=0x7ffff0d42b40)
at /export/gnu/import/git/gcc-x32/gcc/expr.c:3305
#2 0x00000000006f125a in emit_move_insn (x=0x7ffff0d42dc0, y=0x7ffff0d42b40)
at /export/gnu/import/git/gcc-x32/gcc/expr.c:3395
#3 0x00000000006d503e in copy_to_mode_reg (mode=SImode, x=0x7ffff0d42b40)
at /export/gnu/import/git/gcc-x32/gcc/explow.c:637
#4 0x00000000008d9656 in expand_binop_directly (mode=SImode,
binoptab=0x1809e20, op0=0x7ffff0d42b40, op1=0x7ffff0dea430,
target=0x7ffff0d42da0, unsignedp=1, methods=OPTAB_LIB_WIDEN,
last=0x7ffff0cf1980) at /export/gnu/import/git/gcc-x32/gcc/optabs.c:1461
#5 0x00000000008d99c2 in expand_binop (mode=SImode, binoptab=0x1809e20,
op0=0x7ffff0d42b40, op1=0x7ffff0dea430, target=0x7ffff0d42da0,
unsignedp=1, methods=OPTAB_LIB_WIDEN)
at /export/gnu/import/git/gcc-x32/gcc/optabs.c:1551
#6 0x00000000008d9185 in expand_simple_binop (mode=SImode, code=PLUS,
op0=0x7ffff0d42b40, op1=0x7ffff0dea430, target=0x7ffff0d42da0,
unsignedp=1, methods=OPTAB_LIB_WIDEN)
at /export/gnu/import/git/gcc-x32/gcc/optabs.c:1295
#7 0x0000000000701383 in force_operand (value=0x7ffff0d473a8,
target=0x7ffff0d42da0) at /export/gnu/import/git/gcc-x32/gcc/expr.c:6452
#8 0x00000000006d4fed in copy_to_mode_reg (mode=SImode, x=0x7ffff0d473a8)
---Type <return> to continue, or q <return> to quit---
at /export/gnu/import/git/gcc-x32/gcc/explow.c:633
#9 0x00000000008df8d7 in maybe_emit_unop_insn (icode=2221,
target=0x7ffff0d42d80, op0=0x7ffff0d473a8, code=ZERO_EXTEND)
at /export/gnu/import/git/gcc-x32/gcc/optabs.c:3746
#10 0x00000000008dfa49 in emit_unop_insn (icode=2221, target=0x7ffff0d42d80,
op0=0x7ffff0d473a8, code=ZERO_EXTEND)
at /export/gnu/import/git/gcc-x32/gcc/optabs.c:3776
#11 0x00000000006e9df4 in convert_move (to=0x7ffff0d42d80,
from=0x7ffff0d473a8, unsignedp=1)
at /export/gnu/import/git/gcc-x32/gcc/expr.c:612
#12 0x00000000006ea5de in convert_modes (mode=DImode, oldmode=SImode,
x=0x7ffff0d473a8, unsignedp=1)
at /export/gnu/import/git/gcc-x32/gcc/expr.c:791
#13 0x00000000006d4971 in convert_memory_address_addr_space (to_mode=DImode,
x=0x7ffff0d473a8, as=0 '\000')
at /export/gnu/import/git/gcc-x32/gcc/explow.c:408
#14 0x00000000006d488d in convert_memory_address_addr_space (to_mode=DImode,
x=0x7ffff0d43d10, as=0 '\000')
at /export/gnu/import/git/gcc-x32/gcc/explow.c:379
#15 0x00000000009bceb1 in simplify_unary_operation_1 (code=ZERO_EXTEND,
mode=DImode, op=0x7ffff0d43d10)
at /export/gnu/import/git/gcc-x32/gcc/simplify-rtx.c:1111
#16 0x00000000009bafa8 in simplify_unary_operation (code=ZERO_EXTEND,
---Type <return> to continue, or q <return> to quit---
mode=DImode, op=0x7ffff0d43d10, op_mode=SImode)
at /export/gnu/import/git/gcc-x32/gcc/simplify-rtx.c:526
But they are not prepared to deal with the new instruction
sequence nor new pseudo registers. Those passes should skip
them.