[PATCH] fix for PR16393: miscompile with struct byval

Jakob Stoklund Olesen jolesen at apple.com
Mon Jul 8 11:02:16 PDT 2013


On Jul 2, 2013, at 5:19 PM, Manman Ren <mren at apple.com> wrote:

> For a call site with struct byval, we will generate a sequence of instructions: STACKDOWN, STRUCT_BYVAL and STACKUP.
> STRUCT_BYVAL later on is expanded to a for loop. This caused issue in PEI when trying to eliminate frame indices.
> 
> BB1:
>  STACKDOWN
> BB2:
>  memcpy
> BB3:
>  STACKUP
> 
> PEI currently assumes SPAdj is 0 at the beginning of a basic block, but this is not true for BB2 or BB3. The proposed patch tries
> to fix the problem by inserting SET_SP_ADJ in BB2 and BB3:
> BB1:
>  STACKDOWN
> BB2:
>  SET_SP_ADJ
>  memcpy
> BB3:
>  SET_SP_ADJ
>  STACKUP
> 
> A target-independent opcode SET_SP_ADJ is introduced, and pseudo instruction STRUCT_BYVAL is modified to take one extra
> argument (the amount of SP Adjustment). When we are expanding STRUCT_BYVAL to a for loop, we add SET_SP_ADJ to BB2 and BB3.
> 
> PEI is also modified to handle SET_SP_ADJ. To make sure SET_SP_ADJ is always before any spill code that references frame indices,
> SET_SP_ADJ is treated as a label.
> 
> SET_SP_ADJ can be useful for other targets when STACKDOWN and STACKUP are not paired up in the same basic block.
> 
> Comments and other suggestions are welcome.

Hi Manman,

I am a bit worried that these solutions are too fragile. Every pass that changes the machine CFG needs to know how to preserve the SET_SP_ADJ instructions or MBB::StackAdjustment property. This is likely to break because SET_SP_ADJ is used so rarely.

How about teaching PEI that STACKDOWN/STACKUP pairs don’t have to be in the same basic block? PEI could verify that:

- On every path through the CFG, a STACKDOWN <n> is always followed by a STACKUP <n> instruction.
- STACKDOWN/STACKUP pairs are never nested.
- Stack adjustments are identical on all CFG edges to a merge point.

This could be implemented by having PEI traverse the CFG in a DFS order, keeping track of the stack state at the end of every basic block on the DFS stack.

Thanks,
/jakob





More information about the llvm-commits mailing list