On 19/10/2020 13:53, Henri Cloetens wrote: > 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)// Your problem is likely here, on the input. The SET_SRC (the if_then_else) of the pattern should have the same mode as the SET_DEST, unless the SET_SRC is a CONST_INT. R. > // (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. > >