Hello all,
I am building a gcc 9.2.0 custom compiler, and I am running in an issue
during step 263, combine.
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))))/
This, of course, is not correct any more. Now, how should I prevent this
?, the pattern is defined in the .md-file as:
/(define_insn "movqi_internal" //
//[(set (match_operand:QI 0 "movqi_operand_0"
"=r,r,r,r,r,r,u,u,W,t,r,c,*c*l,*h,*h,y")//
//(match_operand:QI 1 "movqi_operand_1" "O,k,i,r,W,t,W,t,r,r,*h,u, r,
r, 0,y"))]/
/.../
and /movqi_operand_1/ is defined as:
/(define_predicate "movqi_operand_1"//
// (ior (match_operand 0 "gpc_reg_operand")//
// (ior (match_operand 0
"quarterword_offset21_memref_operand_or_indirect")//
// (match_operand 0 "immediate_operand"))))/
and /gpc_reg_operand/ as:
/(define_predicate "gpc_reg_operand"//
// (and (match_operand 0 "register_operand")//
// (match_test "(GET_CODE (op) != REG && GET_CODE(op) != SUBREG//
// || (REGNO (op) >= ARG_POINTER_REGNUM//
// && !CA_REGNO_P (REGNO (op)))//
// || REGNO (op) == SFP_REGNO//
// || REGNO (op) == ARG_POINTER_REGNUM//
// || REGNO (op) <= MAX_REGFILE_REGNO)")))/
Any of you any idea why the combine succeeds ?. I mean, it should fail
!. After combine, it does not match /movqi_internal/ pattern
any more, but the compiler seems to think otherwise !.
Best Regards,
Henri.