Skip to content

[Codegen, BasicBlockSections] Avoid cloning blocks which have their machine block address taken. #94296

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

Merged
merged 1 commit into from
Jun 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions llvm/lib/CodeGen/BasicBlockPathCloning.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,16 @@ bool IsValidCloning(const MachineFunction &MF,
return false;
}
}
if (PathBB->isMachineBlockAddressTaken()) {
// Avoid cloning blocks which have their address taken since we can't
// rewire branches to those blocks as easily (e.g., branches within
// inline assembly).
WithColor::warning()
<< "block #" << BBID
<< " has its machine block address taken in function "
<< MF.getName() << "\n";
return false;
}
}

if (I != ClonePath.size() - 1 && !PathBB->empty() &&
Expand Down
27 changes: 21 additions & 6 deletions llvm/test/CodeGen/X86/basic-block-sections-cloning-invalid.ll
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ declare void @effect(i32 zeroext)
; RUN: echo 'v1' > %t2
; RUN: echo 'f foo' >> %t2
; RUN: echo 'p 0 2 3' >> %t2
; RUN: echo 'p 0 1 3' >> %t2
; RUN: echo 'c 0 1.1 3.2 2.1 3.1 1' >> %t2
; RUN: echo 'p 0 1 2 3' >> %t2
; RUN: echo 'c 0 1.1 2.2 3.2 2.1 3.1 1' >> %t2
; RUN: llc < %s -mtriple=x86_64-pc-linux -O0 -function-sections -basic-block-sections=%t2 2> %t2.err | FileCheck %s --check-prefixes=PATH
; RUN: FileCheck %s --check-prefixes=WARN1 < %t2.err
; RUN: echo 'v1' > %t3
Expand All @@ -23,6 +23,14 @@ declare void @effect(i32 zeroext)
; RUN: echo 'c 0 100.1 1' >> %t3
; RUN: llc < %s -mtriple=x86_64-pc-linux -O0 -function-sections -basic-block-sections=%t3 2> %t3.err | FileCheck %s
; RUN: FileCheck %s --check-prefixes=WARN2 < %t3.err
; RUN: echo 'v1' > %t4
; RUN: echo 'f foo' >> %t4
; RUN: echo 'p 1 6' >> %t4
; RUN: echo 'c 0 1 6.1' >> %t4
; RUN: llc < %s -mtriple=x86_64-pc-linux -O0 -function-sections -basic-block-sections=%t4 2> %t4.err | FileCheck %s
; RUN: FileCheck %s --check-prefixes=WARN3 < %t4.err



define void @foo(i1 %a, i1 %b, i1 %c, i1 %d) {
b0:
Expand All @@ -31,23 +39,29 @@ b0:

b1: ; preds = %b0
call void @effect(i32 1)
br i1 %b, label %b2, label %b3
br i1 %b, label %b2, label %b6

b2: ; preds = %b1
call void @effect(i32 2)
br label %b3

b3: ; preds = %b0, %b1, %b2
b3: ; preds = %b0, %b2
call void @effect(i32 3)
br i1 %c, label %b4, label %b5

b4: ; preds = %b3
call void @effect(i32 4)
br i1 %d, label %b5, label %cold
callbr void asm sideeffect "je ${0:l}", "!i,~{dirflag},~{fpsr},~{flags}"()
to label %b5 [label %b6]

b5: ; preds = %b3, %b4
call void @effect(i32 5)
ret void

b6: ; preds = %b1, %b4
call void @effect(i32 6)
ret void

cold:
call void @effect(i32 6) ; preds = %b4
ret void
Expand All @@ -59,7 +73,7 @@ cold:

; CHECK: je .LBB0_3
; PATH: # %bb.7: # %b1
; PATH: # %bb.8: # %b3
; PATH: # %bb.8: # %b2
; PATH: jne .LBB0_4
; CHECK: # %bb.1: # %b1
; CHECK: jne foo.cold
Expand All @@ -69,4 +83,5 @@ cold:
;; Check the warnings
; WARN1: warning: block #2 is not a successor of block #0 in function foo
; WARN2: warning: no block with id 100 in function foo
; WARN3: warning: block #6 has its machine block address taken in function foo

Loading