[llvm] [BranchFolding] Fold away subsequent identical branches (PR #203110)

Aiden Grossman via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 14 22:51:24 PDT 2026


https://github.com/boomanaiden154 updated https://github.com/llvm/llvm-project/pull/203110

>From 4a9bf9bc01b93c4fbe8ae667d6a9557a22235dd3 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Wed, 10 Jun 2026 21:37:31 +0000
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20change?=
 =?UTF-8?q?s=20to=20main=20this=20commit=20is=20based=20on?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.7

[skip ci]
---
 .../X86/2009-11-17-UpdateTerminator.ll        |  38 ++++-
 .../CodeGen/X86/2011-09-14-valcoalesce.ll     | 138 +++++++++++++-----
 2 files changed, 137 insertions(+), 39 deletions(-)

diff --git a/llvm/test/CodeGen/X86/2009-11-17-UpdateTerminator.ll b/llvm/test/CodeGen/X86/2009-11-17-UpdateTerminator.ll
index 4027625e430c1..56b20a519c8e6 100644
--- a/llvm/test/CodeGen/X86/2009-11-17-UpdateTerminator.ll
+++ b/llvm/test/CodeGen/X86/2009-11-17-UpdateTerminator.ll
@@ -1,5 +1,6 @@
-; RUN: llc -O3 < %s
-; This test fails with:
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -O3 < %s | FileCheck %s
+; This test failed with:
 ; Assertion failed: (!B && "UpdateTerminators requires analyzable predecessors!"), function updateTerminator, MachineBasicBlock.cpp, line 255.
 
 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
@@ -16,6 +17,39 @@ target triple = "x86_64-apple-darwin10.2"
 %"struct.std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >" = type { %"struct.std::_Vector_base<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >" }
 
 define zeroext i8 @_ZN4llvm9InlineAsm14ConstraintInfo5ParseENS_9StringRefERSt6vectorIS1_SaIS1_EE(ptr nocapture %this, i64 %Str.0, i64 %Str.1, ptr nocapture %ConstraintsSoFar) nounwind ssp align 2 {
+; CHECK-LABEL: _ZN4llvm9InlineAsm14ConstraintInfo5ParseENS_9StringRefERSt6vectorIS1_SaIS1_EE:
+; CHECK:       ## %bb.0: ## %entry
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    testb %al, %al
+; CHECK-NEXT:    jne LBB0_8
+; CHECK-NEXT:  ## %bb.1: ## %bb27.outer.preheader
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    movb $1, %cl
+; CHECK-NEXT:    .p2align 4
+; CHECK-NEXT:  LBB0_4: ## %bb27.outer108
+; CHECK-NEXT:    ## =>This Inner Loop Header: Depth=1
+; CHECK-NEXT:    testb %al, %al
+; CHECK-NEXT:    je LBB0_5
+; CHECK-NEXT:  ## %bb.2: ## %bb10
+; CHECK-NEXT:    ## in Loop: Header=BB0_4 Depth=1
+; CHECK-NEXT:    jne LBB0_8
+; CHECK-NEXT:  ## %bb.3: ## %bb10
+; CHECK-NEXT:    ## in Loop: Header=BB0_4 Depth=1
+; CHECK-NEXT:    je LBB0_4
+; CHECK-NEXT:    jmp LBB0_8
+; CHECK-NEXT:  LBB0_5: ## %bb27.outer108
+; CHECK-NEXT:    ## in Loop: Header=BB0_4 Depth=1
+; CHECK-NEXT:    jne LBB0_8
+; CHECK-NEXT:  ## %bb.6: ## %bb27.outer108
+; CHECK-NEXT:    ## in Loop: Header=BB0_4 Depth=1
+; CHECK-NEXT:    jne LBB0_8
+; CHECK-NEXT:  ## %bb.7: ## %bb27.outer108
+; CHECK-NEXT:    ## in Loop: Header=BB0_4 Depth=1
+; CHECK-NEXT:    testb %cl, %cl
+; CHECK-NEXT:    jne LBB0_4
+; CHECK-NEXT:  LBB0_8: ## %bb14
+; CHECK-NEXT:    movl $1, %eax
+; CHECK-NEXT:    retq
 entry:
   br i1 undef, label %bb56, label %bb27.outer
 
diff --git a/llvm/test/CodeGen/X86/2011-09-14-valcoalesce.ll b/llvm/test/CodeGen/X86/2011-09-14-valcoalesce.ll
index a9c9047257149..3b3b4d72a0064 100644
--- a/llvm/test/CodeGen/X86/2011-09-14-valcoalesce.ll
+++ b/llvm/test/CodeGen/X86/2011-09-14-valcoalesce.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
 ; RUN: llc < %s -mtriple=i686-- -disable-block-placement | FileCheck %s
 ;
 ; Test RegistersDefinedFromSameValue. We have multiple copies of the same vreg:
@@ -19,48 +20,111 @@
 ; reusing the pre-addition register later, or the post-addition one. Currently,
 ; it does the latter, so we check:
 
-; CHECK: # %while.body85.i{{$}}
-; CHECK-NOT: # %
-; CHECK-NOT: add
-; CHECK: movl %[[POSTR:e[abcdxi]+]], %[[PRER:e[abcdxi]+]]
-; CHECK: addl %{{.*}}, %[[POSTR]]
-; CHECK: # %while.end.i
-; CHECK-NOT: movl %[[POSTR]]
-; CHECK: # %land.lhs.true.i
-; CHECK-NOT: movl %[[POSTR]]
-; CHECK: # %land.lhs.true103.i
-; CHECK-NOT: movl %[[POSTR]]
-; CHECK: # %if.then108.i
-; CHECK: movl %[[PRER]], %[[POSTR]]
-; CHECK: # %if.end117.i
-;   and use it for fprintf:
-; CHECK: movl %[[POSTR]], 12(%esp)
-
-
-; If it ever reverts to reusing the pre-addition register then we should
-; *probably* check this instead (it certainly worked last time):
-
-; CHECKALT: # %while.body85.i
-; CHECKALT-NOT: # %
-; CHECKALT-NOT: add
-; CHECKALT: movl %[[POSTR:e[abcdxi]+]], %[[PRER:e[abcdxi]+]]
-; CHECKALT: addl %{{.*}}, %[[POSTR]]
-; CHECKALT: # %while.end.i
-; CHECKALT: movl %[[POSTR]], %[[USER:e[abcdxi]+]]
-; CHECKALT: # %land.lhs.true.i
-; CHECKALT: movl %[[POSTR]], %[[USER]]
-; CHECKALT: # %land.lhs.true103.i
-; CHECKALT: movl %[[POSTR]], %[[USER]]
-; CHECKALT: # %if.then108.i
-; [[PRER] live out, so nothing on this path should define it.
-; CHECKALT-NOT: , %[[PRER]]
-; CHECKALT: # %if.end117.i
-
 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
 
 @.str3 = external unnamed_addr constant [59 x i8], align 1
 
 define void @BZ2_compressBlock() nounwind ssp {
+; CHECK-LABEL: BZ2_compressBlock:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    testb %al, %al
+; CHECK-NEXT:    jne .LBB0_24
+; CHECK-NEXT:  # %bb.1: # %if.then68
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    testb %al, %al
+; CHECK-NEXT:    jne .LBB0_3
+; CHECK-NEXT:  # %bb.2: # %for.cond.for.cond19.preheader_crit_edge.i
+; CHECK-NEXT:  .LBB0_3: # %for.cond19.preheader.i
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    testb %al, %al
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    testb %al, %al
+; CHECK-NEXT:    jne .LBB0_5
+; CHECK-NEXT:  # %bb.4: # %if.then35.i
+; CHECK-NEXT:  .LBB0_5: # %if.end36.i
+; CHECK-NEXT:    pushl %ebx
+; CHECK-NEXT:    pushl %esi
+; CHECK-NEXT:    subl $24, %esp
+; CHECK-NEXT:    xorl %ebx, %ebx
+; CHECK-NEXT:  .LBB0_6: # %while.body.i188
+; CHECK-NEXT:    # =>This Loop Header: Depth=1
+; CHECK-NEXT:    # Child Loop BB0_8 Depth 2
+; CHECK-NEXT:    xorl %ecx, %ecx
+; CHECK-NEXT:    movb $1, %dl
+; CHECK-NEXT:    testb %dl, %dl
+; CHECK-NEXT:    movl $0, %esi
+; CHECK-NEXT:    jne .LBB0_14
+; CHECK-NEXT:  # %bb.7: # %while.body85.i.preheader
+; CHECK-NEXT:    # in Loop: Header=BB0_6 Depth=1
+; CHECK-NEXT:    xorl %ecx, %ecx
+; CHECK-NEXT:    movl $1, %esi
+; CHECK-NEXT:  .LBB0_8: # %while.body85.i
+; CHECK-NEXT:    # Parent Loop BB0_6 Depth=1
+; CHECK-NEXT:    # => This Inner Loop Header: Depth=2
+; CHECK-NEXT:    movl %ecx, %edx
+; CHECK-NEXT:    movl (%eax), %ecx
+; CHECK-NEXT:    addl %edx, %ecx
+; CHECK-NEXT:    testb %bl, %bl
+; CHECK-NEXT:    jne .LBB0_10
+; CHECK-NEXT:  # %bb.9: # %while.body85.i
+; CHECK-NEXT:    # in Loop: Header=BB0_8 Depth=2
+; CHECK-NEXT:    jne .LBB0_8
+; CHECK-NEXT:  .LBB0_10: # %while.end.i
+; CHECK-NEXT:    # in Loop: Header=BB0_6 Depth=1
+; CHECK-NEXT:    testb %bl, %bl
+; CHECK-NEXT:    jne .LBB0_14
+; CHECK-NEXT:  # %bb.11: # %land.lhs.true.i
+; CHECK-NEXT:    # in Loop: Header=BB0_6 Depth=1
+; CHECK-NEXT:    jne .LBB0_14
+; CHECK-NEXT:  # %bb.12: # %land.lhs.true103.i
+; CHECK-NEXT:    # in Loop: Header=BB0_6 Depth=1
+; CHECK-NEXT:    jne .LBB0_14
+; CHECK-NEXT:  # %bb.13: # %if.then108.i
+; CHECK-NEXT:    # in Loop: Header=BB0_6 Depth=1
+; CHECK-NEXT:    xorl %esi, %esi
+; CHECK-NEXT:    movl %edx, %ecx
+; CHECK-NEXT:  .LBB0_14: # %if.end117.i
+; CHECK-NEXT:    # in Loop: Header=BB0_6 Depth=1
+; CHECK-NEXT:    testb %bl, %bl
+; CHECK-NEXT:    jne .LBB0_16
+; CHECK-NEXT:  # %bb.15: # %if.then122.i
+; CHECK-NEXT:    # in Loop: Header=BB0_6 Depth=1
+; CHECK-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
+; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%esp)
+; CHECK-NEXT:    movl %eax, {{[0-9]+}}(%esp)
+; CHECK-NEXT:    calll fprintf at PLT
+; CHECK-NEXT:  .LBB0_16: # %for.cond138.preheader.i
+; CHECK-NEXT:    # in Loop: Header=BB0_6 Depth=1
+; CHECK-NEXT:    testb %bl, %bl
+; CHECK-NEXT:    incl %esi
+; CHECK-NEXT:    testb %bl, %bl
+; CHECK-NEXT:    movl %esi, %eax
+; CHECK-NEXT:    jne .LBB0_6
+; CHECK-NEXT:  # %bb.17: # %for.cond182.preheader.i
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    testb %al, %al
+; CHECK-NEXT:    leal {{[0-9]+}}(%esp), %esp
+; CHECK-NEXT:    popl %esi
+; CHECK-NEXT:    popl %ebx
+; CHECK-NEXT:    jne .LBB0_18
+; CHECK-NEXT:    jmp .LBB0_19
+; CHECK-NEXT:  .LBB0_18: # %for.inc220.us.i
+; CHECK-NEXT:  .LBB0_19: # %while.body300.preheader.i
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    testb %al, %al
+; CHECK-NEXT:    jne .LBB0_21
+; CHECK-NEXT:  .LBB0_20: # %for.end335.i
+; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
+; CHECK-NEXT:    jmp .LBB0_20
+; CHECK-NEXT:  .LBB0_21: # %while.end2742.i
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    testb %al, %al
+; CHECK-NEXT:    jne .LBB0_23
+; CHECK-NEXT:  # %bb.22: # %if.then2748.i
+; CHECK-NEXT:  .LBB0_23: # %for.body2778.i
+; CHECK-NEXT:  .LBB0_24: # %if.end85
+; CHECK-NEXT:    retl
 entry:
   br i1 undef, label %if.then68, label %if.end85
 



More information about the llvm-commits mailing list