[PATCH] D138078: [SelectionDAGISel] split critical indirect edges from callbr w/ outputs

2022-11-28 Thread Nick Desaulniers via Phabricator via cfe-commits
nickdesaulniers planned changes to this revision.
nickdesaulniers added inline comments.



Comment at: llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp:482-483
+
+  for (Instruction  : instructions(F)) {
+if (auto *CBR = dyn_cast()) {
+  // If the CallBrInst has no output, then we do not need to split any

Rather than scan every `Instruction` looking for `CallBrInst`, it would be 
better to look at the terminator for each `BasicBlock`.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D138078

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D138078: [SelectionDAGISel] split critical indirect edges from callbr w/ outputs

2022-11-18 Thread Nick Desaulniers via Phabricator via cfe-commits
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
+;