[PATCH] D29102: [coroutines] Spill the result of the invoke instruction correctly

Gor Nishanov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 24 16:17:54 PST 2017


GorNishanov created this revision.
Herald added subscribers: EricWF, mehdi_amini.

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)


https://reviews.llvm.org/D29102

Files:
  lib/Transforms/Coroutines/CoroFrame.cpp
  test/Transforms/Coroutines/coro-frame.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29102.85650.patch
Type: text/x-patch
Size: 4233 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170125/004b3de1/attachment.bin>


More information about the llvm-commits mailing list