re PR target/61853 (ICE: SIGSEGV in store_field)
authorJohn David Anglin <danglin@gcc.gnu.org>
Tue, 16 Sep 2014 23:39:28 +0000 (23:39 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Tue, 16 Sep 2014 23:39:28 +0000 (23:39 +0000)
PR target/61853
* config/pa/pa.c (pa_function_value): Directly handle aggregates
that fit exactly in a word or double word.

From-SVN: r215309

gcc/ChangeLog
gcc/config/pa/pa.c

index d446d2cd2deae5c032a2596e0cad9a570ded85c3..da2bcee6e642eac58dee851563cebea8fdc02668 100644 (file)
@@ -1,3 +1,9 @@
+2014-09-16  John David Anglin  <danglin@gcc.gnu.org>
+
+       PR target/61853
+       * config/pa/pa.c (pa_function_value): Directly handle aggregates
+       that fit exactly in a word or double word.
+
 2014-09-16  Ilya Tocar  <ilya.tocar@intel.com>
 
        * config/i386/driver-i386.c (host_detect_local_cpu): Detect lack of
index 6db4f3dbd80bb2753f4a96d217adb5d2200eac55..20f2ef662d380c0d7bebf043545c8b36dcb2805e 100644 (file)
@@ -9298,6 +9298,12 @@ pa_function_value (const_tree valtype,
       || TREE_CODE (valtype) == COMPLEX_TYPE
       || TREE_CODE (valtype) == VECTOR_TYPE)
     {
+      HOST_WIDE_INT valsize = int_size_in_bytes (valtype);
+
+      /* Handle aggregates that fit exactly in a word or double word.  */
+      if ((valsize & (UNITS_PER_WORD - 1)) == 0)
+       return gen_rtx_REG (TYPE_MODE (valtype), 28);
+
       if (TARGET_64BIT)
        {
           /* Aggregates with a size less than or equal to 128 bits are
@@ -9306,7 +9312,7 @@ pa_function_value (const_tree valtype,
             memory.  */
          rtx loc[2];
          int i, offset = 0;
-         int ub = int_size_in_bytes (valtype) <= UNITS_PER_WORD ? 1 : 2;
+         int ub = valsize <= UNITS_PER_WORD ? 1 : 2;
 
          for (i = 0; i < ub; i++)
            {
@@ -9318,7 +9324,7 @@ pa_function_value (const_tree valtype,
 
          return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (ub, loc));
        }
-      else if (int_size_in_bytes (valtype) > UNITS_PER_WORD)
+      else if (valsize > UNITS_PER_WORD)
        {
          /* Aggregates 5 to 8 bytes in size are returned in general
             registers r28-r29 in the same manner as other non