[cfe-commits] r148243 - /cfe/trunk/lib/CodeGen/CGStmt.cpp

David Blaikie dblaikie at gmail.com
Mon Jan 16 18:08:50 PST 2012


On Mon, Jan 16, 2012 at 3:48 PM, Aaron Ballman <aaron at aaronballman.com> wrote:
> On Mon, Jan 16, 2012 at 1:12 PM, Eli Friedman <eli.friedman at gmail.com> wrote:
>> On Mon, Jan 16, 2012 at 10:26 AM, jahanian <fjahanian at apple.com> wrote:
>>>
>>> On Jan 16, 2012, at 10:20 AM, Eli Friedman wrote:
>>>
>>> On Mon, Jan 16, 2012 at 10:14 AM, Aaron Ballman <aaron at aaronballman.com>
>>> wrote:
>>>
>>> On Mon, Jan 16, 2012 at 11:56 AM, David Blaikie <dblaikie at gmail.com> wrote:
>>>
>>>
>>> I'll come up with some test cases to check this out tonight, and pass
>>>
>>> them along to verify I understand the concerns properly.
>>>
>>>
>>> Okay... I'm specifically concerned about the code generation for
>>> non-constant-folded-switch containing a constant-folded switch.
>>>
>>>
>>> Just committed a test case which seems to handle this correctly.
>>
>> Managed to come up with the testcase I was thinking of:
>>
>> #include <stdio.h>
>> int test(int val){
>>  switch (val) {
>>  case 4:
>>    do {
>>      switch (6) {
>>        case 6: do { case 5: printf("bad\n"); } while (0);
>>      };
>>    } while (0);
>>  }
>>  return 0;
>> }
>>
>> int main(void) {
>>  return test(5);
>> }
>
> I just had the chance to try out this test case, and you're right, it
> does produce the wrong code in this instance.  It emits the case 5
> against the outer switch (because SwitchInsn is non-null).
>
> I'll think about ways to handle this, but if anyone has suggestions
> they'd like to share, I'm all ears.

A couple of thoughts:

The moderate hack: Set SwitchInsn to null while we're evaluating the
statement inside a constant-folded switch.

The moderately less hacky, maybe: Allocate a constant, reserved
SwitchInsn somewhere (or indeed allocate anything in memory & just
reinterpret_cast it away) & set that as the switch whenever we're
evaluating a constant-folded switch.
Minor variation: use a PointerIntPair for SwitchInsn - with the int
being a bool set to 'true' if we're evaluating a constant folded
switch.




More information about the cfe-commits mailing list