[i386] : Fix PR 91528, ICE in ix86_expand_prologue

Message ID CAFULd4a-Nxh_YgfBzhJN=dnhKt1hz27gid0u0FcvzZXegU=Gkg@mail.gmail.com
State New
Headers show
Series
  • [i386] : Fix PR 91528, ICE in ix86_expand_prologue
Related show

Commit Message

Uros Bizjak Aug. 27, 2019, 5:46 p.m.
When stack alignment is increased in convert_scalars_to_vector, we
have to update several other dependant fields in crtl struct, similar
to what expand_stack_alignment from cfgexpand.c does.

2019-08-27  UroŇ° Bizjak  <ubizjak@gmail.com>

    PR target/91528
    * config/i386/i386-features.c (convert_scalars_to_vector):
    Update crtl->stack_realign_needed, crtl->stack_realign_tried and
    crtl->stack_realign_processed.  Update crtl->drap_reg by calling
    targetm.calls.get_drap_rtx.  If drap_rtx is non-null then
    Update crtl->args.internal_arg_pointer and call fixup_tail_calls.

testsuite/ChangeLog:

2019-08-27  UroŇ° Bizjak  <ubizjak@gmail.com>

    PR target/91528
    * gcc.target/i386/pr91528.c: New test.

Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.

Committed to mainline SVN.

Uros.

Patch

Index: config/i386/i386-features.c
===================================================================
--- config/i386/i386-features.c	(revision 274958)
+++ config/i386/i386-features.c	(working copy)
@@ -1651,6 +1651,32 @@  convert_scalars_to_vector (bool timode_p)
 	crtl->stack_alignment_needed = 128;
       if (crtl->stack_alignment_estimated < 128)
 	crtl->stack_alignment_estimated = 128;
+
+      crtl->stack_realign_needed
+	= INCOMING_STACK_BOUNDARY < crtl->stack_alignment_estimated;
+      crtl->stack_realign_tried = crtl->stack_realign_needed;
+
+      crtl->stack_realign_processed = true;
+
+      if (!crtl->drap_reg)
+	{
+	  rtx drap_rtx = targetm.calls.get_drap_rtx ();
+
+	  /* stack_realign_drap and drap_rtx must match.  */
+	  gcc_assert ((stack_realign_drap != 0) == (drap_rtx != NULL));
+
+	  /* Do nothing if NULL is returned,
+	     which means DRAP is not needed.  */
+	  if (drap_rtx != NULL)
+	    {
+	      crtl->args.internal_arg_pointer = drap_rtx;
+
+	      /* Call fixup_tail_calls to clean up
+		 REG_EQUIV note if DRAP is needed. */
+	      fixup_tail_calls ();
+	    }
+	}
+
       /* Fix up DECL_RTL/DECL_INCOMING_RTL of arguments.  */
       if (TARGET_64BIT)
 	for (tree parm = DECL_ARGUMENTS (current_function_decl);
Index: testsuite/gcc.target/i386/pr91528.c
===================================================================
--- testsuite/gcc.target/i386/pr91528.c	(nonexistent)
+++ testsuite/gcc.target/i386/pr91528.c	(working copy)
@@ -0,0 +1,14 @@ 
+/* PR target/91528 */
+/* { dg-do compile { target ia32 } } */
+/* { dg-options "-Os -mavx512vbmi2 -mforce-drap" } */
+
+extern long int labs (long int j);
+
+int
+main ()
+{
+  long *a = (long *)"empty";
+  int i = 1441516387;
+  a[i] = labs (a[i]);
+  return 0;
+}