283 lines · plain
1; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-type=value-based -disable-output < %s | FileCheck %s -check-prefix=VALUE2; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-type=memory-based -disable-output < %s | FileCheck %s -check-prefix=MEMORY3; RUN: opt -S %loadNPMPolly -aa-pipeline=basic-aa '-passes=polly-custom<deps>' -polly-print-deps -polly-dependences-analysis-type=value-based -polly-dependences-analysis-level=access-wise -disable-output < %s | FileCheck %s -check-prefix=VALUE_ACCESS4 5; VALUE: RAW dependences:6; VALUE-NEXT: { }7; VALUE-NEXT: WAR dependences:8; VALUE-NEXT: { }9; VALUE-NEXT: WAW dependences:10; VALUE-NEXT: { Stmt_S1[i0] -> Stmt_S3[i0] : 10 <= i0 <= 99; Stmt_S1[i0] -> Stmt_S2[i0] : 0 <= i0 <= 9; Stmt_S2[i0] -> Stmt_S3[i0] : 0 <= i0 <= 9 }11;12; VALUE: RAW dependences:13; VALUE-NEXT: { Stmt_S2[i0] -> Stmt_S3[i0] : 0 <= i0 <= 9; Stmt_S1[i0] -> Stmt_S3[i0] : 10 <= i0 <= 99 }14; VALUE-NEXT: WAR dependences:15; VALUE-NEXT: { }16; VALUE-NEXT: WAW dependences:17; VALUE-NEXT: { Stmt_S1[i0] -> Stmt_S2[i0] : 0 <= i0 <= 9 }18;19; VALUE: RAW dependences:20; VALUE-NEXT: { }21; VALUE-NEXT: WAR dependences:22; VALUE-NEXT: { Stmt_S1[i0] -> Stmt_S2[i0] : 0 <= i0 <= 9; Stmt_S1[i0] -> Stmt_S3[i0] : 10 <= i0 <= 99 }23; VALUE-NEXT: WAW dependences:24; VALUE-NEXT: { Stmt_S2[i0] -> Stmt_S3[i0] : 0 <= i0 <= 9 }25;26; VALUE: RAW dependences:27; VALUE-NEXT: [p] -> { Stmt_S1[i0] -> Stmt_S2[-p + i0] : i0 >= p and 0 <= i0 <= 99 and i0 <= 9 + p }28; VALUE-NEXT: WAR dependences:29; VALUE-NEXT: [p] -> { }30; VALUE-NEXT: WAW dependences:31; VALUE-NEXT: [p] -> { }32;33;VALUE_ACCESS: RAW dependences:34;VALUE_ACCESS-NEXT: { }35;VALUE_ACCESS-NEXT: WAR dependences:36;VALUE_ACCESS-NEXT: { }37;VALUE_ACCESS-NEXT: WAW dependences:38;VALUE_ACCESS-NEXT: { Stmt_S1[i0] -> Stmt_S3[i0] : 10 <= i0 <= 99; Stmt_S1[i0] -> Stmt_S2[i0] : 0 <= i0 <= 9; [Stmt_S2[i0] -> Stmt_S2_Write0[]] -> [Stmt_S3[i0] -> Stmt_S3_Write0[]] : 0 <= i0 <= 9; Stmt_S2[i0] -> Stmt_S3[i0] : 0 <= i0 <= 9; [Stmt_S1[i0] -> Stmt_S1_Write0[]] -> [Stmt_S2[i0] -> Stmt_S2_Write0[]] : 0 <= i0 <= 9; [Stmt_S1[i0] -> Stmt_S1_Write0[]] -> [Stmt_S3[i0] -> Stmt_S3_Write0[]] : 10 <= i0 <= 99 }39;40;VALUE_ACCESS: RAW dependences:41;VALUE_ACCESS-NEXT: { Stmt_S1[i0] -> Stmt_S3[i0] : 10 <= i0 <= 99; Stmt_S2[i0] -> Stmt_S3[i0] : 0 <= i0 <= 9; [Stmt_S2[i0] -> Stmt_S2_Write0[]] -> [Stmt_S3[i0] -> Stmt_S3_Read0[]] : 0 <= i0 <= 9; [Stmt_S1[i0] -> Stmt_S1_Write0[]] -> [Stmt_S3[i0] -> Stmt_S3_Read0[]] : 10 <= i0 <= 99 }42 43;VALUE_ACCESS-NEXT: WAR dependences:44;VALUE_ACCESS-NEXT: { }45;VALUE_ACCESS-NEXT: WAW dependences:46;VALUE_ACCESS-NEXT: { [Stmt_S1[i0] -> Stmt_S1_Write0[]] -> [Stmt_S2[i0] -> Stmt_S2_Write0[]] : 0 <= i0 <= 9; Stmt_S1[i0] -> Stmt_S2[i0] : 0 <= i0 <= 9 }47;48;VALUE_ACCESS: RAW dependences:49;VALUE_ACCESS-NEXT: { }50;VALUE_ACCESS-NEXT: WAR dependences:51;VALUE_ACCESS-NEXT: { Stmt_S1[i0] -> Stmt_S2[i0] : 0 <= i0 <= 9; Stmt_S1[i0] -> Stmt_S3[i0] : 10 <= i0 <= 99; [Stmt_S1[i0] -> Stmt_S1_Read0[]] -> [Stmt_S2[i0] -> Stmt_S2_Write0[]] : 0 <= i0 <= 9; [Stmt_S1[i0] -> Stmt_S1_Read0[]] -> [Stmt_S3[i0] -> Stmt_S3_Write0[]] : 10 <= i0 <= 99 }52;VALUE_ACCESS-NEXT: WAW dependences:53;VALUE_ACCESS-NEXT: { Stmt_S2[i0] -> Stmt_S3[i0] : 0 <= i0 <= 9; [Stmt_S2[i0] -> Stmt_S2_Write0[]] -> [Stmt_S3[i0] -> Stmt_S3_Write0[]] : 0 <= i0 <= 9 }54;55;VALUE_ACCESS: RAW dependences:56;VALUE_ACCESS-NEXT: [p] -> { Stmt_S1[i0] -> Stmt_S2[-p + i0] : i0 >= p and 0 <= i0 <= 99 and i0 <= 9 + p; [Stmt_S1[i0] -> Stmt_S1_Write0[]] -> [Stmt_S2[-p + i0] -> Stmt_S2_Read0[]] : i0 >= p and 0 <= i0 <= 99 and i0 <= 9 + p }57;VALUE_ACCESS-NEXT: WAR dependences:58;VALUE_ACCESS-NEXT: [p] -> { }59;VALUE_ACCESS-NEXT: WAW dependences:60;VALUE_ACCESS-NEXT: [p] -> { }61 62; MEMORY: RAW dependences:63; MEMORY-NEXT: { }64; MEMORY-NEXT: WAR dependences:65; MEMORY-NEXT: { }66; MEMORY-NEXT: WAW dependences:67; MEMORY-NEXT: { Stmt_S1[i0] -> Stmt_S3[i0] : 0 <= i0 <= 99; Stmt_S1[i0] -> Stmt_S2[i0] : 0 <= i0 <= 9; Stmt_S2[i0] -> Stmt_S3[i0] : 0 <= i0 <= 9 }68;69; MEMORY: RAW dependences:70; MEMORY-NEXT: { Stmt_S2[i0] -> Stmt_S3[i0] : 0 <= i0 <= 9; Stmt_S1[i0] -> Stmt_S3[i0] : 0 <= i0 <= 99 }71; MEMORY-NEXT: WAR dependences:72; MEMORY-NEXT: { }73; MEMORY-NEXT: WAW dependences:74; MEMORY-NEXT: { Stmt_S1[i0] -> Stmt_S2[i0] : 0 <= i0 <= 9 }75;76; MEMORY: RAW dependences:77; MEMORY-NEXT: { }78; MEMORY-NEXT: WAR dependences:79; MEMORY-NEXT: { Stmt_S1[i0] -> Stmt_S2[i0] : 0 <= i0 <= 9; Stmt_S1[i0] -> Stmt_S3[i0] : 0 <= i0 <= 99 }80; MEMORY-NEXT: WAW dependences:81; MEMORY-NEXT: { Stmt_S2[i0] -> Stmt_S3[i0] : 0 <= i0 <= 9 }82;83; MEMORY: RAW dependences:84; MEMORY-NEXT: [p] -> { Stmt_S1[i0] -> Stmt_S2[-p + i0] : i0 >= p and 0 <= i0 <= 99 and i0 <= 9 + p }85; MEMORY-NEXT: WAR dependences:86; MEMORY-NEXT: [p] -> { }87; MEMORY-NEXT: WAW dependences:88; MEMORY-NEXT: [p] -> { }89 90target 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-n8:16:32:64"91 92; for(i = 0; i < 100; i++ )93; S1: A[i] = 2;94;95; for (i = 0; i < 10; i++ )96; S2: A[i] = 5;97;98; for (i = 0; i < 200; i++ )99; S3: A[i] = 5;100 101define void @sequential_writes() {102entry:103 %A = alloca [200 x i32]104 br label %S1105 106S1:107 %indvar.1 = phi i64 [ 0, %entry ], [ %indvar.next.1, %S1 ]108 %arrayidx.1 = getelementptr [200 x i32], ptr %A, i64 0, i64 %indvar.1109 store i32 2, ptr %arrayidx.1110 %indvar.next.1 = add i64 %indvar.1, 1111 %exitcond.1 = icmp ne i64 %indvar.next.1, 100112 br i1 %exitcond.1, label %S1, label %exit.1113 114exit.1:115 br label %S2116 117S2:118 %indvar.2 = phi i64 [ 0, %exit.1 ], [ %indvar.next.2, %S2 ]119 %arrayidx.2 = getelementptr [200 x i32], ptr %A, i64 0, i64 %indvar.2120 store i32 5, ptr %arrayidx.2121 %indvar.next.2 = add i64 %indvar.2, 1122 %exitcond.2 = icmp ne i64 %indvar.next.2, 10123 br i1 %exitcond.2, label %S2, label %exit.2124 125exit.2:126 br label %S3127 128S3:129 %indvar.3 = phi i64 [ 0, %exit.2 ], [ %indvar.next.3, %S3 ]130 %arrayidx.3 = getelementptr [200 x i32], ptr %A, i64 0, i64 %indvar.3131 store i32 7, ptr %arrayidx.3132 %indvar.next.3 = add i64 %indvar.3, 1133 %exitcond.3 = icmp ne i64 %indvar.next.3, 200134 br i1 %exitcond.3, label %S3 , label %exit.3135 136exit.3:137 ret void138}139 140 141; for(i = 0; i < 100; i++ )142; S1: A[i] = 2;143;144; for (i = 0; i < 10; i++ )145; S2: A[i] = 5;146;147; for (i = 0; i < 200; i++ )148; S3: B[i] = A[i];149 150define void @read_after_writes() {151entry:152 %A = alloca [200 x i32]153 %B = alloca [200 x i32]154 br label %S1155 156S1:157 %indvar.1 = phi i64 [ 0, %entry ], [ %indvar.next.1, %S1 ]158 %arrayidx.1 = getelementptr [200 x i32], ptr %A, i64 0, i64 %indvar.1159 store i32 2, ptr %arrayidx.1160 %indvar.next.1 = add i64 %indvar.1, 1161 %exitcond.1 = icmp ne i64 %indvar.next.1, 100162 br i1 %exitcond.1, label %S1, label %exit.1163 164exit.1:165 br label %S2166 167S2:168 %indvar.2 = phi i64 [ 0, %exit.1 ], [ %indvar.next.2, %S2 ]169 %arrayidx.2 = getelementptr [200 x i32], ptr %A, i64 0, i64 %indvar.2170 store i32 5, ptr %arrayidx.2171 %indvar.next.2 = add i64 %indvar.2, 1172 %exitcond.2 = icmp ne i64 %indvar.next.2, 10173 br i1 %exitcond.2, label %S2, label %exit.2174 175exit.2:176 br label %S3177 178S3:179 %indvar.3 = phi i64 [ 0, %exit.2 ], [ %indvar.next.3, %S3 ]180 %arrayidx.3.a = getelementptr [200 x i32], ptr %A, i64 0, i64 %indvar.3181 %arrayidx.3.b = getelementptr [200 x i32], ptr %B, i64 0, i64 %indvar.3182 %val = load i32, ptr %arrayidx.3.a183 store i32 %val, ptr %arrayidx.3.b184 %indvar.next.3 = add i64 %indvar.3, 1185 %exitcond.3 = icmp ne i64 %indvar.next.3, 200186 br i1 %exitcond.3, label %S3 , label %exit.3187 188exit.3:189 ret void190}191 192 193; for(i = 0; i < 100; i++ )194; S1: B[i] = A[i];195;196; for (i = 0; i < 10; i++ )197; S2: A[i] = 5;198;199; for (i = 0; i < 200; i++ )200; S3: A[i] = 10;201 202define void @write_after_read() {203entry:204 %A = alloca [200 x i32]205 %B = alloca [200 x i32]206 br label %S1207 208S1:209 %indvar.1 = phi i64 [ 0, %entry ], [ %indvar.next.1, %S1 ]210 %arrayidx.1.a = getelementptr [200 x i32], ptr %A, i64 0, i64 %indvar.1211 %arrayidx.1.b = getelementptr [200 x i32], ptr %B, i64 0, i64 %indvar.1212 %val = load i32, ptr %arrayidx.1.a213 store i32 %val, ptr %arrayidx.1.b214 %indvar.next.1 = add i64 %indvar.1, 1215 %exitcond.1 = icmp ne i64 %indvar.next.1, 100216 br i1 %exitcond.1, label %S1, label %exit.1217 218exit.1:219 br label %S2220 221S2:222 %indvar.2 = phi i64 [ 0, %exit.1 ], [ %indvar.next.2, %S2 ]223 %arrayidx.2 = getelementptr [200 x i32], ptr %A, i64 0, i64 %indvar.2224 store i32 5, ptr %arrayidx.2225 %indvar.next.2 = add i64 %indvar.2, 1226 %exitcond.2 = icmp ne i64 %indvar.next.2, 10227 br i1 %exitcond.2, label %S2, label %exit.2228 229exit.2:230 br label %S3231 232S3:233 %indvar.3 = phi i64 [ 0, %exit.2 ], [ %indvar.next.3, %S3 ]234 %arrayidx.3 = getelementptr [200 x i32], ptr %A, i64 0, i64 %indvar.3235 store i32 10, ptr %arrayidx.3236 %indvar.next.3 = add i64 %indvar.3, 1237 %exitcond.3 = icmp ne i64 %indvar.next.3, 200238 br i1 %exitcond.3, label %S3 , label %exit.3239 240exit.3:241 ret void242}243 244 245; for(i = 0; i < 100; i++ )246; S1: A[i] = 10247;248; for(i = 0; i < 100; i++ )249; S2: B[i] = A[i + p];250 251define void @parametric_offset(i64 %p) {252entry:253 %A = alloca [200 x i32]254 %B = alloca [200 x i32]255 br label %S1256 257S1:258 %indvar.1 = phi i64 [ 0, %entry ], [ %indvar.next.1, %S1 ]259 %arrayidx.1 = getelementptr [200 x i32], ptr %A, i64 0, i64 %indvar.1260 store i32 10, ptr %arrayidx.1261 %indvar.next.1 = add i64 %indvar.1, 1262 %exitcond.1 = icmp ne i64 %indvar.next.1, 100263 br i1 %exitcond.1, label %S1, label %exit.1264 265exit.1:266 br label %S2267 268S2:269 %indvar.2 = phi i64 [ 0, %exit.1 ], [ %indvar.next.2, %S2 ]270 %sum = add i64 %indvar.2, %p271 %arrayidx.2.a = getelementptr [200 x i32], ptr %A, i64 0, i64 %sum272 %arrayidx.2.b = getelementptr [200 x i32], ptr %B, i64 0, i64 %indvar.2273 %val = load i32, ptr %arrayidx.2.a274 store i32 %val, ptr %arrayidx.2.b275 %indvar.next.2 = add i64 %indvar.2, 1276 %exitcond.2 = icmp ne i64 %indvar.next.2, 10277 br i1 %exitcond.2, label %S2, label %exit.2278 279exit.2:280 ret void281}282 283