Skip to content

Commit d426f49

Browse files
kumasentoivanradanov
authored andcommitted
[Benchmark][AES] fully supported
1 parent 09b1a47 commit d426f49

File tree

1 file changed

+114
-0
lines changed
  • tools/polymer/test/polymer-opt/Application

1 file changed

+114
-0
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
// RUN: polymer-opt %s -fold-scf-if -reg2mem -extract-scop-stmt | FileCheck %s
2+
3+
func @encrypt(%Sbox: memref<?x16xi32>, %statemt: memref<?xi32>) {
4+
%c1_i32 = arith.constant 1 : i32
5+
%c4_i32 = arith.constant 4 : i32
6+
%c15_i32 = arith.constant 15 : i32
7+
%c8_i32 = arith.constant 8 : i32
8+
%c283_i32 = arith.constant 283 : i32
9+
%ret = memref.alloca() : memref<1024xi32>
10+
affine.for %arg2 = 1 to 5 {
11+
affine.for %arg3 = 0 to 16 {
12+
%1 = affine.load %statemt[%arg3 * 4] : memref<?xi32>
13+
%2 = arith.shrsi %1, %c4_i32 : i32
14+
%3 = arith.index_cast %2 : i32 to index
15+
%4 = arith.andi %1, %c15_i32 : i32
16+
%5 = arith.index_cast %4 : i32 to index
17+
%6 = memref.load %Sbox[%3, %5] : memref<?x16xi32>
18+
affine.store %6, %statemt[%arg3 * 4] : memref<?xi32>
19+
}
20+
affine.for %arg3 = 0 to 1023 {
21+
%1 = affine.load %statemt[%arg3] : memref<?xi32>
22+
%2 = arith.shli %1, %c1_i32 : i32
23+
affine.store %2, %ret[%arg3] : memref<1024xi32>
24+
%3 = arith.shrsi %2, %c8_i32 : i32
25+
%4 = arith.cmpi eq, %3, %c1_i32 : i32
26+
scf.if %4 {
27+
%10 = arith.xori %2, %c283_i32 : i32
28+
affine.store %10, %ret[%arg3] : memref<1024xi32>
29+
}
30+
%5 = affine.load %statemt[%arg3 + 1] : memref<?xi32>
31+
%6 = arith.shli %5, %c1_i32 : i32
32+
%7 = arith.xori %5, %6 : i32
33+
%8 = arith.shrsi %7, %c8_i32 : i32
34+
%9 = arith.cmpi eq, %8, %c1_i32 : i32
35+
scf.if %9 {
36+
%10 = arith.xori %7, %c283_i32 : i32
37+
%11 = affine.load %ret[%arg3] : memref<1024xi32>
38+
%12 = arith.xori %11, %10 : i32
39+
affine.store %12, %ret[%arg3] : memref<1024xi32>
40+
} else {
41+
%10 = affine.load %ret[%arg3] : memref<1024xi32>
42+
%11 = arith.xori %10, %7 : i32
43+
affine.store %11, %ret[%arg3] : memref<1024xi32>
44+
}
45+
}
46+
affine.for %arg3 = 0 to 1024 {
47+
%1 = affine.load %ret[%arg3] : memref<1024xi32>
48+
affine.store %1, %statemt[%arg3] : memref<?xi32>
49+
}
50+
}
51+
return
52+
}
53+
54+
// CHECK: func private @S0(%[[statemt:.*]]: memref<?xi32>, %[[i:.*]]: index, %[[Sbox:.*]]: memref<?x16xi32>) attributes {scop.stmt}
55+
// CHECK-NEXT: %[[c15_i32:.*]] = arith.constant 15 : i32
56+
// CHECK-NEXT: %[[c4_i32:.*]] = arith.constant 4 : i32
57+
// CHECK-NEXT: %[[v0:.*]] = affine.load %[[statemt]][symbol(%[[i]]) * 4] : memref<?xi32>
58+
// CHECK-NEXT: %[[v1:.*]] = arith.shrsi %[[v0]], %[[c4_i32]] : i32
59+
// CHECK-NEXT: %[[v2:.*]] = arith.index_cast %[[v1]] : i32 to index
60+
// CHECK-NEXT: %[[v3:.*]] = arith.andi %[[v0]], %[[c15_i32]] : i32
61+
// CHECK-NEXT: %[[v4:.*]] = arith.index_cast %[[v3]] : i32 to index
62+
// CHECK-NEXT: %[[v5:.*]] = memref.load %[[Sbox]][%[[v2]], %[[v4]]] : memref<?x16xi32>
63+
// CHECK-NEXT: affine.store %[[v5]], %[[statemt]][symbol(%[[i]]) * 4] : memref<?xi32>
64+
65+
// CHECK: func private @S1(%[[i:.*]]: index, %[[ret:.*]]: memref<1024xi32>, %[[statemt:.*]]: memref<?xi32>) attributes {scop.stmt}
66+
// CHECK-NEXT: %[[c1_i32:.*]] = arith.constant 1 : i32
67+
// CHECK-NEXT: %[[v0:.*]] = affine.load %[[statemt]][symbol(%[[i]])] : memref<?xi32>
68+
// CHECK-NEXT: %[[v1:.*]] = arith.shli %[[v0]], %[[c1_i32]] : i32
69+
// CHECK-NEXT: affine.store %[[v1]], %[[ret]][symbol(%[[i]])] : memref<1024xi32>
70+
71+
// CHECK: func private @S2(%[[i:.*]]: index, %[[ret:.*]]: memref<1024xi32>) attributes {scop.stmt}
72+
// CHECK: %[[c283_i32:.*]] = arith.constant 283 : i32
73+
// CHECK: %[[c1_i32:.*]] = arith.constant 1 : i32
74+
// CHECK: %[[c8_i32:.*]] = arith.constant 8 : i32
75+
// CHECK: %[[v0:.*]] = affine.load %[[ret]][symbol(%[[i]])] : memref<1024xi32>
76+
// CHECK: %[[v1:.*]] = arith.shrsi %[[v0]], %[[c8_i32]] : i32
77+
// CHECK: %[[v2:.*]] = arith.cmpi eq, %[[v1]], %[[c1_i32]] : i32
78+
// CHECK: %[[v3:.*]] = arith.xori %[[v0]], %[[c283_i32]] : i32
79+
// CHECK: %[[v4:.*]] = affine.load %[[ret]][symbol(%[[i]])] : memref<1024xi32>
80+
// CHECK: %[[v5:.*]] = select %[[v2]], %[[v3]], %[[v4]] : i32
81+
// CHECK: affine.store %[[v5]], %[[ret]][symbol(%[[i]])] : memref<1024xi32>
82+
83+
// CHECK: func private @S3(%[[i:.*]]: index, %[[ret:.*]]: memref<1024xi32>, %[[statemt]]: memref<?xi32>) attributes {scop.stmt}
84+
// CHECK-NEXT: %[[c283_i32:.*]] = arith.constant 283 : i32
85+
// CHECK-NEXT: %[[c1_i32:.*]] = arith.constant 1 : i32
86+
// CHECK-NEXT: %[[c8_i32:.*]] = arith.constant 8 : i32
87+
// CHECK-NEXT: %[[v0:.*]] = affine.load %[[ret]][symbol(%[[i]])] : memref<1024xi32>
88+
// CHECK-NEXT: %[[v1:.*]] = affine.load %[[ret]][symbol(%[[i]])] : memref<1024xi32>
89+
// CHECK-NEXT: %[[v2:.*]] = affine.load %[[statemt]][symbol(%[[i]]) + 1] : memref<?xi32>
90+
// CHECK-NEXT: %[[v3:.*]] = arith.shli %[[v2]], %[[c1_i32]] : i32
91+
// CHECK-NEXT: %[[v4:.*]] = arith.xori %[[v2]], %[[v3]] : i32
92+
// CHECK-NEXT: %[[v5:.*]] = arith.shrsi %[[v4]], %[[c8_i32]] : i32
93+
// CHECK-NEXT: %[[v6:.*]] = arith.cmpi eq, %[[v5]], %[[c1_i32]] : i32
94+
// CHECK-NEXT: %[[v7:.*]] = arith.xori %[[v4]], %[[c283_i32]] : i32
95+
// CHECK-NEXT: %[[v8:.*]] = arith.xori %[[v0]], %[[v7]] : i32
96+
// CHECK-NEXT: %[[v9:.*]] = arith.xori %[[v1]], %[[v4]] : i32
97+
// CHECK-NEXT: %[[v10:.*]] = select %[[v6]], %[[v8]], %[[v9]] : i32
98+
// CHECK-NEXT: affine.store %[[v10]], %[[ret]][symbol(%[[i]])] : memref<1024xi32>
99+
100+
// CHECK: func private @S4(%[[statemt:.*]]: memref<?xi32>, %[[i:.*]]: index, %[[ret:.*]]: memref<1024xi32>) attributes {scop.stmt}
101+
// CHECK-NEXT: %[[v0:.*]] = affine.load %[[ret]][symbol(%[[i]])] : memref<1024xi32>
102+
// CHECK-NEXT: affine.store %[[v0]], %[[statemt]][symbol(%[[i]])] : memref<?xi32>
103+
104+
// CHECK: func @encrypt(%[[Sbox:.*]]: memref<?x16xi32>, %[[statemt:.*]]: memref<?xi32>)
105+
// CHECK: %[[ret:.*]] = memref.alloca() : memref<1024xi32>
106+
// CHECK: affine.for %[[i:.*]] = 1 to 5
107+
// CHECK: affine.for %[[j:.*]] = 0 to 16
108+
// CHECK: call @S0(%[[statemt]], %[[j]], %[[Sbox]]) : (memref<?xi32>, index, memref<?x16xi32>) -> ()
109+
// CHECK: affine.for %[[j:.*]] = 0 to 1023
110+
// CHECK: call @S1(%[[j]], %[[ret]], %[[statemt]]) : (index, memref<1024xi32>, memref<?xi32>) -> ()
111+
// CHECK: call @S2(%[[j]], %[[ret]]) : (index, memref<1024xi32>) -> ()
112+
// CHECK: call @S3(%[[j]], %[[ret]], %[[statemt]]) : (index, memref<1024xi32>, memref<?xi32>) -> ()
113+
// CHECK: affine.for %[[j:.*]] = 0 to 1024
114+
// CHECK: call @S4(%[[statemt]], %[[j]], %[[ret]]) : (memref<?xi32>, index, memref<1024xi32>) -> ()

0 commit comments

Comments
 (0)