aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/Transforms/LoopInterchange/force-interchange.ll
blob: c33ecdf7d9905838456c4c9213746f510a77973b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
; RUN: opt < %s -passes=loop-interchange -pass-remarks-output=%t -disable-output -loop-interchange-profitabilities=ignore -S
; RUN: FileCheck --input-file=%t %s

; There should be no reason to interchange this, unless it is forced.
;
;     for (int i = 0; i<1024; i++)
;       for (int j = 0; j<1024; j++)
;         A[i][j] = 42;
;
; CHECK:      --- !Passed
; CHECK-NEXT: Pass:            loop-interchange
; CHECK-NEXT: Name:            Interchanged
; CHECK-NEXT: Function:        f
; CHECK-NEXT: Args:
; CHECK-NEXT:   - String:          Loop interchanged with enclosing loop.
; CHECK-NEXT: ...

@A = dso_local local_unnamed_addr global [1024 x [1024 x i32]] zeroinitializer, align 4

define dso_local void @f() local_unnamed_addr #0 {
entry:
  br label %outer.header

outer.header:
  %i = phi i64 [ 0, %entry ], [ %i.next, %inner.header ]
  br label %inner.body

inner.header:
  %i.next = add nuw nsw i64 %i, 1
  %exitcond20.not = icmp eq i64 %i.next, 1024
  br i1 %exitcond20.not, label %exit, label %outer.header

inner.body:
  %j = phi i64 [ 0, %outer.header ], [ %j.next, %inner.body ]
  %arrayidx6 = getelementptr inbounds nuw [1024 x [1024 x i32]], ptr @A, i64 0, i64 %i, i64 %j
  store i32 42, ptr %arrayidx6, align 4
  %j.next = add nuw nsw i64 %j, 1
  %exitcond.not = icmp eq i64 %j.next, 1024
  br i1 %exitcond.not, label %inner.header, label %inner.body

exit:
  ret void
}