[llvm] [NFC] Pre-commit a test case for a SimplifyCFG issue (PR #204957)

Shilei Tian via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 16 09:41:37 PDT 2026


https://github.com/shiltian updated https://github.com/llvm/llvm-project/pull/204957

>From c78de0baf7000e535fee63aca59ab4894ecde7f7 Mon Sep 17 00:00:00 2001
From: Shilei Tian <i at tianshilei.me>
Date: Sat, 20 Jun 2026 00:22:18 -0400
Subject: [PATCH] [NFC] Pre-commit a test case for a SimplifyCFG issue

---
 .../AMDGPU/convergent-jump-threading.ll       | 94 +++++++++++++++++++
 1 file changed, 94 insertions(+)
 create mode 100644 llvm/test/Transforms/SimplifyCFG/AMDGPU/convergent-jump-threading.ll

diff --git a/llvm/test/Transforms/SimplifyCFG/AMDGPU/convergent-jump-threading.ll b/llvm/test/Transforms/SimplifyCFG/AMDGPU/convergent-jump-threading.ll
new file mode 100644
index 0000000000000..2ceb3325263b3
--- /dev/null
+++ b/llvm/test/Transforms/SimplifyCFG/AMDGPU/convergent-jump-threading.ll
@@ -0,0 +1,94 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -S -mtriple=amdgpu9.00-amd-amdhsa -passes='simplifycfg<no-keep-loops>' < %s | FileCheck %s
+
+declare void @barrier() convergent
+declare void @plain()
+
+define void @preserve_loop_header_branch(i1 %cond, ptr %ptr) convergent {
+; CHECK-LABEL: define void @preserve_loop_header_branch(
+; CHECK-SAME: i1 [[COND:%.*]], ptr [[PTR:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    call void @barrier() #[[ATTR0]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[OUTER_THEN:.*]], label %[[LOOP_BODY:.*]]
+; CHECK:       [[OUTER_THEN]]:
+; CHECK-NEXT:    store i32 1, ptr [[PTR]], align 4
+; CHECK-NEXT:    br label %[[LOOP_THEN:.*]]
+; CHECK:       [[LOOP_THEN]]:
+; CHECK-NEXT:    store i32 2, ptr [[PTR]], align 4
+; CHECK-NEXT:    br label %[[LOOP_BODY]]
+; CHECK:       [[LOOP_BODY]]:
+; CHECK-NEXT:    call void @barrier() #[[ATTR0]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[LOOP_THEN]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
+; CHECK-NEXT:    ret void
+;
+entry:
+  br label %outer
+
+outer:
+  call void @barrier() convergent
+  br i1 %cond, label %outer.then, label %loop.header
+
+outer.then:
+  store i32 1, ptr %ptr, align 4
+  br label %loop.header
+
+loop.header:
+  br i1 %cond, label %loop.then, label %loop.body
+
+loop.then:
+  store i32 2, ptr %ptr, align 4
+  br label %loop.body
+
+loop.body:
+  call void @barrier() convergent
+  br i1 %cond, label %loop.header, label %exit
+
+exit:
+  ret void
+}
+
+define void @thread_non_convergent_loop_header_branch(i1 %cond, ptr %ptr) {
+; CHECK-LABEL: define void @thread_non_convergent_loop_header_branch(
+; CHECK-SAME: i1 [[COND:%.*]], ptr [[PTR:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    call void @plain()
+; CHECK-NEXT:    br i1 [[COND]], label %[[OUTER_THEN:.*]], label %[[EXIT_CRITEDGE:.*]]
+; CHECK:       [[OUTER_THEN]]:
+; CHECK-NEXT:    store i32 1, ptr [[PTR]], align 4
+; CHECK-NEXT:    br label %[[LOOP_THEN:.*]]
+; CHECK:       [[LOOP_THEN]]:
+; CHECK-NEXT:    store i32 2, ptr [[PTR]], align 4
+; CHECK-NEXT:    call void @plain()
+; CHECK-NEXT:    br i1 [[COND]], label %[[LOOP_THEN]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT_CRITEDGE]]:
+; CHECK-NEXT:    call void @plain()
+; CHECK-NEXT:    br label %[[EXIT]]
+; CHECK:       [[EXIT]]:
+; CHECK-NEXT:    ret void
+;
+entry:
+  br label %outer
+
+outer:
+  call void @plain()
+  br i1 %cond, label %outer.then, label %loop.header
+
+outer.then:
+  store i32 1, ptr %ptr, align 4
+  br label %loop.header
+
+loop.header:
+  br i1 %cond, label %loop.then, label %loop.body
+
+loop.then:
+  store i32 2, ptr %ptr, align 4
+  br label %loop.body
+
+loop.body:
+  call void @plain()
+  br i1 %cond, label %loop.header, label %exit
+
+exit:
+  ret void
+}



More information about the llvm-commits mailing list