[PATCH] D104870: [SimplifyCFG] Tail-merging all blocks with `unreachable` terminator

Roman Lebedev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 24 13:29:05 PDT 2021


lebedev.ri marked an inline comment as done.
lebedev.ri added inline comments.


================
Comment at: llvm/test/Transforms/SimplifyCFG/tail-merge-noreturn.ll:129-130
 ; CHECK:       a2:
 ; CHECK-NEXT:    call void @assert_fail_1_alt(i32 0)
 ; CHECK-NEXT:    unreachable
 ;
----------------
rnk wrote:
> I expected your code to fire on this test case. Can you explain why this example isn't getting tail merged?
> 
> Consider this example: https://gcc.godbolt.org/z/ox16a9P1z
> ```
> [[noreturn]] void abort1();
> [[noreturn]] void abort2();
> [[noreturn]] void abort3();
> bool cond();
> void doAsserts() {
>     if (cond()) abort1();
>     if (cond()) abort2();
>     if (cond()) abort3();
> }
> ```
> 
> I think it is more canonical to leave these unreachable terminators in place after the calls to noreturn functions, rather than merging the unreachables together.
> 
> I just want to make sure your transform isn't firing, creating BBs, and then a later part of simplifycfg rolls the unreachables back up into place after the calls.
> I expected your code to fire on this test case. Can you explain why this example isn't getting tail merged?

It fired, we didn't sink anything, and `SimplifyCFGOpt::simplifyUnreachable()` decided to undo it.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D104870/new/

https://reviews.llvm.org/D104870



More information about the llvm-commits mailing list