Fix xstormy16 handling of HImode predicates

Richard Sandiford richard.sandiford@arm.com
Mon Apr 27 10:03:00 GMT 2015


xstormy16 has:

(define_predicate "xs_hi_general_operand"
  (match_code "const_int,reg,subreg,mem,symbol_ref,label_ref,const")
{
  if ((GET_CODE (op) == CONST_INT)
       && ((INTVAL (op) >= 32768) || (INTVAL (op) < -32768)))
    {
      error ("constant halfword load operand out of range");
      return false;
    }
    
  return general_operand (op, mode);
})

I think this is wrong for two reasons:

- Predicates are supposed to accept things in different modes and weed out
  the invalid values.  That's why the predicates start with a check that
  GET_MODE (op) == VOIDmode || GET_MODE (op) == mode.

  IMO it doesn't make sense to handle (e.g.) SImode REGs correctly but
  raise an error for SImode CONST_INTs.  The generic predicates later
  reject CONST_INTs that aren't suitable for the mode, so invalid
  HImode CONST_INTs will fail to match rather than be silently accepted.

- If we did have a check, it should be an assert rather than a user error.

The port is effectively relying on the matching algorithm in genrecog to
ensure that the predicate is only called on SET_SRC rtxes once the mode
of the SET_DEST has been checked.

This patch removes the predicate and uses general_operand instead.

xs_hi_nonmemory_operand is similar except that it rejects symbol_ref
and label_ref constants.  The patch therefore removes the error check
but keeps the restricted code list.

Note that we have an assert in rtl.h that CONST_INTs fit into the
range appropriate for the wi:: precision.  This should catch more
cases than the predicate checks would have.  (It has flagged up
problems that were latent before.)

Tested by building xstormy16-elf and making sure that there were
no differences in assembly output for the GCC testsuite.
OK to install?

Thanks,
Richard


gcc/
	* config/stormy16/predicates.md (xs_hi_general_operand): Delete.
	(xs_hi_nonmemory_operand): Remove error.
	* config/stormy16/stormy16.md (movhi, movhi_internal): Use
	general_operand rather than xs_hi_general_operand.

Index: gcc/config/stormy16/predicates.md
===================================================================
--- gcc/config/stormy16/predicates.md	2015-04-27 10:38:48.000000000 +0100
+++ gcc/config/stormy16/predicates.md	2015-04-27 10:40:00.709344494 +0100
@@ -151,28 +151,8 @@ (define_predicate "xstormy16_carry_plus_
 	  && (INTVAL (XEXP (op, 1)) < -4 || INTVAL (XEXP (op, 1)) > 4));
 })
 
-(define_predicate "xs_hi_general_operand"
-  (match_code "const_int,reg,subreg,mem,symbol_ref,label_ref,const")
-{
-  if ((GET_CODE (op) == CONST_INT)
-       && ((INTVAL (op) >= 32768) || (INTVAL (op) < -32768)))
-    {
-      error ("constant halfword load operand out of range");
-      return false;
-    }
-    
-  return general_operand (op, mode);
-})
-
 (define_predicate "xs_hi_nonmemory_operand"
   (match_code "const_int,reg,subreg,const")
 {
-  if ((GET_CODE (op) == CONST_INT) 
-       && ((INTVAL (op) >= 32768) || (INTVAL (op) < -32768)))
-    {
-      error ("constant arithmetic operand out of range");
-      return false;
-    }
-
   return nonmemory_operand (op, mode);
 })
Index: gcc/config/stormy16/stormy16.md
===================================================================
--- gcc/config/stormy16/stormy16.md	2015-04-27 10:38:48.000000000 +0100
+++ gcc/config/stormy16/stormy16.md	2015-04-27 10:40:00.709344494 +0100
@@ -185,7 +185,7 @@ (define_insn "pophi1"
 
 (define_expand "movhi"
   [(set (match_operand:HI 0 "nonimmediate_nonstack_operand" "")
-	(match_operand:HI 1 "xs_hi_general_operand" ""))]
+	(match_operand:HI 1 "general_operand" ""))]
   ""
   { xstormy16_expand_move (HImode, operands[0], operands[1]);
     DONE;
@@ -193,7 +193,7 @@ (define_expand "movhi"
 
 (define_insn "movhi_internal"
   [(set (match_operand:HI 0 "nonimmediate_nonstack_operand" "=r,m,e,e,T,r,S,W,e")
-	(match_operand:HI 1 "xs_hi_general_operand"          "r,e,m,L,L,i,i,ie,W"))]
+	(match_operand:HI 1 "general_operand"                "r,e,m,L,L,i,i,ie,W"))]
   ""
   "@
    mov %0,%1



More information about the Gcc-patches mailing list