llvm-project icon indicating copy to clipboard operation
llvm-project copied to clipboard

[JumpThreading] Thread over BB with only an unconditional branch

Open XChy opened this issue 1 year ago • 4 comments

Fixes #76609 This patch does:

  • relax the phis constraint in CanRedirectPredsOfEmptyBBToSucc
  • guarantee the BB has multiple different predecessors to redirect, so that we can handle the case without phis in BB. Without this change and phi constraint, we may redirect the CommonPred.

The motivation is consistent with JumpThreading. We always want the branch to jump more direct to the destination, without passing the middle block. In this way, we can expose more other optimization opportunities.

An obivous example proposed by @dtcxzyw is like:

define i32 @test(...) {
entry:
   br i1 %c, label %do.end, label %if.then

if.then:                                          ; preds = %entry
   %call2 = call i32 @dummy()
   %tobool3.not = icmp eq i32 %call2, 0
   br i1 %tobool3.not, label %do.end, label %return

do.end:                                           ; preds = %entry, %if.then
   br label %return

return:                                           ; preds = %if.then, %do.end
   %retval.0 = phi i32 [ 0, %do.end ], [ %call2, %if.then ]
   ret i32 %retval.0
}

entry can directly jump to return, without passing do.end, and then the if-else pattern can be simplified further:

define i32 @test(...) {
entry:
   br i1 %c, label %return, label %if.then

if.then:                                          ; preds = %entry
   %call2 = call i32 @dummy()
   br label %return

return:                                           ; preds = %if.then
   %retval.0 = phi i32 [ 0, %entry ], [ %call2, %if.then ]
   ret i32 %retval.0
}

XChy avatar Mar 22 '24 17:03 XChy