Cleaning up expand optabs code

Richard Sandiford richard.sandiford@linaro.org
Thu Mar 24 10:04:00 GMT 2011


"Anatoly Sokolov" <aesok@post.ru> writes:
> This patch casue ICE on H8300 target:

This is due to jump_address_operand checking the wrong mode.
The predicate is:

(define_predicate "jump_address_operand"
  (match_code "reg,mem")
{
  if (GET_CODE (op) == REG)
    return mode == Pmode;
  [...]
}

but "mode" is the mode passed to the predicate, not the mode of OP.
The indirect_jump pattern is:

(define_expand "indirect_jump"
  [(set (pc) (match_operand 0 "jump_address_operand" ""))]
  ""
  "")

which says that VOIDmode should be passed to jump_address_operand,
so all registers end up being rejected.

I've applied the following as the obvious fix.  You then hit bug
48263 ( http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48263 );
I'm testing a fix for that now.

Richard


gcc/
	* config/h8300/predicates.md (jump_address_operand): Fix register
	mode check.

Index: gcc/config/h8300/predicates.md
===================================================================
--- gcc/config/h8300/predicates.md	2011-01-05 15:12:08.000000000 +0000
+++ gcc/config/h8300/predicates.md	2011-03-24 09:20:15.000000000 +0000
@@ -259,7 +259,7 @@ (define_predicate "jump_address_operand"
   (match_code "reg,mem")
 {
   if (GET_CODE (op) == REG)
-    return mode == Pmode;
+    return GET_MODE (op) == Pmode;
 
   if (GET_CODE (op) == MEM)
     {



More information about the Gcc-patches mailing list