On 13-04-18 4:44 PM, Vladimir Makarov wrote:
Tomorrow I am going to look at SPEC2006 dealII crash for 32-bit mode.
LRA crashes on insn
(insn 406 575 391 22 (set (reg:TF 35 3)
(mem/u/c:TF (lo_sum:SI (reg:SI 7 7 [414])
(symbol_ref/u:SI ("*.LC10") [flags 0x82])) [85 S16
A128]))
/home/cygnus/vmakarov/build/spec2006/benchspec/CPU2006/447.dealII/src/quadrature_lib.cc:80
373 {*movtf_intern\
al}
(expr_list:REG_DEAD (reg:SI 7 7 [414])
(nil)))
As I understand this correct insn. LRA checks the insn correctness in
if (!constrain_operands (1))
fatal_insn_not_found (insn);
and fails. The reason for this code in
rs6000.c::legitimate_lo_sum_address_p
if (! lra_in_progress && GET_MODE_SIZE (mode) > UNITS_PER_WORD
&& !(/* ??? Assume floating point reg based on mode? */
TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
&& (mode == DFmode || mode == DDmode)))
return false;
lra_in_progress is false and mode==TFmode. I don't want to setup
lra_in_progress to true at this stage as I need right correctness check
(lra_in_progress may affect code checking RTLcorrectness, make the test
less rigourous).
If I change the above code to
if (! lra_in_progress && GET_MODE_SIZE (mode) > UNITS_PER_WORD
&& !(/* ??? Assume floating point reg based on mode? */
TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT
&& (mode == DFmode || mode == DDmode || mode == TFmode
|| mode == TDmode)))
return false;
the crash is gone.
I don't understand what this check means and what comments ??? means too.
So it is up to you, Mike, to decide is my change correct or not.
Thanks.