On Wed, 27 Jul 2011, Michael Matz wrote: > Hi, > > On Wed, 27 Jul 2011, Richard Guenther wrote: > > > > > I don't think it is safe to try to get at the VLA type the way you do. > > > > > > I don't understand in what way it's not safe. Do you mean I don't manage > > > to find > > > the type always, or that I find the wrong type, or something else? > > > > I think you might get the wrong type, you also do not transform code > > like > > > > int *p = alloca(4); > > *p = 3; > > > > as there is no array type involved here. > > That's good, because you _can't_ transform that code into an array decl. > See: > > for (int i = 0; i < 100; i++) > p[i] = alloca(4); > assert (p[0] != p[1]); > > vs. > char vla_cst[4]; > for (int i = 0; i < 100; i++) > p[i] = &vla_cst; > assert (p[0] != p[1]);
Hm, indeed ;) At least not without more flow-sensitive analysis. > Tom: you can reliably detect if an alloca call is for a VLA by checking > CALL_ALLOCA_FOR_VAR_P (on a tree call expression, but only if it's a > builtin call) or gimple_call_alloca_for_var_p (on a gimple call stmt). Which actually hints that you should inline the folder into gimple_fold_call/builtin where you still have this flag properly preserved. Richard.