3 ; RUN: opt < %s -passes=loop-interchange -debug -disable-output 2>&1 | FileCheck %s
5 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"
7 @N = dso_local global i32 0, align 4
8 @a = dso_local global ptr null, align 8
9 @b = dso_local global ptr null, align 8
10 @c = dso_local global ptr null, align 8
12 ; Loop interchange should not run delinearization
13 ; for one loop case and should bail out early.
15 ; CHECK-NOT: Delinearizing
18 ; CHECK: Unsupported depth of loop nest 1, the supported range is [2, 10].
22 %retval = alloca i32, align 4
23 %i = alloca i32, align 4
24 store i32 0, ptr %retval, align 4
25 store i32 0, ptr %i, align 4
28 for.cond: ; preds = %for.inc, %entry
29 %0 = load i32, ptr %i, align 4
30 %1 = load i32, ptr @N, align 4
31 %cmp = icmp ult i32 %0, %1
32 br i1 %cmp, label %for.body, label %for.cond.cleanup
34 for.cond.cleanup: ; preds = %for.cond
37 for.body: ; preds = %for.cond
38 %2 = load ptr, ptr @b, align 8
39 %3 = load i32, ptr %i, align 4
40 %idxprom = zext i32 %3 to i64
41 %arrayidx = getelementptr inbounds nuw i32, ptr %2, i64 %idxprom
42 %4 = load i32, ptr %arrayidx, align 4
43 %5 = load ptr, ptr @c, align 8
44 %6 = load i32, ptr %i, align 4
45 %idxprom1 = zext i32 %6 to i64
46 %arrayidx2 = getelementptr inbounds nuw i32, ptr %5, i64 %idxprom1
47 %7 = load i32, ptr %arrayidx2, align 4
48 %add = add nsw i32 %4, %7
49 %8 = load ptr, ptr @a, align 8
50 %9 = load i32, ptr %i, align 4
51 %idxprom3 = zext i32 %9 to i64
52 %arrayidx4 = getelementptr inbounds nuw i32, ptr %8, i64 %idxprom3
53 store i32 %add, ptr %arrayidx4, align 4
56 for.inc: ; preds = %for.body
57 %10 = load i32, ptr %i, align 4
59 store i32 %inc, ptr %i, align 4
62 for.end: ; preds = %for.cond.cleanup