[llvm-bugs] [Bug 27659] New: Exception throwing Call instructions (invokes) should be terminator machine instructions.
via llvm-bugs
llvm-bugs at lists.llvm.org
Thu May 5 15:46:49 PDT 2016
https://llvm.org/bugs/show_bug.cgi?id=27659
Bug ID: 27659
Summary: Exception throwing Call instructions (invokes) should
be terminator machine instructions.
Product: libraries
Version: trunk
Hardware: PC
OS: All
Status: NEW
Severity: normal
Priority: P
Component: Common Code Generator Code
Assignee: unassignedbugs at nondot.org
Reporter: matze at braunis.de
CC: llvm-bugs at lists.llvm.org
Classification: Unclassified
This is a clone of rdar://10318439 (for apple people), originally by Jakob
Olesen. I am filing this llvm PR for reference:
When we lower LLVM IR invoke instructions to machine code, we should model the
control flow more accurately.
Currently, we do this:
BB#1:
ADJCALLSTACKDOWN
%R0 = COPY %vreg0
%R1 = COPY %vreg1
CALL foo, %R0, %R1, ...
%vreg3 = COPY %R0 # Return value
ADJCALLSTACKUP
BB#2: # preds = BB#1
foo
BB#3: EH_LANDING_PAD #preds = BB#1
%R0 = MAGIC
%vreg7 = COPY %R0 # exception pointer
bar
This is inaccurate because the instructions in BB#1 are not executed on the
exceptional edge to the landing pad BB#3. Currently, the register allocator has
to jump through hoops to avoid inserting split/spill code after the CALL.
I propose a call instruction that is also a terminator:
BB#1:
ADJCALLSTACKDOWN
%R0 = COPY %vreg0
%R1 = COPY %vreg1
INVOKE foo, %R0, %R1, ...
BB#2: # preds = BB#1
#Live-in: %R0
%vreg3 = COPY %R0 # Return value
ADJCALLSTACKUP
foo
BB#3: EH_LANDING_PAD #preds = BB#1
#Live-in: %R0
%vreg7 = COPY %R0 # exception pointer
bar
This models the control flow around DWARF exceptions more accurately, and it
handles the different 'return values' that show up in physical registers on the
two edges from the INVOKE. The register allocator can stick to the standard
rule of not inserting code after the first terminator.
Machine code verification also becomes easier. Currently we have a lot of
trouble verifying exception CFGs because anything goes. With an invoke
instruction, we could verify invariants like:
- A block terminated by an invoke has exactly one landing pad successor, and
one fall-through successor.
- A landing pad has only invoke predecessors.
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160505/b7649e81/attachment.html>
More information about the llvm-bugs
mailing list