Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exception throwing Call instructions (invokes) should be terminator machine instructions. #28033

Open
MatzeB opened this issue May 6, 2016 · 4 comments
Labels
bugzilla Issues migrated from bugzilla llvm:codegen

Comments

@MatzeB
Copy link
Contributor

MatzeB commented May 6, 2016

Bugzilla Link 27659
Version trunk
OS All
CC @echristo,@MatzeB,@qcolombet,@sanjoy,@yuanfang-chen

Extended Description

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.
@MatzeB
Copy link
Contributor Author

MatzeB commented May 6, 2016

I should also mention that nobody seems to be actively working on it.

@echristo
Copy link
Contributor

echristo commented May 6, 2016

Thanks for filing it though :)

@MatzeB
Copy link
Contributor Author

MatzeB commented May 19, 2016

Just happened to notice that PHIEliminationUtils.cpp is another instance of code that would not be necessary if exception throwing calls would be terminators.

@MatzeB
Copy link
Contributor Author

MatzeB commented Nov 27, 2021

mentioned in issue llvm/llvm-bugzilla-archive#36073

@llvmbot llvmbot transferred this issue from llvm/llvm-bugzilla-archive Dec 10, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bugzilla Issues migrated from bugzilla llvm:codegen
Projects
None yet
Development

No branches or pull requests

2 participants