[vta,trunk?] inlining gen_rtvec_v into gen_rtvec warns

Paolo Bonzini bonzini@gnu.org
Tue Aug 12 15:33:00 GMT 2008


Richard Guenther wrote:
> 2008/8/12 Alexandre Oliva <aoliva@redhat.com>:
>> Bootstrapping with -O3 on x86/64? causes gen_rtvec_v() to be inlined
>> into gen_rtvec().  This in turns causes the test for n == 0, already
>> performed in the caller, to be warned about, since it's always false.
>> I don't think it is appropriate to warn in this case, but this patches
>> permits bootstrap with -O3 to succeed.
>>
>> I'm installing it on the branch.  Should I install it on the trunk as
>> well?
> 
> Why not fix gen_rtvec instead to not allocate the temporary array
> on the stack?

You mean inlining gen_rtvec_v into gen_rtvec like this (totally untested)?

I could not resist the urge of replacing code dating to...

    471        rms /* gen_rtvec (n, [rt1, ..., rtn])

r471 | rms | 1992-03-14 06:04:21 +0100 (Sat, 14 Mar 1992) | 2 lines

Paolo


Index: emit-rtl.c
===================================================================
--- emit-rtl.c  (revision 134435)
+++ emit-rtl.c  (working copy)
@@ -793,35 +793,29 @@ gen_lowpart_SUBREG (enum machine_mode mo
                          subreg_lowpart_offset (mode, inmode));
  }


-/* gen_rtvec (n, [rt1, ..., rtn])
-**
-**         This routine creates an rtvec and stores within it the
-**     pointers to rtx's which are its arguments.
-*/
+/* Create an rtvec and stores within it the RTXen passed in the 
arguments.  */

-/*VARARGS1*/
  rtvec
  gen_rtvec (int n, ...)
  {
-  int i, save_n;
-  rtx *vector;
+  int i;
+  rtvec rt_val;
    va_list p;

    va_start (p, n);

+  /* Don't allocate an empty rtvec...  */
    if (n == 0)
-    return NULL_RTVEC;         /* Don't allocate an empty rtvec...     */
+    return NULL_RTVEC;

-  vector = alloca (n * sizeof (rtx));
+  rt_val = rtvec_alloc (n);

    for (i = 0; i < n; i++)
-    vector[i] = va_arg (p, rtx);
+    rt_val->elem[i] = va_arg (p, rtx);

-  /* The definition of VA_* in K&R C causes `n' to go out of scope.  */
-  save_n = n;
    va_end (p);

-  return gen_rtvec_v (save_n, vector);
+  return rt_val;
  }

  rtvec
@@ -830,10 +824,11 @@ gen_rtvec_v (int n, rtx *argp)
    int i;
    rtvec rt_val;

+  /* Don't allocate an empty rtvec...  */
    if (n == 0)
-    return NULL_RTVEC;         /* Don't allocate an empty rtvec...     */
+    return NULL_RTVEC;

-  rt_val = rtvec_alloc (n);    /* Allocate an rtvec...                 */
+  rt_val = rtvec_alloc (n);

    for (i = 0; i < n; i++)
      rt_val->elem[i] = *argp++;



More information about the Gcc-patches mailing list