HomePhabricator

[WebAssembly] Fix fixEndsAtEndOfFunction for try-catch

Authored by aheejin on Sep 6 2020, 10:36 AM.

Description

[WebAssembly] Fix fixEndsAtEndOfFunction for try-catch

When the function return type is non-void and end instructions are at
the very end of a function, CFGStackify's fixEndsAtEndOfFunction
function fixes the corresponding block/loop/try's type to match the
function's return type. This is applied to consecutive end markers at
the end of a function. For example, when the function return type is
i32,

block i32    ;; return type is fixed to i32
  ...
  loop i32   ;; return type is fixed to i32
    ...
  end_loop
end_block
end_function

But try-catch is a little different, because it consists of two parts:
a try part and a catch part, and both parts' return type should satisfy
the function's return type. Which means,

try i32      ;; return type is fixed to i32
  ...
  block i32  ;; this should be changed i32 too!
    ...
  end_block
catch
  ...
end_try
end_function

As you can see in this example, it is not sufficient to only end
instructions at the end of a function; in case of try, we should
check instructions before catches, in case their corresponding try's
type has been fixed.

This changes fixEndsAtEndOfFunction's algorithm to use a worklist
that contains a reverse iterator, each of which is a starting point for
a new backward end instruction search.

Fixes https://bugs.llvm.org/show_bug.cgi?id=47413.

Reviewed By: dschuff, tlively

Differential Revision: https://reviews.llvm.org/D87207

Details

Committed
aheejinSep 8 2020, 9:27 AM
Reviewer
dschuff
Differential Revision
D87207: [WebAssembly] Fix fixEndsAtEndOfFunction for try-catch
Parents
rG3c83b967cf22: LiveRegUnits.h - reduce MachineRegisterInfo.h include. NFC.
Branches
Unknown
Tags
Unknown