<div class="gmail_quote">On Thu, Jun 7, 2012 at 3:26 PM, Eli Friedman <span dir="ltr"><<a href="mailto:eli.friedman@gmail.com" target="_blank">eli.friedman@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Thu, Jun 7, 2012 at 3:20 PM, Chandler Carruth <<a href="mailto:chandlerc@google.com">chandlerc@google.com</a>> wrote:<br>
</div><div class="im">> On Thu, Jun 7, 2012 at 3:08 PM, David Sehr <<a href="mailto:sehr@google.com">sehr@google.com</a>> wrote:<br>
>><br>
>> Please disregard my last comment.  Implementing that will be a bit<br>
>> challenging, as stackAlign is a back end value rather than a clang<br>
>> TargetInfo value. Are there targets where stackAlign < SuitableAlign?<br>
><br>
><br>
> I suspect so, and that's worrisome...<br>
><br>
> I'm not intimately familiar with stack alignment and Joerg's concerns, but<br>
> it seems like a *more* aligned alloca would be fine, but a less aligned<br>
> alloca would be bad. Why is it a bad thing to increase the alignment to<br>
> SuitableAlign?<br>
<br>
</div>It would probably be surprising if __builtin_alloca triggered stack<br>
realignment...<br></blockquote><div><br></div><div>I see the surprise, but the alternative shouldn't be to return under-aligned pointers from __builtin_alloca. Trivial program demonstrating the behavior of GCC that is likely depended on:</div>
<div><br></div><div><pre class="sunburst" style="font-family:'Bitstream Vera Sans Mono',Monaco,Consolas,'Courier New',monospace;font-size:12px;line-height:15.600000381469727px;margin-top:0em"><font color="#330000"><span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby" style="padding-top:0.2em;padding-bottom:0.1em">%</span> cat alloca_test.c
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby" style="padding-top:0.2em;padding-bottom:0.1em;font-style:italic">#include <stdio.h></span>

int main() {<span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block" style="padding-top:0.2em;padding-bottom:0.1em;padding-top:0.2em;padding-bottom:0.1em"></span>
  char a;
  printf(<span class="string string_quoted string_quoted_double string_quoted_double_ruby" style="padding-top:0.2em;padding-bottom:0.1em">"%p<span class="constant constant_character constant_character_escape constant_character_escape_ruby" style="padding-top:0.2em;padding-bottom:0.1em">\n</span>"</span>, __builtin_alloca(<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">1</span>));
  int arr1[<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">16</span>];
  char b;
  printf(<span class="string string_quoted string_quoted_double string_quoted_double_ruby" style="padding-top:0.2em;padding-bottom:0.1em">"%p<span class="constant constant_character constant_character_escape constant_character_escape_ruby" style="padding-top:0.2em;padding-bottom:0.1em">\n</span>"</span>, __builtin_alloca(<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">2</span>));
  int arr2[<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">16</span>];
  char c;
  printf(<span class="string string_quoted string_quoted_double string_quoted_double_ruby" style="padding-top:0.2em;padding-bottom:0.1em">"%p<span class="constant constant_character constant_character_escape constant_character_escape_ruby" style="padding-top:0.2em;padding-bottom:0.1em">\n</span>"</span>, __builtin_alloca(<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">4</span>));
  int arr3[<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">16</span>];
  char d;
  printf(<span class="string string_quoted string_quoted_double string_quoted_double_ruby" style="padding-top:0.2em;padding-bottom:0.1em">"%p<span class="constant constant_character constant_character_escape constant_character_escape_ruby" style="padding-top:0.2em;padding-bottom:0.1em">\n</span>"</span>, __builtin_alloca(<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">8</span>));
  int arr4[<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">16</span>];
  char e;
  printf(<span class="string string_quoted string_quoted_double string_quoted_double_ruby" style="padding-top:0.2em;padding-bottom:0.1em">"%p<span class="constant constant_character constant_character_escape constant_character_escape_ruby" style="padding-top:0.2em;padding-bottom:0.1em">\n</span>"</span>, __builtin_alloca(<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">16</span>));
  int arr5[<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">16</span>];
  char f;
  printf(<span class="string string_quoted string_quoted_double string_quoted_double_ruby" style="padding-top:0.2em;padding-bottom:0.1em">"%p<span class="constant constant_character constant_character_escape constant_character_escape_ruby" style="padding-top:0.2em;padding-bottom:0.1em">\n</span>"</span>, __builtin_alloca(<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">32</span>));
}

<span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby" style="padding-top:0.2em;padding-bottom:0.1em">%</span> .<span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby" style="padding-top:0.2em;padding-bottom:0.1em">/</span>bin<span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby" style="padding-top:0.2em;padding-bottom:0.1em">/</span>clang <span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby" style="padding-top:0.2em;padding-bottom:0.1em">-</span>o alloca_test alloca_test.c <span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby" style="padding-top:0.2em;padding-bottom:0.1em">-</span>m32 <span class="keyword keyword_operator keyword_operator_logical keyword_operator_logical_ruby" style="padding-top:0.2em;padding-bottom:0.1em">&&</span> .<span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby" style="padding-top:0.2em;padding-bottom:0.1em">/</span>alloca_test
<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">0xffdfe522</span>
<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">0xffdfe520</span>
<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">0xffdfe51c</span>
<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">0xffdfe514</span>
<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">0xffdfe504</span>
<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">0xffdfe4e4</span>

<span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby" style="padding-top:0.2em;padding-bottom:0.1em">%</span> gcc <span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby" style="padding-top:0.2em;padding-bottom:0.1em">-</span>o alloca_test alloca_test.c <span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby" style="padding-top:0.2em;padding-bottom:0.1em">-</span>m32 <span class="keyword keyword_operator keyword_operator_logical keyword_operator_logical_ruby" style="padding-top:0.2em;padding-bottom:0.1em">&&</span> .<span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby" style="padding-top:0.2em;padding-bottom:0.1em">/</span>alloca_test
<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">0xffa89770</span>
<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">0xffa89750</span>
<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">0xffa89730</span>
<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">0xffa89710</span>
<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">0xffa896f0</span>
<span class="constant constant_numeric constant_numeric_ruby" style="padding-top:0.2em;padding-bottom:0.1em">0xffa896c0</span></font></pre></div><div><br></div><div>I think we either need to realign the stack or over-allocate the alloca and adjust the pointer to the desired alignment...</div>
</div>