This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RTL problem with optimizations



Hello All, I have defined RTL patterns for HImode in my .md files as follows :

(define_expand "ashlhi3"
  [(set (match_operand:HI 0 "register_operand" "")
	(ashift:HI (match_operand:HI 1 "register_operand" "")
	           (match_operand:HI 2 "general_operand" "")))]
   ""
   "
{
  /* If the argument is not a const, load it in a register */
  if (GET_CODE (operands[2]) != CONST_INT)
    {
      emit_insn (gen_rtx (PARALLEL, VOIDmode,
	 	 gen_rtvec (2, gen_rtx (SET, VOIDmode,
			    operand0,
			    gen_rtx_ASHIFT (HImode,
					operand1, operand2)),
			      gen_rtx (CLOBBER, VOIDmode, operand2))));
	  DONE;
    }
}")


(define_insn "*ashlhi3_reg" [(parallel [ (set (match_operand:HI 0 "register_operand" "=b,x") (ashift:HI (match_operand:HI 1 "register_operand" "%0,0") (match_operand:HI 2 "register_operand" "x,b") ) ) (clobber (match_dup 2)) ] )] "" { mlx16_emit_shift( HImode, (which_alternative == 0), ASHIFT, operands ); return ""; } [(set_attr "cc" "set_zn,set_zn")] )

This pattern works, unless I try to compile newlib's file hash.c with -O3 option specified.
GCC gives followintg error :


->>>
../../../../../newlib_src/newlib/libc/search/hash.c:957: error: unrecognizable insn:
(insn 102 101 104 6 ../../../../../newlib_src/newlib/libc/search/hash.c:955 (par
allel [
(set (reg:HI 49)
(ashift:HI (reg/v:HI 18 [ i ])
(reg:HI 48 [ <variable>.hdr.sshift ])))
(clobber (reg:HI 74 [ <variable>.hdr.sshift ]))
]) -1 (insn_list 101 (nil))
(expr_list:REG_DEAD (reg:HI 48 [ <variable>.hdr.sshift ])
(expr_list:REG_UNUSED (reg:HI 74 [ <variable>.hdr.sshift ])
(expr_list:REG_EQUAL (ashift:HI (reg/v:HI 18 [ i ])
(reg/v:HI 69 [ <variable>.hdr.sshift ]))
(nil)))))
../../../../../newlib_src/newlib/libc/search/hash.c:957: internal compiler error
: in extract_insn, at recog.c:2083
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.


->>>

When I look at RTL dumps , I see :

hash.c.16.loop2:

(insn 102 101 104 6 ../../../../../newlib_src/newlib/libc/search/hash.c:955 (parallel [
(set (reg:HI 49)
(ashift:HI (reg/v:HI 18 [ i ])
(reg:HI 48 [ <variable>.hdr.sshift ])))
(clobber (reg:HI 48 [ <variable>.hdr.sshift ]))
]) -1 (nil)
(expr_list:REG_EQUAL (ashift:HI (reg/v:HI 18 [ i ])
(reg/v:HI 69 [ <variable>.hdr.sshift ]))
(nil)))
This perfectly match to my desription in the RTL file.


However if I take a look into hash.c.17.web

(insn 102 101 104 6 ../../../../../newlib_src/newlib/libc/search/hash.c:955 (parallel [
(set (reg:HI 49)
(ashift:HI (reg/v:HI 18 [ i ])
(reg:HI 48 [ <variable>.hdr.sshift ])))
(clobber (reg:HI 74 [ <variable>.hdr.sshift ]))
]) -1 (nil)
(expr_list:REG_EQUAL (ashift:HI (reg/v:HI 18 [ i ])
(reg/v:HI 69 [ <variable>.hdr.sshift ]))
(nil)))


I tried to find something about .web but I couldn't. I am wondering why gcc replaces reg 48 with reg 75 and if there is a way to
explain it not to do that :). Of course I can define pattern to match such instruction, but this seems to me to be wrong.
I have the same problem with -O4 optimizations. This problem does not appear with other -Ox options.


GCCINT does not say anything about .web, i.e. after which compilation phase it is being generated.
My questions are about this .web file , what it is ? and why compiler decides to replace clobber register ?


Regards
--
Petar Penchev
Software engineer


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]