[llvm] 3b62612 - [LoopInterchange] Add test for loop contains AnyOf reduction (NFC) (#202091)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 7 11:02:49 PDT 2026
Author: Ryotaro Kasuga
Date: 2026-06-08T03:02:45+09:00
New Revision: 3b6261258a9361708b0947d48a63bbf53fc5e464
URL: https://github.com/llvm/llvm-project/commit/3b6261258a9361708b0947d48a63bbf53fc5e464
DIFF: https://github.com/llvm/llvm-project/commit/3b6261258a9361708b0947d48a63bbf53fc5e464.diff
LOG: [LoopInterchange] Add test for loop contains AnyOf reduction (NFC) (#202091)
This patch adds the test case raised in #202089. The issue will be fixed
by a follow-up patch #202092.
Added:
llvm/test/Transforms/LoopInterchange/reduction-anyof.ll
Modified:
Removed:
################################################################################
diff --git a/llvm/test/Transforms/LoopInterchange/reduction-anyof.ll b/llvm/test/Transforms/LoopInterchange/reduction-anyof.ll
new file mode 100644
index 0000000000000..9346e76db2a60
--- /dev/null
+++ b/llvm/test/Transforms/LoopInterchange/reduction-anyof.ll
@@ -0,0 +1,90 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt < %s -passes=loop-interchange -loop-interchange-profitabilities=ignore -S | FileCheck %s
+
+; red = 0;
+; for (i = 0; i < 2; i++)
+; for (j = 0; j < 2; j++)
+; red = A[j][i] == 0 ? i + 1 : red;
+;
+; These loops must not be interchanged, because the reduction operation is not
+; associative. For example, consider `A` is as follows:
+;
+; A = {{1, 0}, {0, 1}};
+;
+; In the original code, the final value of `red` is 2, but if the loops are
+; interchanged, the final value of `red` becomes 1.
+;
+; FIXME: The loops are now interchanged.
+;
+define i8 @reduce_anyof(ptr %A) {
+; CHECK-LABEL: define i8 @reduce_anyof(
+; CHECK-SAME: ptr [[A:%.*]]) {
+; CHECK-NEXT: [[FOR_I_HEADER_PREHEADER:.*:]]
+; CHECK-NEXT: br label %[[FOR_I_HEADER:.*]]
+; CHECK: [[FOR_I_HEADER_PREHEADER1:.*]]:
+; CHECK-NEXT: br label %[[FOR_I_HEADER1:.*]]
+; CHECK: [[FOR_I_HEADER1]]:
+; CHECK-NEXT: [[I:%.*]] = phi i64 [ [[I_INC:%.*]], %[[FOR_I_LATCH:.*]] ], [ 0, %[[FOR_I_HEADER_PREHEADER1]] ]
+; CHECK-NEXT: [[RED:%.*]] = phi i8 [ [[SEL:%.*]], %[[FOR_I_LATCH]] ], [ [[RED_OUTER:%.*]], %[[FOR_I_HEADER_PREHEADER1]] ]
+; CHECK-NEXT: [[ADD:%.*]] = add i64 [[I]], 1
+; CHECK-NEXT: [[ADD8:%.*]] = trunc i64 [[ADD]] to i8
+; CHECK-NEXT: br label %[[FOR_J_SPLIT1:.*]]
+; CHECK: [[FOR_I_HEADER]]:
+; CHECK-NEXT: br label %[[FOR_J:.*]]
+; CHECK: [[FOR_J]]:
+; CHECK-NEXT: [[J:%.*]] = phi i64 [ [[TMP2:%.*]], %[[FOR_J_SPLIT2:.*]] ], [ 0, %[[FOR_I_HEADER]] ]
+; CHECK-NEXT: [[RED_OUTER]] = phi i8 [ [[RED_LCSSA:%.*]], %[[FOR_J_SPLIT2]] ], [ 0, %[[FOR_I_HEADER]] ]
+; CHECK-NEXT: br label %[[FOR_I_HEADER_PREHEADER1]]
+; CHECK: [[FOR_J_SPLIT1]]:
+; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i8], ptr [[A]], i64 [[J]], i64 [[I]]
+; CHECK-NEXT: [[LV:%.*]] = load i8, ptr [[ARRAYIDX]], align 4
+; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[LV]], 0
+; CHECK-NEXT: [[SEL]] = select i1 [[CMP]], i8 [[ADD8]], i8 [[RED]]
+; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[J]], 1
+; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[TMP0]], 2
+; CHECK-NEXT: br label %[[FOR_I_LATCH]]
+; CHECK: [[FOR_J_SPLIT2]]:
+; CHECK-NEXT: [[RED_LCSSA]] = phi i8 [ [[SEL]], %[[FOR_I_LATCH]] ]
+; CHECK-NEXT: [[TMP2]] = add i64 [[J]], 1
+; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[TMP2]], 2
+; CHECK-NEXT: br i1 [[TMP3]], label %[[FOR_J_SPLIT:.*]], label %[[FOR_J]]
+; CHECK: [[FOR_I_LATCH]]:
+; CHECK-NEXT: [[I_INC]] = add i64 [[I]], 1
+; CHECK-NEXT: [[EC_I:%.*]] = icmp eq i64 [[I_INC]], 2
+; CHECK-NEXT: br i1 [[EC_I]], label %[[FOR_J_SPLIT2]], label %[[FOR_I_HEADER1]]
+; CHECK: [[FOR_J_SPLIT]]:
+; CHECK-NEXT: [[RES:%.*]] = phi i8 [ [[RED_LCSSA]], %[[FOR_J_SPLIT2]] ]
+; CHECK-NEXT: ret i8 [[RES]]
+;
+entry:
+ br label %for.i.header
+
+for.i.header:
+ %i = phi i64 [ 0, %entry ], [ %i.inc, %for.i.latch ]
+ %red.outer = phi i8 [ 0, %entry ], [ %red.lcssa, %for.i.latch ]
+ %add = add i64 %i, 1
+ %add8 = trunc i64 %add to i8
+ br label %for.j
+
+for.j:
+ %j = phi i64 [ 0, %for.i.header ], [ %j.inc, %for.j ]
+ %red = phi i8 [ %red.outer, %for.i.header ], [ %sel, %for.j ]
+ %arrayidx = getelementptr inbounds [2 x i8], ptr %A, i64 %j, i64 %i
+ %lv = load i8, ptr %arrayidx, align 4
+ %cmp = icmp eq i8 %lv, 0
+ %sel = select i1 %cmp, i8 %add8, i8 %red
+ %j.inc = add i64 %j, 1
+ %ec.j = icmp eq i64 %j.inc, 2
+ br i1 %ec.j, label %for.i.latch, label %for.j
+
+for.i.latch:
+ %red.lcssa = phi i8 [ %sel, %for.j ]
+ %i.inc = add i64 %i, 1
+ %ec.i = icmp eq i64 %i.inc, 2
+ br i1 %ec.i, label %exit, label %for.i.header
+
+exit:
+ %res = phi i8 [ %red.lcssa, %for.i.latch ]
+ ret i8 %res
+}
+
More information about the llvm-commits
mailing list