Hello Segher, Dan, all,
The issue is following:
(as far as I understand it.)
- There are 2 instructions, they are combined by the combiner.
- As correctly stated by you, the combiner tries these, to see if it
makes sense.
- Of course, it should not make sense, and should be rejected.
- However, during the "checking", the combiner calls "simplify_subreg"
in simplify-rtx.c.
- There, it crashes on "/gcc_assert(innermode != VOIDmode)/.
- Please look at the rtx, and how this is combined. This 'mistake' is
created by the combiner. Combining the RTX (see below),
it changed the expression
/(set (...) (subreg:qi(reg: si 197,0)))
/into
/(set (...) )subreg:qi(if_then_else ...
/Apparently, the /if_then_else/ - operator not being subreggable, this
is recognized as VOIDmode, causing simplify_subreg to crash.
- I fixed it by causing the subroutine to fail (= tell "this expression
cannot be simplified"), instead of crash by adding a statement.
- If you want me to submit it, well, simplify the test case that is
still possible, but ... how should I submit the custom back-end ?.
(I am willing to do it, but does it make sense ?.)
Best Regards,
Henri.
*BELOW/:/*/routine simplify_subreg/ and the relevant rtx statements
before and after combine.
//
/rtx//
//simplify_subreg (machine_mode outermode, rtx op,//
// machine_mode innermode, poly_uint64 byte)//
//{/*
/if(innermode == VOIDmode) return(0) ; // MY BUG//FIX/
*/gcc_assert(innermode != VOIDmode)/
Before combine:
/(insn 2354 2352 1743 175 (set (reg/v:SI 197 [ dig ])//
// (if_then_else (eq (subreg:QI (reg:SI 632) 1)//
// (const_int 1 [0x1]))//
// (reg:SI 708)//
// (reg/v:SI 197 [ dig ])))
"/home/henri/blueICe/gcc/newlib/newlib/libc/stdlib/dtoa.c":771:6 35
{select_internal3}//
// (expr_list:REG_DEAD (reg:SI 708)//
// (expr_list:REG_DEAD (reg:SI 632)//
// (nil))))//
//(insn 1743 2354 124 175 (set (mem:QI (reg:SI 316 [ ivtmp.118 ]) [0
*s_304+0 S1 A8])//
// (subreg:QI (reg/v:SI 197 [ dig ]) 0))
"/home/henri/blueICe/gcc/newlib/newlib/libc/stdlib/dtoa.c":772:13 6
{movqi_internal}//
// (expr_list:REG_DEAD (reg:SI 316 [ ivtmp.118 ])//
// (expr_list:REG_DEAD (reg/v:SI 197 [ dig ])//
// (nil))))/
This is during the combine-step transformed into:
/(insn 1743 2354 124 175 (set (mem:QI (reg:SI 316 [ ivtmp.118 ]) [0
*s_304+0 S1 A8])//
// (subreg:QI (if_then_else (eq (subreg:QI (reg:SI 632) 1)//
// (const_int 1 [0x1]))//
// (reg:SI 708)//
// (reg/v:SI 197 [ dig ])) 0))
"/home/henri/blueICe/gcc/newlib/newlib/libc/stdlib/dtoa.c":772:13 6
{movqi_internal}//
// (expr_list:REG_DEAD (reg:SI 316 [ ivtmp.118 ])//
// (expr_list:REG_DEAD (reg/v:SI 197 [ dig ])//
// (nil))))/