On 27/10/13 17:04, Eric Botcazou wrote:
>> The PIC register setup code is emitted after NOTE_INSNS_FUNCTION_BEG,
>> because it uses the insert_insn_on_edge mechanism, and the corresponding
>> insertion in cfgexpand.c:gimple_expand_cfg takes care to insert the code
>> after the parm_birth_insn:
>> ...
>>            /* Avoid putting insns before parm_birth_insn.  */
>>            if (e->src == ENTRY_BLOCK_PTR
>>                && single_succ_p (ENTRY_BLOCK_PTR)
>>                && parm_birth_insn)
>>              {
>>                rtx insns = e->insns.r;
>>                e->insns.r = NULL_RTX;
>>                emit_insn_after_noloc (insns, parm_birth_insn, e->dest);
>>              }
>> ...
>> And in the case for this test-case, parm_birth_insn is the
>> NOTE_INSNS_FUNCTION_BEG.
> 
> So this means that parm_birth_insn can never be null, right?
> 

Yes, AFAICT parm_birth_insn is never NULL at this point.

>> 2013-10-13  Tom de Vries  <t...@codesourcery.com>
>>
>>      * cfgexpand.c (gimple_expand_cfg): Don't commit insertions after
>>      NOTE_INSN_FUNCTION_BEG.
>>
>>      * gcc.target/arm/require-pic-register-loc.c: New test.
> 
> OK if you also remove the test on parm_birth_insn.
> 

Updated patch, re-bootstrapped on x86_64 and committed to trunk.

Also applied to 4.7 and 4.8 branches, the same problem is present there.

Thanks,
- Tom

2013-10-28  Tom de Vries  <t...@codesourcery.com>

        * cfgexpand.c (gimple_expand_cfg): Remove test for parm_birth_insn.
        Don't commit insertions after NOTE_INSN_FUNCTION_BEG.

        * gcc.target/arm/require-pic-register-loc.c: New test.

diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index ba4c0e6..9705036 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -4789,14 +4789,18 @@ gimple_expand_cfg (void)
 	  if (e->insns.r)
 	    {
 	      rebuild_jump_labels_chain (e->insns.r);
-	      /* Avoid putting insns before parm_birth_insn.  */
+	      /* Put insns after parm birth, but before
+		 NOTE_INSNS_FUNCTION_BEG.  */
 	      if (e->src == ENTRY_BLOCK_PTR
-		  && single_succ_p (ENTRY_BLOCK_PTR)
-		  && parm_birth_insn)
+		  && single_succ_p (ENTRY_BLOCK_PTR))
 		{
 		  rtx insns = e->insns.r;
 		  e->insns.r = NULL_RTX;
-		  emit_insn_after_noloc (insns, parm_birth_insn, e->dest);
+		  if (NOTE_P (parm_birth_insn)
+		      && NOTE_KIND (parm_birth_insn) == NOTE_INSN_FUNCTION_BEG)
+		    emit_insn_before_noloc (insns, parm_birth_insn, e->dest);
+		  else
+		    emit_insn_after_noloc (insns, parm_birth_insn, e->dest);
 		}
 	      else
 		commit_one_edge_insertion (e);
 2013-10-27  Tobias Burnus  <bur...@net-b.de>
 
 	PR other/33426
diff --git a/gcc/testsuite/gcc.target/arm/require-pic-register-loc.c b/gcc/testsuite/gcc.target/arm/require-pic-register-loc.c
new file mode 100644
index 0000000..bd85e86
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/require-pic-register-loc.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-g -fPIC" } */
+
+void *v;
+void a (void *x) { }
+void b (void) { }
+                       /* line 7.  */
+int                    /* line 8.  */
+main (int argc)        /* line 9.  */
+{                      /* line 10.  */
+  if (argc == 12345)   /* line 11.  */
+    {
+      a (v);
+      return 1;
+    }
+  b ();
+
+  return 0;
+}
+
+/* { dg-final { scan-assembler-not "\.loc 1 7 0" } } */
+/* { dg-final { scan-assembler-not "\.loc 1 8 0" } } */
+/* { dg-final { scan-assembler-not "\.loc 1 9 0" } } */
+
+/* The loc at the start of the prologue.  */
+/* { dg-final { scan-assembler-times "\.loc 1 10 0" 1 } } */
+
+/* The loc at the end of the prologue, with the first user line.  */
+/* { dg-final { scan-assembler-times "\.loc 1 11 0" 1 } } */

Reply via email to