[llvm] 31edb8f - [LICM] Generate test checks (NFC) (#189963)

via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 1 06:52:23 PDT 2026


Author: Nikita Popov
Date: 2026-04-01T15:52:17+02:00
New Revision: 31edb8fab547eaa76427bf5c62b0c9e58cba3e41

URL: https://github.com/llvm/llvm-project/commit/31edb8fab547eaa76427bf5c62b0c9e58cba3e41
DIFF: https://github.com/llvm/llvm-project/commit/31edb8fab547eaa76427bf5c62b0c9e58cba3e41.diff

LOG: [LICM] Generate test checks (NFC) (#189963)

Added: 
    

Modified: 
    llvm/test/Transforms/LICM/preheader-safe.ll
    llvm/test/Transforms/LICM/read-only-calls.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/LICM/preheader-safe.ll b/llvm/test/Transforms/LICM/preheader-safe.ll
index a96e847c51d9f..f97cfbcbf362c 100644
--- a/llvm/test/Transforms/LICM/preheader-safe.ll
+++ b/llvm/test/Transforms/LICM/preheader-safe.ll
@@ -1,16 +1,22 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
 ; RUN: opt -S -passes=licm < %s | FileCheck %s
-; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<target-ir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' -S %s | FileCheck %s
 
 declare void @use_nothrow(i64 %a) nounwind
 declare void @use(i64 %a)
 declare void @maythrow()
 
 define void @nothrow(i64 %x, i64 %y, ptr %cond) {
-; CHECK-LABEL: nothrow
-; CHECK-LABEL: entry
-; CHECK: %div = udiv i64 %x, %y
-; CHECK-LABEL: loop
-; CHECK: call void @use_nothrow(i64 %div)
+; CHECK-LABEL: define void @nothrow(
+; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], ptr [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[DIV:%.*]] = udiv i64 [[X]], [[Y]]
+; CHECK-NEXT:    br label %[[LOOP:.*]]
+; CHECK:       [[LOOP]]:
+; CHECK-NEXT:    br label %[[LOOP2:.*]]
+; CHECK:       [[LOOP2]]:
+; CHECK-NEXT:    call void @use_nothrow(i64 [[DIV]])
+; CHECK-NEXT:    br label %[[LOOP]]
+;
 entry:
   br label %loop
 
@@ -25,10 +31,15 @@ loop2:
 
 ; The udiv is guarantee to execute if the loop is
 define void @throw_header_after(i64 %x, i64 %y, ptr %cond) {
-; CHECK-LABEL: throw_header_after
-; CHECK: %div = udiv i64 %x, %y
-; CHECK-LABEL: loop
-; CHECK: call void @use(i64 %div)
+; CHECK-LABEL: define void @throw_header_after(
+; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], ptr [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[DIV:%.*]] = udiv i64 [[X]], [[Y]]
+; CHECK-NEXT:    br label %[[LOOP:.*]]
+; CHECK:       [[LOOP]]:
+; CHECK-NEXT:    call void @use(i64 [[DIV]])
+; CHECK-NEXT:    br label %[[LOOP]]
+;
 entry:
   br label %loop
 
@@ -37,13 +48,19 @@ loop:                                         ; preds = %entry, %for.inc
   call void @use(i64 %div)
   br label %loop
 }
+
 define void @throw_header_after_rec(ptr %xp, ptr %yp, ptr %cond) {
-; CHECK-LABEL: throw_header_after_rec
-; CHECK: %x = load i64, ptr %xp
-; CHECK: %y = load i64, ptr %yp
-; CHECK: %div = udiv i64 %x, %y
-; CHECK-LABEL: loop
-; CHECK: call void @use(i64 %div)
+; CHECK-LABEL: define void @throw_header_after_rec(
+; CHECK-SAME: ptr [[XP:%.*]], ptr [[YP:%.*]], ptr [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[X:%.*]] = load i64, ptr [[XP]], align 4
+; CHECK-NEXT:    [[Y:%.*]] = load i64, ptr [[YP]], align 4
+; CHECK-NEXT:    [[DIV:%.*]] = udiv i64 [[X]], [[Y]]
+; CHECK-NEXT:    br label %[[LOOP:.*]]
+; CHECK:       [[LOOP]]:
+; CHECK-NEXT:    call void @use(i64 [[DIV]]) #[[ATTR1:[0-9]+]]
+; CHECK-NEXT:    br label %[[LOOP]]
+;
 entry:
   br label %loop
 
@@ -58,12 +75,19 @@ loop:                                         ; preds = %entry, %for.inc
 ; Similiar to the above, but the hoistable instruction (%y in this case)
 ; happens not to be the first instruction in the block.
 define void @throw_header_after_nonfirst(ptr %xp, ptr %yp, ptr %cond) {
-; CHECK-LABEL: throw_header_after_nonfirst
-; CHECK: %y = load i64, ptr %yp
-; CHECK-LABEL: loop
-; CHECK: %x = load i64, ptr %gep
-; CHECK: %div = udiv i64 %x, %y
-; CHECK: call void @use(i64 %div)
+; CHECK-LABEL: define void @throw_header_after_nonfirst(
+; CHECK-SAME: ptr [[XP:%.*]], ptr [[YP:%.*]], ptr [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*]]:
+; CHECK-NEXT:    [[Y:%.*]] = load i64, ptr [[YP]], align 4
+; CHECK-NEXT:    br label %[[LOOP:.*]]
+; CHECK:       [[LOOP]]:
+; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[DIV:%.*]], %[[LOOP]] ]
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i64, ptr [[XP]], i64 [[IV]]
+; CHECK-NEXT:    [[X:%.*]] = load i64, ptr [[GEP]], align 4
+; CHECK-NEXT:    [[DIV]] = udiv i64 [[X]], [[Y]]
+; CHECK-NEXT:    call void @use(i64 [[DIV]]) #[[ATTR1]]
+; CHECK-NEXT:    br label %[[LOOP]]
+;
 entry:
   br label %loop
 
@@ -79,10 +103,16 @@ loop:                                         ; preds = %entry, %for.inc
 
 ; Negative test
 define void @throw_header_before(i64 %x, i64 %y, ptr %cond) {
-; CHECK-LABEL: throw_header_before
-; CHECK-LABEL: loop
-; CHECK: %div = udiv i64 %x, %y
-; CHECK: call void @use(i64 %div)
+; CHECK-LABEL: define void @throw_header_before(
+; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], ptr [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br label %[[LOOP:.*]]
+; CHECK:       [[LOOP]]:
+; CHECK-NEXT:    call void @maythrow()
+; CHECK-NEXT:    [[DIV:%.*]] = udiv i64 [[X]], [[Y]]
+; CHECK-NEXT:    call void @use(i64 [[DIV]])
+; CHECK-NEXT:    br label %[[LOOP]]
+;
 entry:
   br label %loop
 
@@ -96,11 +126,19 @@ loop:                                         ; preds = %entry, %for.inc
 ; The header is known no throw, but the loop is not.  We can
 ; still lift out of the header.
 define void @nothrow_header(i64 %x, i64 %y, i1 %cond) {
-; CHECK-LABEL: nothrow_header
-; CHECK-LABEL: entry
-; CHECK: %div = udiv i64 %x, %y
-; CHECK-LABEL: loop
-  ; CHECK: call void @use(i64 %div)
+; CHECK-LABEL: define void @nothrow_header(
+; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[DIV:%.*]] = udiv i64 [[X]], [[Y]]
+; CHECK-NEXT:    br label %[[LOOP:.*]]
+; CHECK:       [[LOOP]]:
+; CHECK-NEXT:    br i1 [[COND]], label %[[LOOP_IF:.*]], label %[[EXIT:.*]]
+; CHECK:       [[LOOP_IF]]:
+; CHECK-NEXT:    call void @use(i64 [[DIV]])
+; CHECK-NEXT:    br label %[[LOOP]]
+; CHECK:       [[EXIT]]:
+; CHECK-NEXT:    ret void
+;
 entry:
   br label %loop
 loop:                                         ; preds = %entry, %for.inc
@@ -115,11 +153,17 @@ exit:
 
 ; Positive test - can hoist something that happens before thrower.
 define void @nothrow_header_pos(i64 %x, i64 %y, i1 %cond) {
-; CHECK-LABEL: nothrow_header_pos
-; CHECK-LABEL: entry
-; CHECK: %div = udiv i64 %x, %y
-; CHECK-LABEL: loop
-; CHECK: call void @use(i64 %div)
+; CHECK-LABEL: define void @nothrow_header_pos(
+; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[DIV:%.*]] = udiv i64 [[X]], [[Y]]
+; CHECK-NEXT:    br label %[[LOOP:.*]]
+; CHECK:       [[LOOP]]:
+; CHECK-NEXT:    br label %[[LOOP_IF:.*]]
+; CHECK:       [[LOOP_IF]]:
+; CHECK-NEXT:    call void @use(i64 [[DIV]])
+; CHECK-NEXT:    br label %[[LOOP]]
+;
 entry:
   br label %loop
 loop:                                         ; preds = %entry, %for.inc
@@ -133,12 +177,18 @@ loop-if:
 
 ; Negative test - can't move out of throwing block
 define void @nothrow_header_neg(i64 %x, i64 %y, i1 %cond) {
-; CHECK-LABEL: nothrow_header_neg
-; CHECK-LABEL: entry
-; CHECK-LABEL: loop
-; CHECK: call void @maythrow()
-; CHECK: %div = udiv i64 %x, %y
-; CHECK: call void @use(i64 %div)
+; CHECK-LABEL: define void @nothrow_header_neg(
+; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br label %[[LOOP:.*]]
+; CHECK:       [[LOOP]]:
+; CHECK-NEXT:    br label %[[LOOP_IF:.*]]
+; CHECK:       [[LOOP_IF]]:
+; CHECK-NEXT:    call void @maythrow()
+; CHECK-NEXT:    [[DIV:%.*]] = udiv i64 [[X]], [[Y]]
+; CHECK-NEXT:    call void @use(i64 [[DIV]])
+; CHECK-NEXT:    br label %[[LOOP]]
+;
 entry:
   br label %loop
 loop:                                         ; preds = %entry, %for.inc

diff  --git a/llvm/test/Transforms/LICM/read-only-calls.ll b/llvm/test/Transforms/LICM/read-only-calls.ll
index 87899045f1655..ec8470ab51dfd 100644
--- a/llvm/test/Transforms/LICM/read-only-calls.ll
+++ b/llvm/test/Transforms/LICM/read-only-calls.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
 ; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<target-ir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' < %s -S | FileCheck %s
 
 ; We should be able to hoist loads in presence of read only calls and stores
@@ -15,10 +16,19 @@ declare void @foo(i64, ptr) readonly
 ; default AST mechanism clumps all memory locations in one set because of the
 ; readonly call
 define void @test1(ptr %ptr) {
-; CHECK-LABEL: @test1(
-; CHECK-LABEL: entry:
-; CHECK:         %val = load i32, ptr %ptr
-; CHECK-LABEL: loop:
+; CHECK-LABEL: define void @test1(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*]]:
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    [[P2:%.*]] = getelementptr i32, ptr [[PTR]], i32 1
+; CHECK-NEXT:    br label %[[LOOP:.*]]
+; CHECK:       [[LOOP]]:
+; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[X_INC:%.*]], %[[LOOP]] ]
+; CHECK-NEXT:    call void @foo(i64 4, ptr [[PTR]])
+; CHECK-NEXT:    store volatile i32 0, ptr [[P2]], align 4
+; CHECK-NEXT:    [[X_INC]] = add i32 [[X]], [[VAL]]
+; CHECK-NEXT:    br label %[[LOOP]]
+;
 entry:
   br label %loop
 
@@ -34,10 +44,17 @@ loop:
 
 ; can hoist out load with the default AST and the alias analysis mechanism.
 define void @test2(ptr %ptr) {
-; CHECK-LABEL: @test2(
-; CHECK-LABEL: entry:
-; CHECK:         %val = load i32, ptr %ptr
-; CHECK-LABEL: loop:
+; CHECK-LABEL: define void @test2(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*]]:
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    br label %[[LOOP:.*]]
+; CHECK:       [[LOOP]]:
+; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[X_INC:%.*]], %[[LOOP]] ]
+; CHECK-NEXT:    call void @foo(i64 4, ptr [[PTR]])
+; CHECK-NEXT:    [[X_INC]] = add i32 [[X]], [[VAL]]
+; CHECK-NEXT:    br label %[[LOOP]]
+;
 entry:
   br label %loop
 
@@ -51,10 +68,17 @@ loop:
 
 ; cannot hoist load since not guaranteed to execute
 define void @test3(ptr %ptr) {
-; CHECK-LABEL: @test3(
-; CHECK-LABEL: entry:
-; CHECK-LABEL: loop:
-; CHECK:         %val = load i32, ptr %ptr
+; CHECK-LABEL: define void @test3(
+; CHECK-SAME: ptr [[PTR:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*]]:
+; CHECK-NEXT:    br label %[[LOOP:.*]]
+; CHECK:       [[LOOP]]:
+; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[X_INC:%.*]], %[[LOOP]] ]
+; CHECK-NEXT:    call void @foo(i64 4, ptr [[PTR]])
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    [[X_INC]] = add i32 [[X]], [[VAL]]
+; CHECK-NEXT:    br label %[[LOOP]]
+;
 entry:
   br label %loop
 


        


More information about the llvm-commits mailing list