Hi,

The 'code' part of a 'define_code_attr' refers to the type of the key, in other words, it uses a code_iterator to pick the value from their (key "value") pair list. Though it seems rtx_alloc_for_name requires a code_attribute to be used when the 'value' needs to be a type. In other words, no other type of attributes can be used to produce a rtx typed 'value'.

This patch removes that restriction and allows the backend to use any kind of attribute as long as that attribute always produces a valid code typed 'value'.

I also made some local, nonsense changes to test whether other attributes could be used regardless of type, for instance use an int attribute to produce modes:
+(define_int_iterator TEST_ITERATOR [UNSPEC_CALLEE_ABI UNSPEC_ABS])
+(define_int_attr test_attr [(UNSPEC_CALLEE_ABI "DI") (UNSPEC_ABS "SI")])
+
 (define_insn "*sibcall_insn"
   [(call (mem:DI (match_operand:DI 0 "aarch64_call_insn_operand" "Ucs, Usf")) (match_operand 1 ""))
-   (unspec:DI [(match_operand:DI 2 "const_int_operand")] UNSPEC_CALLEE_ABI)
+   (unspec:<test_attr> [(match_operand:<test_attr> 2 "const_int_operand")] TEST_ITERATOR)
    (return)]

or a mode attribute to produce ints:

+(define_mode_attr test_mode_attr [(HF "0") (SF "0") (DF "0")])
+
 (define_split
   [(set (match_operand:GPF_HF 0 "nonimmediate_operand")
        (match_operand:GPF_HF 1 "const_double_operand"))]
   "can_create_pseudo_p ()
    && !aarch64_can_const_movi_rtx_p (operands[1], <MODE>mode)
    && !aarch64_float_const_representable_p (operands[1])
    && !aarch64_float_const_zero_rtx_p (operands[1])
    &&  aarch64_float_const_rtx_p (operands[1])"
-  [(const_int 0)]
+  [(const_int <test_mode_attr>)]

These all build fine.  Which makes me think this change would be consistent with other attributes.

Bootstrapped and regression tested aarch64-linux-gnu and x86_64-linux-gnu.

OK for trunk?

gcc/ChangeLog:

    * read-rtl.cc (rtx_reader::rtx_alloc_for_name): Allow all attribute
    types to produce code 'values'.
    (check_code_attribute): Rename ...
    (check_attribute_codes): ... to this.  And change comments to refer to
    any type of iterator.
diff --git a/gcc/read-rtl.cc b/gcc/read-rtl.cc
index 
4f09e449c81fb3d05bc566e6b9fb1787f4b3e31b..a6d0d41535d5db41bd3110c03a970cb451ea0706
 100644
--- a/gcc/read-rtl.cc
+++ b/gcc/read-rtl.cc
@@ -1423,21 +1423,21 @@ check_code_iterator (struct mapping *iterator)
    consistent format.  Return a representative code.  */
 
 static rtx_code
-check_code_attribute (mapping *attr)
+check_attribute_codes (mapping *attr)
 {
   rtx_code bellwether = UNKNOWN;
   for (map_value *v = attr->values; v != 0; v = v->next)
     {
       rtx_code code = maybe_find_code (v->string);
       if (code == UNKNOWN)
-       fatal_with_file_and_line ("code attribute `%s' contains "
+       fatal_with_file_and_line ("attribute `%s' contains "
                                  "unrecognized rtx code `%s'",
                                  attr->name, v->string);
       if (bellwether == UNKNOWN)
        bellwether = code;
       else if (strcmp (GET_RTX_FORMAT (bellwether),
                       GET_RTX_FORMAT (code)) != 0)
-       fatal_with_file_and_line ("code attribute `%s' combines "
+       fatal_with_file_and_line ("attribute `%s' combines "
                                  "`%s' and `%s', which have different "
                                  "rtx formats", attr->name,
                                  GET_RTX_NAME (bellwether),
@@ -1604,7 +1604,7 @@ parse_reg_note_name (const char *string)
   fatal_with_file_and_line ("unrecognized REG_NOTE name: `%s'", string);
 }
 
-/* Allocate an rtx for code NAME.  If NAME is a code iterator or code
+/* Allocate an rtx for code NAME.  If NAME is a code iterator or an
    attribute, record its use for later and use one of its possible
    values as an interim rtx code.  */
 
@@ -1629,11 +1629,15 @@ rtx_reader::rtx_alloc_for_name (const char *name)
       /* Find the attribute itself.  */
       mapping *m = (mapping *) htab_find (codes.attrs, &attr);
       if (!m)
-       fatal_with_file_and_line ("unknown code attribute `%s'", attr);
+       m = (mapping *) htab_find (ints.attrs, &attr);
+      if (!m)
+       m = (mapping *) htab_find (modes.attrs, &attr);
+      if (!m)
+       fatal_with_file_and_line ("unknown attribute `%s'", attr);
 
       /* Pick the first possible code for now, and record the attribute
         use for later.  */
-      rtx x = rtx_alloc (check_code_attribute (m));
+      rtx x = rtx_alloc (check_attribute_codes (m));
       record_attribute_use (&codes, get_current_location (),
                            x, 0, deferred_name);
       return x;

Reply via email to