[ARM][PR target/84826] Fix ICE in extract_insn, at recog.c:2304 on
authorSudakshina Das <sudi.das@arm.com>
Thu, 22 Mar 2018 17:24:41 +0000 (17:24 +0000)
committerSudakshina Das <sudi@gcc.gnu.org>
Thu, 22 Mar 2018 17:24:41 +0000 (17:24 +0000)
arm-linux-gnueabi

The ICE in the bug report was happening because the macro
USE_RETURN_INSN (FALSE) was returning different values at different points
in the compilation. This was internally occurring because the function
arm_compute_static_chain_stack_bytes () which was dependent on
arm_r3_live_at_start_p () was giving a different value after the cond_exec
instructions were created in ce3 causing the liveness of r3 to escape up
to the start block.

The function arm_compute_static_chain_stack_bytes () should really only
compute the value once duringepilogue/prologue stage. This pass introduces
a new member 'static_chain_stack_bytes' to the target definition of the
struct machine_function which gets calculated in expand_prologue and is the
value that is returned by arm_compute_static_chain_stack_bytes () beyond that.

ChangeLog entries:

*** gcc/ChangeLog ***

2018-03-22  Sudakshina Das  <sudi.das@arm.com>

PR target/84826
* config/arm/arm.h (machine_function): Add static_chain_stack_bytes.
* config/arm/arm.c (arm_compute_static_chain_stack_bytes): Avoid
re-computing once computed.
(arm_expand_prologue): Compute machine->static_chain_stack_bytes.
(arm_init_machine_status): Initialize
machine->static_chain_stack_bytes.

*** gcc/testsuite/ChangeLog ***

2018-03-22  Sudakshina Das  <sudi.das@arm.com>

PR target/84826
* gcc.target/arm/pr84826.c: New test.

From-SVN: r258777

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/config/arm/arm.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/pr84826.c [new file with mode: 0644]

index 01f109a6f5dc845b95bf75723649d5f4f65151be..57bb60a9043f6e33a30b4dc04e2234cde1cacea4 100644 (file)
@@ -1,3 +1,13 @@
+2018-03-22  Sudakshina Das  <sudi.das@arm.com>
+
+       PR target/84826
+       * config/arm/arm.h (machine_function): Add static_chain_stack_bytes.
+       * config/arm/arm.c (arm_compute_static_chain_stack_bytes): Avoid
+       re-computing once computed.
+       (arm_expand_prologue): Compute machine->static_chain_stack_bytes.
+       (arm_init_machine_status): Initialize
+       machine->static_chain_stack_bytes.
+
 2018-03-22  Kelvin Nilsen  <kelvin@gcc.gnu.org>
 
        PR target/84760
index cb6ab8191b3d7ce429629b80439e8020436045e4..b98195603e0b05fa9affc0f2e64d60c5bb9f285e 100644 (file)
@@ -19392,6 +19392,11 @@ arm_r3_live_at_start_p (void)
 static int
 arm_compute_static_chain_stack_bytes (void)
 {
+  /* Once the value is updated from the init value of -1, do not
+     re-compute.  */
+  if (cfun->machine->static_chain_stack_bytes != -1)
+    return cfun->machine->static_chain_stack_bytes;
+
   /* See the defining assertion in arm_expand_prologue.  */
   if (IS_NESTED (arm_current_func_type ())
       && ((TARGET_APCS_FRAME && frame_pointer_needed && TARGET_ARM)
@@ -21699,6 +21704,11 @@ arm_expand_prologue (void)
       emit_insn (gen_movsi (stack_pointer_rtx, r1));
     }
 
+  /* Let's compute the static_chain_stack_bytes required and store it.  Right
+     now the value must be -1 as stored by arm_init_machine_status ().  */
+  cfun->machine->static_chain_stack_bytes
+    = arm_compute_static_chain_stack_bytes ();
+
   /* The static chain register is the same as the IP register.  If it is
      clobbered when creating the frame, we need to save and restore it.  */
   clobber_ip = IS_NESTED (func_type)
@@ -24875,6 +24885,7 @@ arm_init_machine_status (void)
 #if ARM_FT_UNKNOWN != 0
   machine->func_type = ARM_FT_UNKNOWN;
 #endif
+  machine->static_chain_stack_bytes = -1;
   return machine;
 }
 
index bbf3937a592a14d35adbf3afcff0b6829cd5c584..2809112f68dd83eeb5b4764e82d552d8b8be3e4e 100644 (file)
@@ -1384,6 +1384,9 @@ typedef struct GTY(()) machine_function
   machine_mode thumb1_cc_mode;
   /* Set to 1 after arm_reorg has started.  */
   int after_arm_reorg;
+  /* The number of bytes used to store the static chain register on the
+     stack, above the stack frame.  */
+  int static_chain_stack_bytes;
 }
 machine_function;
 #endif
index 20336c0a71be990dab1d8ed3e57ebd8c6b010e84..d1ddb79a8090bb917bab3ac7fa2e842f0e7d7917 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-22  Sudakshina Das  <sudi.das@arm.com>
+
+       PR target/84826
+       * gcc.target/arm/pr84826.c: New test.
+
 2018-03-22  Christophe Lyon  <christophe.lyon@linaro.org>
 
        * gcc.target/arm/addr-modes-float.c: Move dg-do before
diff --git a/gcc/testsuite/gcc.target/arm/pr84826.c b/gcc/testsuite/gcc.target/arm/pr84826.c
new file mode 100644 (file)
index 0000000..c61c548
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-Ofast -fstack-clash-protection" } */
+
+void d (void *);
+
+void a ()
+{
+  int b;
+  void bar (int c)
+  {
+    if (__builtin_expect (c, 0))
+      ++b;
+  }
+  d (bar);
+}