>From INSTRUCTION EXCEPTION SPECIFICATION section in Intel software
developer manual volume 2, only legacy SSE instructions with memory
operand not 16-byte aligned get General Protection fault.  There is
no need to check 1, 2, 4, 8 byte alignments.  Since x86 backend has
accurate constraints and predicates for 16-byte alignment, we can
remove ix86_legitimate_combined_insn.

Tested on x86-64.  OK for trunk?

H.J.
---
        * config/i386/i386.c (ix86_legitimate_combined_insn): Removed.
        (TARGET_LEGITIMATE_COMBINED_INSN): Likewise.
        (ix86_expand_special_args_builtin): Replace
        ix86_legitimate_combined_insn with vector_memory_operand in
        comments.
---
 gcc/config/i386/i386.c | 96 ++------------------------------------------------
 1 file changed, 2 insertions(+), 94 deletions(-)

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index e056f68..a66cfc4 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -7288,95 +7288,6 @@ ix86_return_pops_args (tree fundecl, tree funtype, int 
size)
 
   return 0;
 }
-
-/* Implement the TARGET_LEGITIMATE_COMBINED_INSN hook.  */
-
-static bool
-ix86_legitimate_combined_insn (rtx_insn *insn)
-{
-  /* Check operand constraints in case hard registers were propagated
-     into insn pattern.  This check prevents combine pass from
-     generating insn patterns with invalid hard register operands.
-     These invalid insns can eventually confuse reload to error out
-     with a spill failure.  See also PRs 46829 and 46843.  */
-  if ((INSN_CODE (insn) = recog (PATTERN (insn), insn, 0)) >= 0)
-    {
-      int i;
-
-      extract_insn (insn);
-      preprocess_constraints (insn);
-
-      int n_operands = recog_data.n_operands;
-      int n_alternatives = recog_data.n_alternatives;
-      for (i = 0; i < n_operands; i++)
-       {
-         rtx op = recog_data.operand[i];
-         machine_mode mode = GET_MODE (op);
-         const operand_alternative *op_alt;
-         int offset = 0;
-         bool win;
-         int j;
-
-         /* For pre-AVX disallow unaligned loads/stores where the
-            instructions don't support it.  */
-         if (!TARGET_AVX
-             && VECTOR_MODE_P (mode)
-             && misaligned_operand (op, mode))
-           {
-             unsigned int min_align = get_attr_ssememalign (insn);
-             if (min_align == 0
-                 || MEM_ALIGN (op) < min_align)
-               return false;
-           }
-
-         /* A unary operator may be accepted by the predicate, but it
-            is irrelevant for matching constraints.  */
-         if (UNARY_P (op))
-           op = XEXP (op, 0);
-
-         if (SUBREG_P (op))
-           {
-             if (REG_P (SUBREG_REG (op))
-                 && REGNO (SUBREG_REG (op)) < FIRST_PSEUDO_REGISTER)
-               offset = subreg_regno_offset (REGNO (SUBREG_REG (op)),
-                                             GET_MODE (SUBREG_REG (op)),
-                                             SUBREG_BYTE (op),
-                                             GET_MODE (op));
-             op = SUBREG_REG (op);
-           }
-
-         if (!(REG_P (op) && HARD_REGISTER_P (op)))
-           continue;
-
-         op_alt = recog_op_alt;
-
-         /* Operand has no constraints, anything is OK.  */
-         win = !n_alternatives;
-
-         alternative_mask preferred = get_preferred_alternatives (insn);
-         for (j = 0; j < n_alternatives; j++, op_alt += n_operands)
-           {
-             if (!TEST_BIT (preferred, j))
-               continue;
-             if (op_alt[i].anything_ok
-                 || (op_alt[i].matches != -1
-                     && operands_match_p
-                         (recog_data.operand[i],
-                          recog_data.operand[op_alt[i].matches]))
-                 || reg_fits_class_p (op, op_alt[i].cl, offset, mode))
-               {
-                 win = true;
-                 break;
-               }
-           }
-
-         if (!win)
-           return false;
-       }
-    }
-
-  return true;
-}
 
 /* Implement the TARGET_ASAN_SHADOW_OFFSET hook.  */
 
@@ -39859,7 +39770,7 @@ ix86_expand_special_args_builtin (const struct 
builtin_description *d,
             on it.  Try to improve it using get_pointer_alignment,
             and if the special builtin is one that requires strict
             mode alignment, also from it's GET_MODE_ALIGNMENT.
-            Failure to do so could lead to ix86_legitimate_combined_insn
+            Failure to do so could lead to vector_memory_operand
             rejecting all changes to such insns.  */
          unsigned int align = get_pointer_alignment (arg);
          if (aligned_mem && align < GET_MODE_ALIGNMENT (tmode))
@@ -39915,7 +39826,7 @@ ix86_expand_special_args_builtin (const struct 
builtin_description *d,
                 on it.  Try to improve it using get_pointer_alignment,
                 and if the special builtin is one that requires strict
                 mode alignment, also from it's GET_MODE_ALIGNMENT.
-                Failure to do so could lead to ix86_legitimate_combined_insn
+                Failure to do so could lead to vector_memory_operand
                 rejecting all changes to such insns.  */
              unsigned int align = get_pointer_alignment (arg);
              if (aligned_mem && align < GET_MODE_ALIGNMENT (mode))
@@ -54472,9 +54383,6 @@ ix86_addr_space_zero_address_valid (addr_space_t as)
 #undef TARGET_RETURN_POPS_ARGS
 #define TARGET_RETURN_POPS_ARGS ix86_return_pops_args
 
-#undef TARGET_LEGITIMATE_COMBINED_INSN
-#define TARGET_LEGITIMATE_COMBINED_INSN ix86_legitimate_combined_insn
-
 #undef TARGET_ASAN_SHADOW_OFFSET
 #define TARGET_ASAN_SHADOW_OFFSET ix86_asan_shadow_offset
 
-- 
2.5.5

Reply via email to