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..f0f6646a20719 --- /dev/null +++ b/llvm/test/tools/llvm-reduce/reduce-bb-callbr.ll @@ -0,0 +1,44 @@ +; 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-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 + ret i32 0 + +preheader: + store i32 1, ptr %p + ret i32 1 +} + + +; 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 + +} 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();