On Fri, May 06, 2016 at 10:44:15AM +0100, Dominik Vogt wrote: > > diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c > > index 21f21c9..4d48afd 100644 > > --- a/gcc/cfgexpand.c > > +++ b/gcc/cfgexpand.c > ... > > @@ -1099,8 +1101,10 @@ expand_stack_vars (bool (*pred) (size_t), struct > > stack_vars_data *data) > > > > /* If there were any, allocate space. */ > > if (large_size > 0) > > - large_base = allocate_dynamic_stack_space (GEN_INT (large_size), 0, > > - large_align, true); > > + { > > + large_allocsize = GEN_INT (large_size); > > + get_dynamic_stack_size (&large_allocsize, 0, large_align, NULL); > ... > > See below. > > > @@ -1186,6 +1190,18 @@ expand_stack_vars (bool (*pred) (size_t), struct > > stack_vars_data *data) > > /* Large alignment is only processed in the last pass. */ > > if (pred) > > continue; > > + > > + if (large_allocsize && ! large_allocation_done) > > + { > > + /* Allocate space the virtual stack vars area in the prologue. > > + */ > > + HOST_WIDE_INT loffset; > > + > > + loffset = alloc_stack_frame_space (INTVAL (large_allocsize), > > + PREFERRED_STACK_BOUNDARY); > > 1) Should this use PREFERRED_STACK_BOUNDARY or just STACK_BOUNDARY? > 2) Is this the right place for rounding up, or should > it be done above, maybe in get_dynamic_stack_size? > > Not sure whether this is the right > > > + large_base = get_dynamic_stack_base (loffset, large_align); > > + large_allocation_done = true; > > + } > > gcc_assert (large_base != NULL); > > > > large_alloc += alignb - 1; > > > diff --git a/gcc/testsuite/gcc.dg/stack-layout-dynamic-1.c > > b/gcc/testsuite/gcc.dg/stack-layout-dynamic-1.c > > new file mode 100644 > > index 0000000..e06a16c > > --- /dev/null > > +++ b/gcc/testsuite/gcc.dg/stack-layout-dynamic-1.c > > @@ -0,0 +1,14 @@ > > +/* Verify that run time aligned local variables are aloocated in the > > prologue > > + in one pass together with normal local variables. */ > > +/* { dg-do compile } */ > > +/* { dg-options "-O0" } */ > > + > > +extern void bar (void *, void *, void *); > > +void foo (void) > > +{ > > + int i; > > + __attribute__ ((aligned(65536))) char runtime_aligned_1[512]; > > + __attribute__ ((aligned(32768))) char runtime_aligned_2[1024]; > > + bar (&i, &runtime_aligned_1, &runtime_aligned_2); > > +} > > +/* { dg-final { scan-assembler-times "cfi_def_cfa_offset" 2 { target { > > s390*-*-* } } } } */ > > I've no idea how to test this on other targets, or how to express > the test in a target independent way. The scan-assembler-times > does not work on x86_64. > > Ciao > > Dominik ^_^ ^_^ > > -- > > Dominik Vogt > IBM Germany > >
Ciao Dominik ^_^ ^_^ -- Dominik Vogt IBM Germany