nickdesaulniers updated this revision to Diff 476530.
nickdesaulniers retitled this revision from "[CodeGenPrepare] split critical
indirect edges from callbr w/ outputs" to "[SelectionDAGISel] split critical
indirect edges from callbr w/ outputs".
nickdesaulniers edited the summary of this revision.
nickdesaulniers added a comment.
- move critical edge splitting from CodeGenPrepare to SelectionDAGISel
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D138078/new/
https://reviews.llvm.org/D138078
Files:
clang/docs/ReleaseNotes.rst
llvm/docs/LangRef.rst
llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h
llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp
llvm/test/CodeGen/AArch64/callbr-split-critedge.ll
llvm/test/CodeGen/X86/callbr-asm-outputs.ll
Index: llvm/test/CodeGen/X86/callbr-asm-outputs.ll
===
--- llvm/test/CodeGen/X86/callbr-asm-outputs.ll
+++ llvm/test/CodeGen/X86/callbr-asm-outputs.ll
@@ -38,36 +38,46 @@
; CHECK-NEXT:pushl %esi
; CHECK-NEXT:movl {{[0-9]+}}(%esp), %edi
; CHECK-NEXT:movl {{[0-9]+}}(%esp), %esi
-; CHECK-NEXT:movl $-1, %eax
; CHECK-NEXT:cmpl %edi, %esi
-; CHECK-NEXT:jge .LBB1_2
+; CHECK-NEXT:jge .LBB1_3
; CHECK-NEXT: # %bb.1: # %if.then
; CHECK-NEXT:#APP
; CHECK-NEXT:testl %esi, %esi
; CHECK-NEXT:testl %edi, %esi
-; CHECK-NEXT:jne .LBB1_4
+; CHECK-NEXT:jne .LBB1_2
; CHECK-NEXT:#NO_APP
-; CHECK-NEXT:jmp .LBB1_3
-; CHECK-NEXT: .LBB1_2: # %if.else
+; CHECK-NEXT:jmp .LBB1_4
+; CHECK-NEXT: .LBB1_2: # Block address taken
+; CHECK-NEXT:# %if.then.label_true_crit_edge
+; CHECK-NEXT:# Label of block must be emitted
+; CHECK-NEXT:jmp .LBB1_8
+; CHECK-NEXT: .LBB1_3: # %if.else
; CHECK-NEXT:#APP
; CHECK-NEXT:testl %esi, %edi
; CHECK-NEXT:testl %esi, %edi
-; CHECK-NEXT:jne .LBB1_5
+; CHECK-NEXT:jne .LBB1_9
; CHECK-NEXT:#NO_APP
-; CHECK-NEXT: .LBB1_3:
+; CHECK-NEXT: .LBB1_4:
; CHECK-NEXT:movl %esi, %eax
; CHECK-NEXT:addl %edi, %eax
-; CHECK-NEXT: .LBB1_5: # Block address taken
-; CHECK-NEXT:# %return
-; CHECK-NEXT:# Label of block must be emitted
+; CHECK-NEXT: .LBB1_5: # %return
; CHECK-NEXT:popl %esi
; CHECK-NEXT:popl %edi
; CHECK-NEXT:retl
-; CHECK-NEXT: .LBB1_4: # Block address taken
-; CHECK-NEXT:# %label_true
+; CHECK-NEXT: .LBB1_7: # Block address taken
+; CHECK-NEXT:# %if.else.label_true_crit_edge
; CHECK-NEXT:# Label of block must be emitted
+; CHECK-NEXT: .LBB1_8: # %label_true
; CHECK-NEXT:movl $-2, %eax
; CHECK-NEXT:jmp .LBB1_5
+; CHECK-NEXT: .LBB1_9: # Block address taken
+; CHECK-NEXT:# %if.else.return_crit_edge
+; CHECK-NEXT:# Label of block must be emitted
+; CHECK-NEXT: .LBB1_6: # Block address taken
+; CHECK-NEXT:# %if.then.return_crit_edge
+; CHECK-NEXT:# Label of block must be emitted
+; CHECK-NEXT:movl $-1, %eax
+; CHECK-NEXT:jmp .LBB1_5
entry:
%cmp = icmp slt i32 %out1, %out2
br i1 %cmp, label %if.then, label %if.else
@@ -122,7 +132,10 @@
; CHECK-NEXT:popl %edi
; CHECK-NEXT:retl
; CHECK-NEXT: .LBB2_6: # Block address taken
-; CHECK-NEXT:# %indirect
+; CHECK-NEXT:# %true.indirect_crit_edge
+; CHECK-NEXT:# Label of block must be emitted
+; CHECK-NEXT: .LBB2_7: # Block address taken
+; CHECK-NEXT:# %false.indirect_crit_edge
; CHECK-NEXT:# Label of block must be emitted
; CHECK-NEXT:movl $42, %eax
; CHECK-NEXT:jmp .LBB2_5
@@ -148,31 +161,37 @@
define i32 @test4(i32 %out1, i32 %out2) {
; CHECK-LABEL: test4:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT:movl $-1, %eax
-; CHECK-NEXT:movl {{[0-9]+}}(%esp), %ecx
+; CHECK-NEXT:movl {{[0-9]+}}(%esp), %eax
; CHECK-NEXT:#APP
-; CHECK-NEXT:testl %ecx, %ecx
-; CHECK-NEXT:testl %edx, %ecx
+; CHECK-NEXT:testl %eax, %eax
+; CHECK-NEXT:testl %ecx, %eax
; CHECK-NEXT:jne .LBB3_3
; CHECK-NEXT:#NO_APP
; CHECK-NEXT: # %bb.1: # %asm.fallthrough
; CHECK-NEXT:#APP
-; CHECK-NEXT:testl %ecx, %edx
-; CHECK-NEXT:testl %ecx, %edx
-; CHECK-NEXT:jne .LBB3_4
+; CHECK-NEXT:testl %eax, %ecx
+; CHECK-NEXT:testl %eax, %ecx
+; CHECK-NEXT:jne .LBB3_5
; CHECK-NEXT:#NO_APP
; CHECK-NEXT: # %bb.2: # %asm.fallthrough2
-; CHECK-NEXT:addl %edx, %ecx
-; CHECK-NEXT:movl %ecx, %eax
+; CHECK-NEXT:addl %ecx, %eax
+; CHECK-NEXT:retl
; CHECK-NEXT: .LBB3_4: # Block address taken
-; CHECK-NEXT:# %return
+; CHECK-NEXT:# %entry.return_crit_edge
+; CHECK-NEXT:# Label of block must be emitted
+; CHECK-NEXT: .LBB3_5: # Block address taken
+; CHECK-NEXT:# %asm.fallthrough.return_crit_edge
; CHECK-NEXT:# Label of block must be emitted
+; CHECK-NEXT:movl $-1, %eax
; CHECK-NEXT:retl
+; CHECK-NEXT: .LBB3_6: # Block address taken
+;