[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