From b8e23d1a5e6f7e931fb3348e16edfe51bac26325 Mon Sep 17 00:00:00 2001 From: XChy Date: Tue, 2 Sep 2025 02:10:39 +0800 Subject: [PATCH 1/2] [llvm-reduce] Treat CallBrInst as Branch --- .../tools/llvm-reduce/reduce-bb-callbr.ll | 22 +++++++++++++++++++ .../llvm-reduce/deltas/ReduceBasicBlocks.cpp | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 llvm/test/tools/llvm-reduce/reduce-bb-callbr.ll diff --git a/llvm/test/tools/llvm-reduce/reduce-bb-callbr.ll b/llvm/test/tools/llvm-reduce/reduce-bb-callbr.ll new file mode 100644 index 0000000000000..06df1407102f0 --- /dev/null +++ b/llvm/test/tools/llvm-reduce/reduce-bb-callbr.ll @@ -0,0 +1,22 @@ +; RUN: llvm-reduce %s -o %t --abort-on-invalid-reduction --delta-passes=basic-blocks --test FileCheck --test-arg %s --test-arg --match-full-lines --test-arg --check-prefix=INTERESTING --test-arg --input-file +; RUN: FileCheck %s --input-file %t --check-prefixes=INTERESTING + +; CHECK-INTERESTINGNESS: store i32 0, +; CHECK-INTERESTINGNESS: store i32 1, + +define i32 @e(ptr %p, i1 %cond) { +entry: + callbr void asm sideeffect "", "!i,~{dirflag},~{fpsr},~{flags}"() + to label %for.cond [label %preheader] + +for.cond: + store i32 0, ptr %p + br label %preheader + +preheader: + store i32 1, %p + br i1 %%cond, label %for.cond, label %g + +returnbb: + ret i32 0 +} diff --git a/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp b/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp index 3c00f9eb9a1e8..34c2b625ab86c 100644 --- a/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp +++ b/llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp @@ -49,7 +49,7 @@ static void replaceBranchTerminator(BasicBlock &BB, if (isa(Term)) return; - bool IsBranch = isa(Term); + bool IsBranch = isa(Term) || isa(Term); if (InvokeInst *Invoke = dyn_cast(Term)) { BasicBlock *UnwindDest = Invoke->getUnwindDest(); BasicBlock::iterator LP = UnwindDest->getFirstNonPHIIt(); From 8462605bf7d10193f58235c1689b4014efaf84a2 Mon Sep 17 00:00:00 2001 From: XChy Date: Tue, 2 Sep 2025 12:49:10 +0800 Subject: [PATCH 2/2] update testcase --- .../tools/llvm-reduce/reduce-bb-callbr.ll | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/llvm/test/tools/llvm-reduce/reduce-bb-callbr.ll b/llvm/test/tools/llvm-reduce/reduce-bb-callbr.ll index 06df1407102f0..f0f6646a20719 100644 --- a/llvm/test/tools/llvm-reduce/reduce-bb-callbr.ll +++ b/llvm/test/tools/llvm-reduce/reduce-bb-callbr.ll @@ -1,22 +1,44 @@ -; RUN: llvm-reduce %s -o %t --abort-on-invalid-reduction --delta-passes=basic-blocks --test FileCheck --test-arg %s --test-arg --match-full-lines --test-arg --check-prefix=INTERESTING --test-arg --input-file -; RUN: FileCheck %s --input-file %t --check-prefixes=INTERESTING +; RUN: llvm-reduce %s -o %t --abort-on-invalid-reduction --delta-passes=basic-blocks --test FileCheck --test-arg %s --test-arg --check-prefix=INTERESTING --test-arg --input-file +; RUN: FileCheck %s --input-file %t --check-prefixes=CHECK,INTERESTING -; CHECK-INTERESTINGNESS: store i32 0, -; CHECK-INTERESTINGNESS: store i32 1, -define i32 @e(ptr %p, i1 %cond) { -entry: +; CHECK-LABEL: define i32 @keep_callbr(ptr %p, i1 %cond) { +; CHECK: entry1: +; CHECK-NEXT: callbr void asm +; INTERESTING: store i32 0, +; INTERESTING: store i32 1, + +define i32 @keep_callbr(ptr %p, i1 %cond) { +entry1: callbr void asm sideeffect "", "!i,~{dirflag},~{fpsr},~{flags}"() to label %for.cond [label %preheader] for.cond: store i32 0, ptr %p - br label %preheader + ret i32 0 preheader: - store i32 1, %p - br i1 %%cond, label %for.cond, label %g + store i32 1, ptr %p + ret i32 1 +} + -returnbb: +; CHECK-LABEL: define i32 @drop_callbr(ptr %p, i1 %cond) { +; CHECK: entry1: +; CHECK-NEXT: br +; INTERESTING: store i32 0, + +define i32 @drop_callbr(ptr %p, i1 %cond) { +entry1: + callbr void asm sideeffect "", "!i,~{dirflag},~{fpsr},~{flags}"() + to label %for.cond [label %preheader] + +for.cond: + store i32 0, ptr %p ret i32 0 + +preheader: + store i32 1, ptr %p + ret i32 1 + }