https://github.com/kasuga-fj updated https://github.com/llvm/llvm-project/pull/193479
>From 0da4f04ec60aa1a97db24110b0eb0198cfc161ac Mon Sep 17 00:00:00 2001 From: Ryotaro Kasuga <[email protected]> Date: Tue, 21 Apr 2026 10:18:50 +0000 Subject: [PATCH] [LoopInterchange] Add test with dependency `[* =]` and `[= *]` (NFC) --- .../LoopInterchange/dependency-all-eq.ll | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 llvm/test/Transforms/LoopInterchange/dependency-all-eq.ll diff --git a/llvm/test/Transforms/LoopInterchange/dependency-all-eq.ll b/llvm/test/Transforms/LoopInterchange/dependency-all-eq.ll new file mode 100644 index 0000000000000..7c5dd5489ef1b --- /dev/null +++ b/llvm/test/Transforms/LoopInterchange/dependency-all-eq.ll @@ -0,0 +1,117 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 +; RUN: opt < %s -S -passes=loop-interchange -loop-interchange-profitabilities=instorder \ +; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-PROFIT-INSTORDER +; RUN: opt < %s -S -passes=loop-interchange -loop-interchange-profitabilities=ignore \ +; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-PROFIT-IGNORE + +; for (i = 0; i < 100; i++) +; for (j = 0; j < 100; j++) +; A[j] = 0; +; +; The direction vector for this loop nest is [* =]. Interchanging the loops is +; legal. +; + +define void @all_eq(ptr %A) { +; CHECK-LABEL: define void @all_eq( +; CHECK-SAME: ptr [[A:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: br label %[[LOOP_I_HEADER:.*]] +; CHECK: [[LOOP_I_HEADER]]: +; CHECK-NEXT: [[I:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[I_INC:%.*]], %[[LOOP_I_LATCH:.*]] ] +; CHECK-NEXT: br label %[[LOOP_J:.*]] +; CHECK: [[LOOP_J]]: +; CHECK-NEXT: [[J:%.*]] = phi i64 [ 0, %[[LOOP_I_HEADER]] ], [ [[J_INC:%.*]], %[[LOOP_J]] ] +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 [[J]] +; CHECK-NEXT: store i8 0, ptr [[GEP]], align 1 +; CHECK-NEXT: [[J_INC]] = add i64 [[J]], 1 +; CHECK-NEXT: [[EC_J:%.*]] = icmp eq i64 [[J_INC]], 100 +; CHECK-NEXT: br i1 [[EC_J]], label %[[LOOP_I_LATCH]], label %[[LOOP_J]] +; CHECK: [[LOOP_I_LATCH]]: +; CHECK-NEXT: [[I_INC]] = add i64 [[I]], 1 +; CHECK-NEXT: [[EC_I:%.*]] = icmp eq i64 [[I_INC]], 100 +; CHECK-NEXT: br i1 [[EC_I]], label %[[EXIT:.*]], label %[[LOOP_I_HEADER]] +; CHECK: [[EXIT]]: +; CHECK-NEXT: ret void +; +entry: + br label %loop.i.header + +loop.i.header: + %i = phi i64 [ 0, %entry ], [ %i.inc, %loop.i.latch ] + br label %loop.j + +loop.j: + %j = phi i64 [ 0, %loop.i.header ], [ %j.inc, %loop.j ] + %gep = getelementptr i8, ptr %A, i64 %j + store i8 0, ptr %gep + %j.inc = add i64 %j, 1 + %ec.j = icmp eq i64 %j.inc, 100 + br i1 %ec.j, label %loop.i.latch, label %loop.j + +loop.i.latch: + %i.inc = add i64 %i, 1 + %ec.i = icmp eq i64 %i.inc, 100 + br i1 %ec.i, label %exit, label %loop.i.header + +exit: + ret void +} + + +; for (i = 0; i < 100; i++) +; for (j = 0; j < 100; j++) +; A[i] = 0; +; +; The direction vector for this loop nest is [= *]. Interchanging the loops is +; legal. +; + +define void @eq_all(ptr %A) { +; CHECK-LABEL: define void @eq_all( +; CHECK-SAME: ptr [[A:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*]]: +; CHECK-NEXT: br label %[[LOOP_I_HEADER:.*]] +; CHECK: [[LOOP_I_HEADER]]: +; CHECK-NEXT: [[I:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[I_INC:%.*]], %[[LOOP_I_LATCH:.*]] ] +; CHECK-NEXT: br label %[[LOOP_J:.*]] +; CHECK: [[LOOP_J]]: +; CHECK-NEXT: [[J:%.*]] = phi i64 [ 0, %[[LOOP_I_HEADER]] ], [ [[J_INC:%.*]], %[[LOOP_J]] ] +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 [[I]] +; CHECK-NEXT: store i8 0, ptr [[GEP]], align 1 +; CHECK-NEXT: [[J_INC]] = add i64 [[J]], 1 +; CHECK-NEXT: [[EC_J:%.*]] = icmp eq i64 [[J_INC]], 100 +; CHECK-NEXT: br i1 [[EC_J]], label %[[LOOP_I_LATCH]], label %[[LOOP_J]] +; CHECK: [[LOOP_I_LATCH]]: +; CHECK-NEXT: [[I_INC]] = add i64 [[I]], 1 +; CHECK-NEXT: [[EC_I:%.*]] = icmp eq i64 [[I_INC]], 100 +; CHECK-NEXT: br i1 [[EC_I]], label %[[EXIT:.*]], label %[[LOOP_I_HEADER]] +; CHECK: [[EXIT]]: +; CHECK-NEXT: ret void +; +entry: + br label %loop.i.header + +loop.i.header: + %i = phi i64 [ 0, %entry ], [ %i.inc, %loop.i.latch ] + br label %loop.j + +loop.j: + %j = phi i64 [ 0, %loop.i.header ], [ %j.inc, %loop.j ] + %gep = getelementptr i8, ptr %A, i64 %i + store i8 0, ptr %gep + %j.inc = add i64 %j, 1 + %ec.j = icmp eq i64 %j.inc, 100 + br i1 %ec.j, label %loop.i.latch, label %loop.j + +loop.i.latch: + %i.inc = add i64 %i, 1 + %ec.i = icmp eq i64 %i.inc, 100 + br i1 %ec.i, label %exit, label %loop.i.header + +exit: + ret void +} +;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: +; CHECK-PROFIT-IGNORE: {{.*}} +; CHECK-PROFIT-INSTORDER: {{.*}} _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
