Skip to content

Commit 94f896c

Browse files
author
Stefan Schulze Frielinghaus
committed
Determine CONSTRAINT_LEN at run-time [PR121214]
Tests gcc.dg/asm-hard-reg-error-{4,5}.c ICE on sparc*-sun-solaris2.11 since in tm-preds.h we end up with #define CONSTRAINT_LEN(c_,s_) 1 and, therefore, do not parse hard register constraints correctly. Hard register constraints are non-single character constraints and require insn_constraint_len() in order to determine the length. In write_tm_preds_h() from genpreds.cc, previously variable constraint_max_namelen was used in order to decide whether we have single or non-single character constraints. The distinction shouldn't be done anymore and we always must call into insn_constraint_len(). While being on it, remove guard constraint_max_namelen>0 since we always have some constraints coming from common.md. This leaves constraint_max_namelen without users so remove it. gcc/ChangeLog: PR middle-end/121214 * genpreds.cc (constraint_max_namelen): Delete. (write_tm_preds_h): Always write insn_constraint_len() and define CONSTRAINT_LEN to it, i.e., remove guard constraint_max_namelen>1. Remove outer guard constraint_max_namelen>0 and re-indent. (write_insn_preds_c): Remove guard constraint_max_namelen>0 and re-indent.
1 parent 6cc6bfc commit 94f896c

File tree

1 file changed

+123
-137
lines changed

1 file changed

+123
-137
lines changed

gcc/genpreds.cc

Lines changed: 123 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -719,7 +719,6 @@ static const char const_dbl_constraints[] = "GH";
719719

720720
/* Summary data used to decide whether to output various functions and
721721
macro definitions. */
722-
static unsigned int constraint_max_namelen;
723722
static bool have_register_constraints;
724723
static bool have_memory_constraints;
725724
static bool have_special_memory_constraints;
@@ -942,7 +941,6 @@ add_constraint (const char *name, const char *regclass,
942941
*last_constraint_ptr = c;
943942
last_constraint_ptr = &c->next_textual;
944943

945-
constraint_max_namelen = MAX (constraint_max_namelen, strlen (name));
946944
have_register_constraints |= c->is_register;
947945
have_const_int_constraints |= c->is_const_int;
948946
have_extra_constraints |= c->is_extra;
@@ -1563,133 +1561,124 @@ write_tm_preds_h (void)
15631561
"#endif\n"
15641562
"\n");
15651563

1566-
if (constraint_max_namelen > 0)
1567-
{
1568-
write_enum_constraint_num ();
1569-
puts ("extern enum constraint_num lookup_constraint_1 (const char *);\n"
1570-
"extern const unsigned char lookup_constraint_array[];\n"
1564+
write_enum_constraint_num ();
1565+
puts ("extern enum constraint_num lookup_constraint_1 (const char *);\n"
1566+
"extern const unsigned char lookup_constraint_array[];\n"
1567+
"\n"
1568+
"/* Return the constraint at the beginning of P, or"
1569+
" CONSTRAINT__UNKNOWN if it\n"
1570+
" isn't recognized. */\n"
1571+
"\n"
1572+
"static inline enum constraint_num\n"
1573+
"lookup_constraint (const char *p)\n"
1574+
"{\n"
1575+
" unsigned int index = lookup_constraint_array"
1576+
"[(unsigned char) *p];\n"
1577+
" return (index == UCHAR_MAX\n"
1578+
" ? lookup_constraint_1 (p)\n"
1579+
" : (enum constraint_num) index);\n"
1580+
"}\n");
1581+
if (satisfied_start == num_constraints)
1582+
puts ("/* Return true if X satisfies constraint C. */\n"
1583+
"\n"
1584+
"static inline bool\n"
1585+
"constraint_satisfied_p (rtx, enum constraint_num)\n"
1586+
"{\n"
1587+
" return false;\n"
1588+
"}\n");
1589+
else
1590+
printf ("extern bool (*constraint_satisfied_p_array[]) (rtx);\n"
15711591
"\n"
1572-
"/* Return the constraint at the beginning of P, or"
1573-
" CONSTRAINT__UNKNOWN if it\n"
1574-
" isn't recognized. */\n"
1592+
"/* Return true if X satisfies constraint C. */\n"
15751593
"\n"
1576-
"static inline enum constraint_num\n"
1577-
"lookup_constraint (const char *p)\n"
1578-
"{\n"
1579-
" unsigned int index = lookup_constraint_array"
1580-
"[(unsigned char) *p];\n"
1581-
" return (index == UCHAR_MAX\n"
1582-
" ? lookup_constraint_1 (p)\n"
1583-
" : (enum constraint_num) index);\n"
1584-
"}\n");
1585-
if (satisfied_start == num_constraints)
1586-
puts ("/* Return true if X satisfies constraint C. */\n"
1587-
"\n"
1588-
"static inline bool\n"
1589-
"constraint_satisfied_p (rtx, enum constraint_num)\n"
1590-
"{\n"
1591-
" return false;\n"
1592-
"}\n");
1593-
else
1594-
printf ("extern bool (*constraint_satisfied_p_array[]) (rtx);\n"
1595-
"\n"
1596-
"/* Return true if X satisfies constraint C. */\n"
1597-
"\n"
1598-
"static inline bool\n"
1599-
"constraint_satisfied_p (rtx x, enum constraint_num c)\n"
1600-
"{\n"
1601-
" int i = (int) c - (int) CONSTRAINT_%s;\n"
1602-
" return i >= 0 && constraint_satisfied_p_array[i] (x);\n"
1603-
"}\n"
1604-
"\n",
1605-
enum_order[satisfied_start]->name);
1606-
1607-
write_range_function ("insn_extra_register_constraint",
1608-
register_start, register_end);
1609-
write_range_function ("insn_extra_memory_constraint",
1610-
memory_start, memory_end);
1611-
write_range_function ("insn_extra_special_memory_constraint",
1612-
special_memory_start, special_memory_end);
1613-
write_range_function ("insn_extra_relaxed_memory_constraint",
1614-
relaxed_memory_start, relaxed_memory_end);
1615-
write_range_function ("insn_extra_address_constraint",
1616-
address_start, address_end);
1617-
write_allows_reg_mem_function ();
1618-
1619-
if (constraint_max_namelen > 1)
1620-
{
1621-
write_insn_constraint_len ();
1622-
puts ("#define CONSTRAINT_LEN(c_,s_) "
1623-
"insn_constraint_len (c_,s_)\n");
1624-
}
1625-
else
1626-
puts ("#define CONSTRAINT_LEN(c_,s_) 1\n");
1627-
if (have_register_constraints)
1628-
puts ("extern enum reg_class reg_class_for_constraint_1 "
1629-
"(enum constraint_num);\n"
1630-
"\n"
1631-
"static inline enum reg_class\n"
1632-
"reg_class_for_constraint (enum constraint_num c)\n"
1633-
"{\n"
1634-
" if (insn_extra_register_constraint (c))\n"
1635-
" return reg_class_for_constraint_1 (c);\n"
1636-
" return NO_REGS;\n"
1637-
"}\n");
1638-
else
1639-
puts ("static inline enum reg_class\n"
1640-
"reg_class_for_constraint (enum constraint_num)\n"
1641-
"{\n"
1642-
" return NO_REGS;\n"
1643-
"}\n");
1644-
if (have_const_int_constraints)
1645-
puts ("extern bool insn_const_int_ok_for_constraint "
1646-
"(HOST_WIDE_INT, enum constraint_num);\n"
1647-
"#define CONST_OK_FOR_CONSTRAINT_P(v_,c_,s_) \\\n"
1648-
" insn_const_int_ok_for_constraint (v_, "
1649-
"lookup_constraint (s_))\n");
1650-
else
1651-
puts ("static inline bool\n"
1652-
"insn_const_int_ok_for_constraint (HOST_WIDE_INT,"
1653-
" enum constraint_num)\n"
1654-
"{\n"
1655-
" return false;\n"
1656-
"}\n");
1657-
1658-
puts ("enum constraint_type\n"
1594+
"static inline bool\n"
1595+
"constraint_satisfied_p (rtx x, enum constraint_num c)\n"
16591596
"{\n"
1660-
" CT_REGISTER,\n"
1661-
" CT_CONST_INT,\n"
1662-
" CT_MEMORY,\n"
1663-
" CT_SPECIAL_MEMORY,\n"
1664-
" CT_RELAXED_MEMORY,\n"
1665-
" CT_ADDRESS,\n"
1666-
" CT_FIXED_FORM\n"
1667-
"};\n"
1668-
"\n"
1669-
"static inline enum constraint_type\n"
1670-
"get_constraint_type (enum constraint_num c)\n"
1671-
"{");
1672-
auto_vec <std::pair <unsigned int, const char *>, 4> values;
1673-
if (const_int_start != const_int_end)
1674-
values.safe_push (std::make_pair (const_int_start, "CT_CONST_INT"));
1675-
if (memory_start != memory_end)
1676-
values.safe_push (std::make_pair (memory_start, "CT_MEMORY"));
1677-
if (special_memory_start != special_memory_end)
1678-
values.safe_push (std::make_pair (special_memory_start,
1679-
"CT_SPECIAL_MEMORY"));
1680-
if (relaxed_memory_start != relaxed_memory_end)
1681-
values.safe_push (std::make_pair (relaxed_memory_start,
1682-
"CT_RELAXED_MEMORY"));
1683-
if (address_start != address_end)
1684-
values.safe_push (std::make_pair (address_start, "CT_ADDRESS"));
1685-
if (address_end != num_constraints)
1686-
values.safe_push (std::make_pair (address_end, "CT_FIXED_FORM"));
1687-
print_type_tree (values, 0, values.length (), "CT_REGISTER", 2);
1688-
puts ("}");
1689-
1690-
write_get_register_filter ();
1691-
write_get_register_filter_id ();
1692-
}
1597+
" int i = (int) c - (int) CONSTRAINT_%s;\n"
1598+
" return i >= 0 && constraint_satisfied_p_array[i] (x);\n"
1599+
"}\n"
1600+
"\n",
1601+
enum_order[satisfied_start]->name);
1602+
1603+
write_range_function ("insn_extra_register_constraint",
1604+
register_start, register_end);
1605+
write_range_function ("insn_extra_memory_constraint",
1606+
memory_start, memory_end);
1607+
write_range_function ("insn_extra_special_memory_constraint",
1608+
special_memory_start, special_memory_end);
1609+
write_range_function ("insn_extra_relaxed_memory_constraint",
1610+
relaxed_memory_start, relaxed_memory_end);
1611+
write_range_function ("insn_extra_address_constraint",
1612+
address_start, address_end);
1613+
write_allows_reg_mem_function ();
1614+
1615+
write_insn_constraint_len ();
1616+
puts ("#define CONSTRAINT_LEN(c_,s_) insn_constraint_len (c_,s_)\n");
1617+
if (have_register_constraints)
1618+
puts ("extern enum reg_class reg_class_for_constraint_1 "
1619+
"(enum constraint_num);\n"
1620+
"\n"
1621+
"static inline enum reg_class\n"
1622+
"reg_class_for_constraint (enum constraint_num c)\n"
1623+
"{\n"
1624+
" if (insn_extra_register_constraint (c))\n"
1625+
" return reg_class_for_constraint_1 (c);\n"
1626+
" return NO_REGS;\n"
1627+
"}\n");
1628+
else
1629+
puts ("static inline enum reg_class\n"
1630+
"reg_class_for_constraint (enum constraint_num)\n"
1631+
"{\n"
1632+
" return NO_REGS;\n"
1633+
"}\n");
1634+
if (have_const_int_constraints)
1635+
puts ("extern bool insn_const_int_ok_for_constraint "
1636+
"(HOST_WIDE_INT, enum constraint_num);\n"
1637+
"#define CONST_OK_FOR_CONSTRAINT_P(v_,c_,s_) \\\n"
1638+
" insn_const_int_ok_for_constraint (v_, "
1639+
"lookup_constraint (s_))\n");
1640+
else
1641+
puts ("static inline bool\n"
1642+
"insn_const_int_ok_for_constraint (HOST_WIDE_INT,"
1643+
" enum constraint_num)\n"
1644+
"{\n"
1645+
" return false;\n"
1646+
"}\n");
1647+
1648+
puts ("enum constraint_type\n"
1649+
"{\n"
1650+
" CT_REGISTER,\n"
1651+
" CT_CONST_INT,\n"
1652+
" CT_MEMORY,\n"
1653+
" CT_SPECIAL_MEMORY,\n"
1654+
" CT_RELAXED_MEMORY,\n"
1655+
" CT_ADDRESS,\n"
1656+
" CT_FIXED_FORM\n"
1657+
"};\n"
1658+
"\n"
1659+
"static inline enum constraint_type\n"
1660+
"get_constraint_type (enum constraint_num c)\n"
1661+
"{");
1662+
auto_vec <std::pair <unsigned int, const char *>, 4> values;
1663+
if (const_int_start != const_int_end)
1664+
values.safe_push (std::make_pair (const_int_start, "CT_CONST_INT"));
1665+
if (memory_start != memory_end)
1666+
values.safe_push (std::make_pair (memory_start, "CT_MEMORY"));
1667+
if (special_memory_start != special_memory_end)
1668+
values.safe_push (std::make_pair (special_memory_start,
1669+
"CT_SPECIAL_MEMORY"));
1670+
if (relaxed_memory_start != relaxed_memory_end)
1671+
values.safe_push (std::make_pair (relaxed_memory_start,
1672+
"CT_RELAXED_MEMORY"));
1673+
if (address_start != address_end)
1674+
values.safe_push (std::make_pair (address_start, "CT_ADDRESS"));
1675+
if (address_end != num_constraints)
1676+
values.safe_push (std::make_pair (address_end, "CT_FIXED_FORM"));
1677+
print_type_tree (values, 0, values.length (), "CT_REGISTER", 2);
1678+
puts ("}");
1679+
1680+
write_get_register_filter ();
1681+
write_get_register_filter_id ();
16931682

16941683
puts ("#endif /* tm-preds.h */");
16951684
}
@@ -1750,17 +1739,14 @@ write_insn_preds_c (void)
17501739
FOR_ALL_PREDICATES (p)
17511740
write_one_predicate_function (p);
17521741

1753-
if (constraint_max_namelen > 0)
1754-
{
1755-
write_lookup_constraint_1 ();
1756-
write_lookup_constraint_array ();
1757-
if (have_register_constraints)
1758-
write_reg_class_for_constraint_1 ();
1759-
write_constraint_satisfied_p_array ();
1760-
1761-
if (have_const_int_constraints)
1762-
write_insn_const_int_ok_for_constraint ();
1763-
}
1742+
write_lookup_constraint_1 ();
1743+
write_lookup_constraint_array ();
1744+
if (have_register_constraints)
1745+
write_reg_class_for_constraint_1 ();
1746+
write_constraint_satisfied_p_array ();
1747+
1748+
if (have_const_int_constraints)
1749+
write_insn_const_int_ok_for_constraint ();
17641750

17651751
write_init_reg_class_start_regs ();
17661752
}

0 commit comments

Comments
 (0)