llvm-project

Форк
0
/
sequential_loops.ll 
92 строки · 2.6 Кб
1
; RUN: opt %loadNPMPolly '-passes=print<polly-detect>' -disable-output < %s 2>&1 | FileCheck %s
2

3
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
4

5
; Two sequential loops right after each other.
6
;
7
; void f(long A[], long N) {
8
;   long i;
9
;   for (i = 0; i < N; ++i)
10
;     A[i] = i;
11
;   for (i = 0; i < N; ++i)
12
;     A[i] = i;
13
; }
14

15
define void @f1(ptr %A, i64 %N) nounwind {
16
; CHECK-LABEL: Detected Scops in Function f1 
17
entry:
18
  fence seq_cst
19
  br label %for.i.1
20

21
for.i.1:
22
  %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.i.1 ]
23
  %scevgep = getelementptr i64, ptr %A, i64 %indvar
24
  store i64 %indvar, ptr %scevgep
25
  %indvar.next = add nsw i64 %indvar, 1
26
  %exitcond = icmp eq i64 %indvar.next, %N
27
  br i1 %exitcond, label %for.i.2, label %for.i.1
28

29
for.i.2:
30
  %indvar.2 = phi i64 [ 0, %for.i.1 ], [ %indvar.next.2, %for.i.2 ]
31
  %scevgep.2 = getelementptr i64, ptr %A, i64 %indvar.2
32
  store i64 %indvar.2, ptr %scevgep.2
33
  %indvar.next.2 = add nsw i64 %indvar.2, 1
34
  %exitcond.2 = icmp eq i64 %indvar.next.2, %N
35
  br i1 %exitcond.2, label %return, label %for.i.2
36

37
return:
38
  fence seq_cst
39
  ret void
40
}
41

42
; C-H-E-C-K: Valid Region for Scop: for.i.1 => return
43
; This one is currently not completely detected due to the PHI node in
44
; for.i.2 causing a 'PHI node in exit BB' error for the first loop. This should
45
; be fixed at some point. Such test cases do not really show up for us, as
46
; the -loop-simplify pass always inserts a preheader as in the test case below.
47

48
; Two sequential loops with a basic block in between.
49
;
50
;     void f(long A[], long N) {
51
;       long i;
52
;
53
;       for (i = 0; i < N; ++i)
54
;         A[i] = i;
55
; preheader:
56
;       ;
57
;
58
;       for (i = 0; i < N; ++i)
59
;         A[i] = i;
60
;     }
61

62
define void @f2(ptr %A, i64 %N) nounwind {
63
; CHECK-LABEL: Detected Scops in Function f2
64
entry:
65
  fence seq_cst
66
  br label %for.i.1
67

68
for.i.1:
69
  %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.i.1 ]
70
  %scevgep = getelementptr i64, ptr %A, i64 %indvar
71
  store i64 %indvar, ptr %scevgep
72
  %indvar.next = add nsw i64 %indvar, 1
73
  %exitcond = icmp eq i64 %indvar.next, %N
74
  br i1 %exitcond, label %preheader, label %for.i.1
75

76
preheader:
77
  br label %for.i.2
78

79
for.i.2:
80
  %indvar.2 = phi i64 [ 0, %preheader ], [ %indvar.next.2, %for.i.2 ]
81
  %scevgep.2 = getelementptr i64, ptr %A, i64 %indvar.2
82
  store i64 %indvar.2, ptr %scevgep.2
83
  %indvar.next.2 = add nsw i64 %indvar.2, 1
84
  %exitcond.2 = icmp eq i64 %indvar.next.2, %N
85
  br i1 %exitcond.2, label %return, label %for.i.2
86

87
return:
88
  fence seq_cst
89
  ret void
90
}
91

92
; CHECK: Valid Region for Scop: for.i.1 => return
93

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.