Hi,

java bootstrap currently fails on s390 with:

/build3/gcc-head/libjava/classpath/javax/swing/plaf/basic/BasicLookAndFeel.java:1649:0:
 internal compiler error: in 
dwarf2out_var_location, at dwarf2out.c:21972
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

The problem is that a literal pool split happens just between a call
insn and the NOTE_INSN_CALL_ARG_LOCATION following it.  dwarf2out
currently expects the call insn to be found just one insn before.

The attached patch makes sure that we never split at such a location.

With the patch java bootstrap gets a bit further and then fails due to
delegitimize_address still returning UNSPECs :( but that's a different
story.

Committed to mainline.

Bye,

-Andreas-


2011-03-18  Andreas Krebbel  <andreas.kreb...@de.ibm.com>

        * config/s390/s390.c (s390_chunkify_start): Prevent literal pool
        splitting between a call and its corresponding CALL_ARG_LOCATION
        note.


Index: gcc/config/s390/s390.c
===================================================================
*** gcc/config/s390/s390.c.orig
--- gcc/config/s390/s390.c
*************** s390_chunkify_start (void)
*** 6651,6657 ****
          s390_add_execute (curr_pool, insn);
          s390_add_pool_insn (curr_pool, insn);
        }
!       else if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN)
        {
          rtx pool_ref = NULL_RTX;
          find_constant_pool_ref (PATTERN (insn), &pool_ref);
--- 6651,6657 ----
          s390_add_execute (curr_pool, insn);
          s390_add_pool_insn (curr_pool, insn);
        }
!       else if (GET_CODE (insn) == INSN || CALL_P (insn))
        {
          rtx pool_ref = NULL_RTX;
          find_constant_pool_ref (PATTERN (insn), &pool_ref);
*************** s390_chunkify_start (void)
*** 6676,6681 ****
--- 6676,6690 ----
                  pending_ltrel = pool_ref;
                }
            }
+         /* Make sure we do not split between a call and its
+            corresponding CALL_ARG_LOCATION note.  */
+         if (CALL_P (insn))
+           {
+             rtx next = NEXT_INSN (insn);
+             if (next && NOTE_P (next)
+                 && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
+               continue;
+           }
        }
  
        if (GET_CODE (insn) == JUMP_INSN || GET_CODE (insn) == CODE_LABEL)

Reply via email to