re PR target/91528 (ICE in ix86_expand_prologue at i386.c:7844 since r274481)
authorUros Bizjak <ubizjak@gmail.com>
Tue, 27 Aug 2019 17:23:59 +0000 (19:23 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 27 Aug 2019 17:23:59 +0000 (19:23 +0200)
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:

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

From-SVN: r274962

gcc/ChangeLog
gcc/config/i386/i386-features.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr91528.c [new file with mode: 0644]

index 65f9db966d067bca2d1783e9d85ea6c362a7d8e8..39459d087b22e4dcdaef4278b68fe433f62d3b96 100644 (file)
@@ -1,3 +1,12 @@
+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.
+
 2019-08-27  Richard Biener  <rguenther@suse.de>
 
        * config/i386/i386-features.h
index 9505b4a133009a982e589b7ae4ea65649c7ec8dc..6eb1482a9f01bcf0a5bf6cd4b203f71945f9c094 100644 (file)
@@ -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 9bc1a3f07c343e8634982a1e5420d7c9edfb3d6f..c9185e5f108ed45dc3daedd2f05e1f5558ce103b 100644 (file)
@@ -1,3 +1,8 @@
+2019-08-27  Uroš Bizjak  <ubizjak@gmail.com>
+
+       PR target/91528
+       * gcc.target/i386/pr91528.c: New test.
+
 2019-08-27  Martin Sebor  <msebor@redhat.com>
 
        PR c++/83431
diff --git a/gcc/testsuite/gcc.target/i386/pr91528.c b/gcc/testsuite/gcc.target/i386/pr91528.c
new file mode 100644 (file)
index 0000000..add2111
--- /dev/null
@@ -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;
+}