This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: gimple vs volatiles vs enumerations
On 9/29/05, Andrew Pinski <pinskia@physics.uc.edu> wrote:
>
> On Sep 26, 2005, at 7:17 PM, David Edelsohn wrote:
>
> > * gimplify.c (create_tmp_from_val): Use TYPE_MAIN_VARIANT.
> >
> > The gimplify.c part of the original patch causes a new testsuite
> > regression gcc.c-torture/execute/20000519-1.c
> >
> > http://gcc.gnu.org/ml/gcc-regression/2005-09/msg00040.html
> >
> > Specifically,
>
> From the looking at the tree dumps, this looks very much a
> tree-stdargs.c bug. It is not tracking the use of variable
> correctly at all.
>
> What we have in the dump:
> __builtin_va_start (&ap, 0, 0);
> ap.2_3 = ap;
>
> # ap_1 = PHI <ap.2_3(0), ap_8(1)>;
> <L1>:;
> ap_8 = ap_1 + 4B;
> ap.1_9 = (int *) ap_1;
> b_10 = *ap.1_9;
> if (b_10 > 10) goto <L1>; else goto <L2>;
>
> <L2>:;
> D.1287_11 = a_4 + b_10;
> return D.1287_11;
>
>
> Notice how we change from ap.2_3 to ap_1 in the PHI.
> Here is a valid C testcase that fails even with RTH's patch reverted:
> #include <stdarg.h>
>
> int
> foo (int a, ...)
> {
> va_list ap;
> va_list ap1;
> va_list ap2;
> va_list ap3;
> va_list ap4;
>
> va_start (ap, a);
> int b;
> ap1 = ap;
> ap2 = ap1;
I believe you have to use va_copy for these and friends.
Richard.
> do {
> ap1 = ap2;
> b = va_arg (ap1, int);
> ap2 = ap1;
> } while (b > 10);
>
> return a + b;
>
> }
>
> int
> main ()
> {
> if (foo (1, 2, 3) != 3)
> abort ();
> return 0;
> }
>
>
>
> -- Pinski
>
>