Re: Issue during combine.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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))))/








[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux