[prev in list] [next in list] [prev in thread] [next in thread]
List: gcc
Subject: Reload generate invalid instruction on ppc64
From: Carrot Wei <carrot () google ! com>
Date: 2014-07-29 0:49:26
Message-ID: CAEe8uEDftFtsBzhrj5Ab2yj+-uqzAXF8bKZDjjFm8UG-KL24Uw () mail ! gmail ! com
[Download RAW message or body]
Hi Vlad
When I use ppc64 gcc4.9 to compile an internal application I got an
ICE due to an invalid instruction generated by reload.
Before IRA, I have following insns:
(insn 139 136 581 10 (set (reg:DI 567)
(const_int 0 [0])) ./strings/stringpiece.h:205 discrim 1 520
{*movdi_internal64}
(expr_list:REG_EQUIV (const_int 0 [0])
(nil)))
...
(insn 231 1062 237 24 (set (reg:V2DI 401 [ vect_cst_.7586 ])
(vec_concat:V2DI (reg:DI 235 [ fprint$lo_ ])
(reg:DI 567))) 1066 {vsx_concat_v2di}
(expr_list:REG_DEAD (reg:DI 235 [ fprint$lo_ ])
(expr_list:REG_EQUAL (vec_concat:V2DI (reg:DI 235 [ fprint$lo_ ])
(const_int 0 [0]))
(nil))))
IRA decides register r567 should be spilled into memory
a48(r567,l0) -- assign memory
48:r567 l0 mem
Later reload pass reload constant 0 into hard floating point r42 directly
(insn 1086 1062 231 24 (set (reg:DI 42 10)
(const_int 0 [0])) 520 {*movdi_internal64}
(nil))
(insn 231 1086 237 24 (set (reg:V2DI 32 0 [orig:401 vect_cst_.7586 ] [401])
(vec_concat:V2DI (reg:DI 32 0 [orig:235 fprint$lo_ ] [235])
(reg:DI 42 10))) 1066 {vsx_concat_v2di}
(expr_list:REG_EQUAL (vec_concat:V2DI (reg:DI 32 0 [orig:235
fprint$lo_ ] [235])
(const_int 0 [0]))
(nil)))
Unfortunately insn 1086 doesn't satisfy the constraints of insn
pattern movdi_internal64, so causing an ICE in later pass.
The reload insn 1086 is generated by following code in function
reload1.c:gen_reload
/* If IN is a simple operand, use gen_move_insn. */
else if (OBJECT_P (in) || GET_CODE (in) == SUBREG)
{
tem = emit_insn (gen_move_insn (out, in));
/* IN may contain a LABEL_REF, if so add a REG_LABEL_OPERAND note. */
mark_jump_label (in, tem, 0);
}
After generating the move insn, reload doesn't check if the insn is
valid or if it can satisfy constraints. On ppc64 we can't load a
constant into fp/vsx register directly. Is it a bug here?
thanks a lot
Guozhi Wei
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic