This is an archive of the discontinued LLVM Phabricator instance.

[coroutines] Spill the result of the invoke instruction correctly
ClosedPublic

Authored by GorNishanov on Jan 24 2017, 4:17 PM.

Details

Summary

When we decide that the result of the invoke instruction need to be spilled, we need to insert the spill into a block that is on the normal edge coming out of the invoke instruction. (Prior to this change the code would insert the spill immediately after the invoke instruction, which breaks the IR, since invoke is a terminator instruction).

In the following example, we will split the edge going into %cont and insert the spill there.

%r = invoke double @print(double 0.0) to label %cont unwind label %pad

cont:
  %0 = call i8 @llvm.coro.suspend(token none, i1 false)
  switch i8 %0, label %suspend [i8 0, label %resume
                                i8 1, label %cleanup]
resume:
  call double @print(double %r)

Diff Detail

Repository
rL LLVM

Event Timeline

GorNishanov created this revision.Jan 24 2017, 4:17 PM
majnemer accepted this revision.Jan 24 2017, 4:53 PM

LGTM

lib/Transforms/Coroutines/CoroFrame.cpp
427 ↗(On Diff #85650)

Maybe "For arguments,"

428 ↗(On Diff #85650)

bitcase -> bitcast

431–432 ↗(On Diff #85650)

Make this one line.

437–438 ↗(On Diff #85650)

Ditto.

439 ↗(On Diff #85650)

We should probably assert that the instruction is not a terminator. Otherwise, this code would also be wrong. Today there are no such instructions but who knows what tomorrow will bring :)

This revision is now accepted and ready to land.Jan 24 2017, 4:53 PM

Thank you for the review! Feedback incorporated. Preparing to land.

GorNishanov marked 5 inline comments as done.Jan 24 2017, 5:31 PM
This revision was automatically updated to reflect the committed changes.