diff mbox

[commited] PR target/69530: [6 Regression] ICE: SIGSEGV

Message ID 20160129180542.GA11440@intel.com
State New
Headers show

Commit Message

H.J. Lu Jan. 29, 2016, 6:05 p.m. UTC
in ix86_split_long_move (i386.c:24353) with -fno-split-wide-types -mavx
Reply-To: "H.J. Lu" <hjl.tools@gmail.com>

r229087, which caused PR 69530, was supposed to fix PR 67609.  r229458
has made r229087 unnecessary.

Approved by Vladimir in PR 69530.  Checked into trunk.


H.J.
---
gcc/

	PR target/69530
	* lra-splill.c (lra_final_code_change): Revert r229087 by
	removing all sub-registers.

gcc/testsuite/

	PR target/69530
	* gcc.target/i386/pr69530.c: New test.
---
 gcc/lra-spills.c                        | 46 ++++++---------------------------
 gcc/testsuite/gcc.target/i386/pr69530.c | 11 ++++++++
 2 files changed, 19 insertions(+), 38 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr69530.c
diff mbox

Patch

diff --git a/gcc/lra-spills.c b/gcc/lra-spills.c
index fa0a579..5709ef1 100644
--- a/gcc/lra-spills.c
+++ b/gcc/lra-spills.c
@@ -760,44 +760,14 @@  lra_final_code_change (void)
 	  
 	  struct lra_static_insn_data *static_id = id->insn_static_data;
 	  bool insn_change_p = false;
-	  
-          for (i = id->insn_static_data->n_operands - 1; i >= 0; i--)
-	    {
-	      if (! DEBUG_INSN_P (insn) && static_id->operand[i].is_operator)
-		continue;
-	      
-	      rtx op = *id->operand_loc[i];
-	      
-	      if (static_id->operand[i].type == OP_OUT
-		  && GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op))
-		  && ! LRA_SUBREG_P (op))
-		{
-		  hard_regno = REGNO (SUBREG_REG (op));
-		  /* We can not always remove sub-registers of
-		     hard-registers as we may lose information that
-		     only a part of registers is changed and
-		     subsequent optimizations may do wrong
-		     transformations (e.g. dead code eliminations).
-		     We can not also keep all sub-registers as the
-		     subsequent optimizations can not handle all such
-		     cases.  Here is a compromise which works.  */
-		  if ((GET_MODE_SIZE (GET_MODE (op))
-		       < GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))))
-		      && (hard_regno_nregs[hard_regno][GET_MODE (SUBREG_REG (op))]
-			  == hard_regno_nregs[hard_regno][GET_MODE (op)])
-#ifdef STACK_REGS
-		      && (hard_regno < FIRST_STACK_REG
-			  || hard_regno > LAST_STACK_REG)
-#endif
-		      )
-		    continue;
-		}
-	      if (alter_subregs (id->operand_loc[i], ! DEBUG_INSN_P (insn)))
-		{
-		  lra_update_dup (id, i);
-		  insn_change_p = true;
-		}
-	    }
+
+	  for (i = id->insn_static_data->n_operands - 1; i >= 0; i--)
+	    if ((DEBUG_INSN_P (insn) || ! static_id->operand[i].is_operator)
+		&& alter_subregs (id->operand_loc[i], ! DEBUG_INSN_P (insn)))
+	      {
+		lra_update_dup (id, i);
+		insn_change_p = true;
+	      }
 	  if (insn_change_p)
 	    lra_update_operator_dups (id);
 	}
diff --git a/gcc/testsuite/gcc.target/i386/pr69530.c b/gcc/testsuite/gcc.target/i386/pr69530.c
new file mode 100644
index 0000000..9146d1d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr69530.c
@@ -0,0 +1,11 @@ 
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-O -fno-forward-propagate -fno-split-wide-types -mavx " } */
+
+typedef unsigned __int128 v32u128 __attribute__ ((vector_size (32)));
+
+v32u128
+foo (v32u128 v32u128_0)
+{
+  v32u128_0[0] *= v32u128_0[1];
+  return v32u128_0;
+}