Skip to content

Commit f2f12b8

Browse files
committed
[mlir][evm] Lower compare builtins
1 parent fcdf43e commit f2f12b8

File tree

2 files changed

+380
-0
lines changed

2 files changed

+380
-0
lines changed

libsolidity/codegen/mlir/YulToMLIR.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,17 @@ void YulToMLIRPass::populateBuiltinGenMap() {
283283
defSimpleBuiltinGen<arith::ShRUIOp, /*reverseArgs=*/true>("shr");
284284
defCmpBuiltinGen<arith::CmpIPredicate::ult>("lt");
285285
defCmpBuiltinGen<arith::CmpIPredicate::slt>("slt");
286+
defCmpBuiltinGen<arith::CmpIPredicate::ugt>("gt");
287+
defCmpBuiltinGen<arith::CmpIPredicate::sgt>("sgt");
288+
defCmpBuiltinGen<arith::CmpIPredicate::eq>("eq");
289+
builtinGenMap["not"] = [&](std::vector<Expression> const &args,
290+
mlir::Location loc) {
291+
mlir::SmallVector<mlir::Value, 1> resVals;
292+
mlirgen::BuilderExt bExt(b, loc);
293+
resVals.push_back(b.create<mlir::arith::XOrIOp>(loc, genDefTyExpr(args[0]),
294+
bExt.genI256Const(-1)));
295+
return resVals;
296+
};
286297
builtinGenMap["iszero"] = [&](std::vector<Expression> const &args,
287298
mlir::Location loc) {
288299
mlir::SmallVector<mlir::Value, 2> resVals;

test/lit/mlirCodegen/yul/cmp.yul

Lines changed: 369 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,369 @@
1+
// RUN: solc --strict-assembly --mlir-action=print-init --mmlir --mlir-print-debuginfo --mlir-target=eravm %s | FileCheck %s
2+
3+
object "Test" {
4+
code {
5+
let a := mload(32)
6+
let b := mload(64)
7+
if lt(a, b) {
8+
mstore(0, 0)
9+
}
10+
mstore(0, lt(a, b))
11+
if slt(a, b) {
12+
mstore(0, 0)
13+
}
14+
mstore(0, slt(a, b))
15+
if iszero(a) {
16+
mstore(1, 0)
17+
}
18+
mstore(1, iszero(a))
19+
return(0, 0)
20+
}
21+
object "Test_deployed" {
22+
code {
23+
let a := mload(32)
24+
let b := mload(64)
25+
if lt(a, b) {
26+
mstore(0, 0)
27+
}
28+
mstore(0, lt(a, b))
29+
if slt(a, b) {
30+
mstore(0, 0)
31+
}
32+
mstore(0, slt(a, b))
33+
if iszero(a) {
34+
mstore(1, 0)
35+
}
36+
37+
if gt(a, b) {
38+
mstore(7, 0)
39+
}
40+
mstore(0, gt(a, b))
41+
if sgt(a, b) {
42+
mstore(96, 0)
43+
}
44+
mstore(128, sgt(b, a))
45+
mstore(96, eq(a, b))
46+
if eq(a, 33) {
47+
mstore(3, 0)
48+
}
49+
mstore(16, not(a))
50+
mstore(1, iszero(a))
51+
return(0, 0)
52+
}
53+
}
54+
}
55+
// NOTE: Assertions have been autogenerated by test/updFileCheckTest.py
56+
// CHECK: #Prague = #sol<EvmVersion Prague>
57+
// CHECK-NEXT: module attributes {sol.evm_version = #Prague} {
58+
// CHECK-NEXT: yul.object @Test {
59+
// CHECK-NEXT: %c32_i256 = arith.constant 32 : i256 loc(#loc1)
60+
// CHECK-NEXT: %0 = yul.mload %c32_i256 loc(#loc2)
61+
// CHECK-NEXT: %c1_i256 = arith.constant 1 : i256 loc(#loc3)
62+
// CHECK-NEXT: %1 = llvm.alloca %c1_i256 x i256 {alignment = 32 : i64} : (i256) -> !llvm.ptr loc(#loc4)
63+
// CHECK-NEXT: llvm.store %0, %1 {alignment = 32 : i64} : i256, !llvm.ptr loc(#loc3)
64+
// CHECK-NEXT: %c64_i256 = arith.constant 64 : i256 loc(#loc5)
65+
// CHECK-NEXT: %2 = yul.mload %c64_i256 loc(#loc6)
66+
// CHECK-NEXT: %c1_i256_0 = arith.constant 1 : i256 loc(#loc7)
67+
// CHECK-NEXT: %3 = llvm.alloca %c1_i256_0 x i256 {alignment = 32 : i64} : (i256) -> !llvm.ptr loc(#loc8)
68+
// CHECK-NEXT: llvm.store %2, %3 {alignment = 32 : i64} : i256, !llvm.ptr loc(#loc7)
69+
// CHECK-NEXT: %4 = llvm.load %1 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc9)
70+
// CHECK-NEXT: %5 = llvm.load %3 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc10)
71+
// CHECK-NEXT: %6 = arith.cmpi ult, %4, %5 : i256 loc(#loc11)
72+
// CHECK-NEXT: sol.if %6 {
73+
// CHECK-NEXT: %c0_i256_7 = arith.constant 0 : i256 loc(#loc13)
74+
// CHECK-NEXT: %c0_i256_8 = arith.constant 0 : i256 loc(#loc14)
75+
// CHECK-NEXT: yul.mstore %c0_i256_7, %c0_i256_8 loc(#loc15)
76+
// CHECK-NEXT: sol.yield loc(#loc12)
77+
// CHECK-NEXT: } else {
78+
// CHECK-NEXT: } loc(#loc12)
79+
// CHECK-NEXT: %c0_i256 = arith.constant 0 : i256 loc(#loc16)
80+
// CHECK-NEXT: %7 = llvm.load %1 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc17)
81+
// CHECK-NEXT: %8 = llvm.load %3 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc18)
82+
// CHECK-NEXT: %9 = arith.cmpi ult, %7, %8 : i256 loc(#loc19)
83+
// CHECK-NEXT: %10 = arith.extui %9 : i1 to i256 loc(#loc19)
84+
// CHECK-NEXT: yul.mstore %c0_i256, %10 loc(#loc20)
85+
// CHECK-NEXT: %11 = llvm.load %1 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc21)
86+
// CHECK-NEXT: %12 = llvm.load %3 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc22)
87+
// CHECK-NEXT: %13 = arith.cmpi slt, %11, %12 : i256 loc(#loc23)
88+
// CHECK-NEXT: sol.if %13 {
89+
// CHECK-NEXT: %c0_i256_7 = arith.constant 0 : i256 loc(#loc25)
90+
// CHECK-NEXT: %c0_i256_8 = arith.constant 0 : i256 loc(#loc26)
91+
// CHECK-NEXT: yul.mstore %c0_i256_7, %c0_i256_8 loc(#loc27)
92+
// CHECK-NEXT: sol.yield loc(#loc24)
93+
// CHECK-NEXT: } else {
94+
// CHECK-NEXT: } loc(#loc24)
95+
// CHECK-NEXT: %c0_i256_1 = arith.constant 0 : i256 loc(#loc28)
96+
// CHECK-NEXT: %14 = llvm.load %1 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc29)
97+
// CHECK-NEXT: %15 = llvm.load %3 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc30)
98+
// CHECK-NEXT: %16 = arith.cmpi slt, %14, %15 : i256 loc(#loc31)
99+
// CHECK-NEXT: %17 = arith.extui %16 : i1 to i256 loc(#loc31)
100+
// CHECK-NEXT: yul.mstore %c0_i256_1, %17 loc(#loc32)
101+
// CHECK-NEXT: %18 = llvm.load %1 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc33)
102+
// CHECK-NEXT: %c0_i256_2 = arith.constant 0 : i256 loc(#loc34)
103+
// CHECK-NEXT: %19 = arith.cmpi eq, %18, %c0_i256_2 : i256 loc(#loc34)
104+
// CHECK-NEXT: sol.if %19 {
105+
// CHECK-NEXT: %c1_i256_7 = arith.constant 1 : i256 loc(#loc36)
106+
// CHECK-NEXT: %c0_i256_8 = arith.constant 0 : i256 loc(#loc37)
107+
// CHECK-NEXT: yul.mstore %c1_i256_7, %c0_i256_8 loc(#loc38)
108+
// CHECK-NEXT: sol.yield loc(#loc35)
109+
// CHECK-NEXT: } else {
110+
// CHECK-NEXT: } loc(#loc35)
111+
// CHECK-NEXT: %c1_i256_3 = arith.constant 1 : i256 loc(#loc39)
112+
// CHECK-NEXT: %20 = llvm.load %1 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc40)
113+
// CHECK-NEXT: %c0_i256_4 = arith.constant 0 : i256 loc(#loc41)
114+
// CHECK-NEXT: %21 = arith.cmpi eq, %20, %c0_i256_4 : i256 loc(#loc41)
115+
// CHECK-NEXT: %22 = arith.extui %21 : i1 to i256 loc(#loc41)
116+
// CHECK-NEXT: yul.mstore %c1_i256_3, %22 loc(#loc42)
117+
// CHECK-NEXT: %c0_i256_5 = arith.constant 0 : i256 loc(#loc43)
118+
// CHECK-NEXT: %c0_i256_6 = arith.constant 0 : i256 loc(#loc44)
119+
// CHECK-NEXT: yul.return %c0_i256_5, %c0_i256_6 loc(#loc45)
120+
// CHECK-NEXT: yul.object @Test_deployed {
121+
// CHECK-NEXT: %c32_i256_7 = arith.constant 32 : i256 loc(#loc46)
122+
// CHECK-NEXT: %23 = yul.mload %c32_i256_7 loc(#loc47)
123+
// CHECK-NEXT: %c1_i256_8 = arith.constant 1 : i256 loc(#loc48)
124+
// CHECK-NEXT: %24 = llvm.alloca %c1_i256_8 x i256 {alignment = 32 : i64} : (i256) -> !llvm.ptr loc(#loc49)
125+
// CHECK-NEXT: llvm.store %23, %24 {alignment = 32 : i64} : i256, !llvm.ptr loc(#loc48)
126+
// CHECK-NEXT: %c64_i256_9 = arith.constant 64 : i256 loc(#loc50)
127+
// CHECK-NEXT: %25 = yul.mload %c64_i256_9 loc(#loc51)
128+
// CHECK-NEXT: %c1_i256_10 = arith.constant 1 : i256 loc(#loc52)
129+
// CHECK-NEXT: %26 = llvm.alloca %c1_i256_10 x i256 {alignment = 32 : i64} : (i256) -> !llvm.ptr loc(#loc53)
130+
// CHECK-NEXT: llvm.store %25, %26 {alignment = 32 : i64} : i256, !llvm.ptr loc(#loc52)
131+
// CHECK-NEXT: %27 = llvm.load %24 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc54)
132+
// CHECK-NEXT: %28 = llvm.load %26 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc55)
133+
// CHECK-NEXT: %29 = arith.cmpi ult, %27, %28 : i256 loc(#loc56)
134+
// CHECK-NEXT: sol.if %29 {
135+
// CHECK-NEXT: %c0_i256_19 = arith.constant 0 : i256 loc(#loc58)
136+
// CHECK-NEXT: %c0_i256_20 = arith.constant 0 : i256 loc(#loc59)
137+
// CHECK-NEXT: yul.mstore %c0_i256_19, %c0_i256_20 loc(#loc60)
138+
// CHECK-NEXT: sol.yield loc(#loc57)
139+
// CHECK-NEXT: } else {
140+
// CHECK-NEXT: } loc(#loc57)
141+
// CHECK-NEXT: %c0_i256_11 = arith.constant 0 : i256 loc(#loc61)
142+
// CHECK-NEXT: %30 = llvm.load %24 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc62)
143+
// CHECK-NEXT: %31 = llvm.load %26 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc63)
144+
// CHECK-NEXT: %32 = arith.cmpi ult, %30, %31 : i256 loc(#loc64)
145+
// CHECK-NEXT: %33 = arith.extui %32 : i1 to i256 loc(#loc64)
146+
// CHECK-NEXT: yul.mstore %c0_i256_11, %33 loc(#loc65)
147+
// CHECK-NEXT: %34 = llvm.load %24 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc66)
148+
// CHECK-NEXT: %35 = llvm.load %26 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc67)
149+
// CHECK-NEXT: %36 = arith.cmpi slt, %34, %35 : i256 loc(#loc68)
150+
// CHECK-NEXT: sol.if %36 {
151+
// CHECK-NEXT: %c0_i256_19 = arith.constant 0 : i256 loc(#loc70)
152+
// CHECK-NEXT: %c0_i256_20 = arith.constant 0 : i256 loc(#loc71)
153+
// CHECK-NEXT: yul.mstore %c0_i256_19, %c0_i256_20 loc(#loc72)
154+
// CHECK-NEXT: sol.yield loc(#loc69)
155+
// CHECK-NEXT: } else {
156+
// CHECK-NEXT: } loc(#loc69)
157+
// CHECK-NEXT: %c0_i256_12 = arith.constant 0 : i256 loc(#loc73)
158+
// CHECK-NEXT: %37 = llvm.load %24 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc74)
159+
// CHECK-NEXT: %38 = llvm.load %26 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc75)
160+
// CHECK-NEXT: %39 = arith.cmpi slt, %37, %38 : i256 loc(#loc76)
161+
// CHECK-NEXT: %40 = arith.extui %39 : i1 to i256 loc(#loc76)
162+
// CHECK-NEXT: yul.mstore %c0_i256_12, %40 loc(#loc77)
163+
// CHECK-NEXT: %41 = llvm.load %24 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc78)
164+
// CHECK-NEXT: %c0_i256_13 = arith.constant 0 : i256 loc(#loc79)
165+
// CHECK-NEXT: %42 = arith.cmpi eq, %41, %c0_i256_13 : i256 loc(#loc79)
166+
// CHECK-NEXT: sol.if %42 {
167+
// CHECK-NEXT: %c1_i256_19 = arith.constant 1 : i256 loc(#loc81)
168+
// CHECK-NEXT: %c0_i256_20 = arith.constant 0 : i256 loc(#loc82)
169+
// CHECK-NEXT: yul.mstore %c1_i256_19, %c0_i256_20 loc(#loc83)
170+
// CHECK-NEXT: sol.yield loc(#loc80)
171+
// CHECK-NEXT: } else {
172+
// CHECK-NEXT: } loc(#loc80)
173+
// CHECK-NEXT: %43 = llvm.load %24 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc84)
174+
// CHECK-NEXT: %44 = llvm.load %26 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc85)
175+
// CHECK-NEXT: %45 = arith.cmpi ugt, %43, %44 : i256 loc(#loc86)
176+
// CHECK-NEXT: sol.if %45 {
177+
// CHECK-NEXT: %c7_i256 = arith.constant 7 : i256 loc(#loc88)
178+
// CHECK-NEXT: %c0_i256_19 = arith.constant 0 : i256 loc(#loc89)
179+
// CHECK-NEXT: yul.mstore %c7_i256, %c0_i256_19 loc(#loc90)
180+
// CHECK-NEXT: sol.yield loc(#loc87)
181+
// CHECK-NEXT: } else {
182+
// CHECK-NEXT: } loc(#loc87)
183+
// CHECK-NEXT: %c0_i256_14 = arith.constant 0 : i256 loc(#loc91)
184+
// CHECK-NEXT: %46 = llvm.load %24 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc92)
185+
// CHECK-NEXT: %47 = llvm.load %26 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc93)
186+
// CHECK-NEXT: %48 = arith.cmpi ugt, %46, %47 : i256 loc(#loc94)
187+
// CHECK-NEXT: %49 = arith.extui %48 : i1 to i256 loc(#loc94)
188+
// CHECK-NEXT: yul.mstore %c0_i256_14, %49 loc(#loc95)
189+
// CHECK-NEXT: %50 = llvm.load %24 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc96)
190+
// CHECK-NEXT: %51 = llvm.load %26 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc97)
191+
// CHECK-NEXT: %52 = arith.cmpi sgt, %50, %51 : i256 loc(#loc98)
192+
// CHECK-NEXT: sol.if %52 {
193+
// CHECK-NEXT: %c96_i256_19 = arith.constant 96 : i256 loc(#loc100)
194+
// CHECK-NEXT: %c0_i256_20 = arith.constant 0 : i256 loc(#loc101)
195+
// CHECK-NEXT: yul.mstore %c96_i256_19, %c0_i256_20 loc(#loc102)
196+
// CHECK-NEXT: sol.yield loc(#loc99)
197+
// CHECK-NEXT: } else {
198+
// CHECK-NEXT: } loc(#loc99)
199+
// CHECK-NEXT: %c128_i256 = arith.constant 128 : i256 loc(#loc103)
200+
// CHECK-NEXT: %53 = llvm.load %26 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc104)
201+
// CHECK-NEXT: %54 = llvm.load %24 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc105)
202+
// CHECK-NEXT: %55 = arith.cmpi sgt, %53, %54 : i256 loc(#loc106)
203+
// CHECK-NEXT: %56 = arith.extui %55 : i1 to i256 loc(#loc106)
204+
// CHECK-NEXT: yul.mstore %c128_i256, %56 loc(#loc107)
205+
// CHECK-NEXT: %c96_i256 = arith.constant 96 : i256 loc(#loc108)
206+
// CHECK-NEXT: %57 = llvm.load %24 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc109)
207+
// CHECK-NEXT: %58 = llvm.load %26 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc110)
208+
// CHECK-NEXT: %59 = arith.cmpi eq, %57, %58 : i256 loc(#loc111)
209+
// CHECK-NEXT: %60 = arith.extui %59 : i1 to i256 loc(#loc111)
210+
// CHECK-NEXT: yul.mstore %c96_i256, %60 loc(#loc112)
211+
// CHECK-NEXT: %61 = llvm.load %24 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc113)
212+
// CHECK-NEXT: %c33_i256 = arith.constant 33 : i256 loc(#loc114)
213+
// CHECK-NEXT: %62 = arith.cmpi eq, %61, %c33_i256 : i256 loc(#loc115)
214+
// CHECK-NEXT: sol.if %62 {
215+
// CHECK-NEXT: %c3_i256 = arith.constant 3 : i256 loc(#loc117)
216+
// CHECK-NEXT: %c0_i256_19 = arith.constant 0 : i256 loc(#loc118)
217+
// CHECK-NEXT: yul.mstore %c3_i256, %c0_i256_19 loc(#loc119)
218+
// CHECK-NEXT: sol.yield loc(#loc116)
219+
// CHECK-NEXT: } else {
220+
// CHECK-NEXT: } loc(#loc116)
221+
// CHECK-NEXT: %c16_i256 = arith.constant 16 : i256 loc(#loc120)
222+
// CHECK-NEXT: %63 = llvm.load %24 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc121)
223+
// CHECK-NEXT: %c-1_i256 = arith.constant -1 : i256 loc(#loc122)
224+
// CHECK-NEXT: %64 = arith.xori %63, %c-1_i256 : i256 loc(#loc122)
225+
// CHECK-NEXT: yul.mstore %c16_i256, %64 loc(#loc123)
226+
// CHECK-NEXT: %c1_i256_15 = arith.constant 1 : i256 loc(#loc124)
227+
// CHECK-NEXT: %65 = llvm.load %24 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc125)
228+
// CHECK-NEXT: %c0_i256_16 = arith.constant 0 : i256 loc(#loc126)
229+
// CHECK-NEXT: %66 = arith.cmpi eq, %65, %c0_i256_16 : i256 loc(#loc126)
230+
// CHECK-NEXT: %67 = arith.extui %66 : i1 to i256 loc(#loc126)
231+
// CHECK-NEXT: yul.mstore %c1_i256_15, %67 loc(#loc127)
232+
// CHECK-NEXT: %c0_i256_17 = arith.constant 0 : i256 loc(#loc128)
233+
// CHECK-NEXT: %c0_i256_18 = arith.constant 0 : i256 loc(#loc129)
234+
// CHECK-NEXT: yul.return %c0_i256_17, %c0_i256_18 loc(#loc130)
235+
// CHECK-NEXT: } loc(#loc)
236+
// CHECK-NEXT: } loc(#loc)
237+
// CHECK-NEXT: } loc(#loc)
238+
// CHECK-NEXT: #loc = loc(unknown)
239+
// CHECK-NEXT: #loc1 = loc({{.*}}:4:19)
240+
// CHECK-NEXT: #loc2 = loc({{.*}}:4:13)
241+
// CHECK-NEXT: #loc3 = loc({{.*}}:4:4)
242+
// CHECK-NEXT: #loc4 = loc({{.*}}:4:8)
243+
// CHECK-NEXT: #loc5 = loc({{.*}}:5:19)
244+
// CHECK-NEXT: #loc6 = loc({{.*}}:5:13)
245+
// CHECK-NEXT: #loc7 = loc({{.*}}:5:4)
246+
// CHECK-NEXT: #loc8 = loc({{.*}}:5:8)
247+
// CHECK-NEXT: #loc9 = loc({{.*}}:6:10)
248+
// CHECK-NEXT: #loc10 = loc({{.*}}:6:13)
249+
// CHECK-NEXT: #loc11 = loc({{.*}}:6:7)
250+
// CHECK-NEXT: #loc12 = loc({{.*}}:6:4)
251+
// CHECK-NEXT: #loc13 = loc({{.*}}:7:13)
252+
// CHECK-NEXT: #loc14 = loc({{.*}}:7:16)
253+
// CHECK-NEXT: #loc15 = loc({{.*}}:7:6)
254+
// CHECK-NEXT: #loc16 = loc({{.*}}:9:11)
255+
// CHECK-NEXT: #loc17 = loc({{.*}}:9:17)
256+
// CHECK-NEXT: #loc18 = loc({{.*}}:9:20)
257+
// CHECK-NEXT: #loc19 = loc({{.*}}:9:14)
258+
// CHECK-NEXT: #loc20 = loc({{.*}}:9:4)
259+
// CHECK-NEXT: #loc21 = loc({{.*}}:10:11)
260+
// CHECK-NEXT: #loc22 = loc({{.*}}:10:14)
261+
// CHECK-NEXT: #loc23 = loc({{.*}}:10:7)
262+
// CHECK-NEXT: #loc24 = loc({{.*}}:10:4)
263+
// CHECK-NEXT: #loc25 = loc({{.*}}:11:13)
264+
// CHECK-NEXT: #loc26 = loc({{.*}}:11:16)
265+
// CHECK-NEXT: #loc27 = loc({{.*}}:11:6)
266+
// CHECK-NEXT: #loc28 = loc({{.*}}:13:11)
267+
// CHECK-NEXT: #loc29 = loc({{.*}}:13:18)
268+
// CHECK-NEXT: #loc30 = loc({{.*}}:13:21)
269+
// CHECK-NEXT: #loc31 = loc({{.*}}:13:14)
270+
// CHECK-NEXT: #loc32 = loc({{.*}}:13:4)
271+
// CHECK-NEXT: #loc33 = loc({{.*}}:14:14)
272+
// CHECK-NEXT: #loc34 = loc({{.*}}:14:7)
273+
// CHECK-NEXT: #loc35 = loc({{.*}}:14:4)
274+
// CHECK-NEXT: #loc36 = loc({{.*}}:15:13)
275+
// CHECK-NEXT: #loc37 = loc({{.*}}:15:16)
276+
// CHECK-NEXT: #loc38 = loc({{.*}}:15:6)
277+
// CHECK-NEXT: #loc39 = loc({{.*}}:17:11)
278+
// CHECK-NEXT: #loc40 = loc({{.*}}:17:21)
279+
// CHECK-NEXT: #loc41 = loc({{.*}}:17:14)
280+
// CHECK-NEXT: #loc42 = loc({{.*}}:17:4)
281+
// CHECK-NEXT: #loc43 = loc({{.*}}:18:11)
282+
// CHECK-NEXT: #loc44 = loc({{.*}}:18:14)
283+
// CHECK-NEXT: #loc45 = loc({{.*}}:18:4)
284+
// CHECK-NEXT: #loc46 = loc({{.*}}:22:21)
285+
// CHECK-NEXT: #loc47 = loc({{.*}}:22:15)
286+
// CHECK-NEXT: #loc48 = loc({{.*}}:22:6)
287+
// CHECK-NEXT: #loc49 = loc({{.*}}:22:10)
288+
// CHECK-NEXT: #loc50 = loc({{.*}}:23:21)
289+
// CHECK-NEXT: #loc51 = loc({{.*}}:23:15)
290+
// CHECK-NEXT: #loc52 = loc({{.*}}:23:6)
291+
// CHECK-NEXT: #loc53 = loc({{.*}}:23:10)
292+
// CHECK-NEXT: #loc54 = loc({{.*}}:24:12)
293+
// CHECK-NEXT: #loc55 = loc({{.*}}:24:15)
294+
// CHECK-NEXT: #loc56 = loc({{.*}}:24:9)
295+
// CHECK-NEXT: #loc57 = loc({{.*}}:24:6)
296+
// CHECK-NEXT: #loc58 = loc({{.*}}:25:15)
297+
// CHECK-NEXT: #loc59 = loc({{.*}}:25:18)
298+
// CHECK-NEXT: #loc60 = loc({{.*}}:25:8)
299+
// CHECK-NEXT: #loc61 = loc({{.*}}:27:13)
300+
// CHECK-NEXT: #loc62 = loc({{.*}}:27:19)
301+
// CHECK-NEXT: #loc63 = loc({{.*}}:27:22)
302+
// CHECK-NEXT: #loc64 = loc({{.*}}:27:16)
303+
// CHECK-NEXT: #loc65 = loc({{.*}}:27:6)
304+
// CHECK-NEXT: #loc66 = loc({{.*}}:28:13)
305+
// CHECK-NEXT: #loc67 = loc({{.*}}:28:16)
306+
// CHECK-NEXT: #loc68 = loc({{.*}}:28:9)
307+
// CHECK-NEXT: #loc69 = loc({{.*}}:28:6)
308+
// CHECK-NEXT: #loc70 = loc({{.*}}:29:15)
309+
// CHECK-NEXT: #loc71 = loc({{.*}}:29:18)
310+
// CHECK-NEXT: #loc72 = loc({{.*}}:29:8)
311+
// CHECK-NEXT: #loc73 = loc({{.*}}:31:13)
312+
// CHECK-NEXT: #loc74 = loc({{.*}}:31:20)
313+
// CHECK-NEXT: #loc75 = loc({{.*}}:31:23)
314+
// CHECK-NEXT: #loc76 = loc({{.*}}:31:16)
315+
// CHECK-NEXT: #loc77 = loc({{.*}}:31:6)
316+
// CHECK-NEXT: #loc78 = loc({{.*}}:32:16)
317+
// CHECK-NEXT: #loc79 = loc({{.*}}:32:9)
318+
// CHECK-NEXT: #loc80 = loc({{.*}}:32:6)
319+
// CHECK-NEXT: #loc81 = loc({{.*}}:33:15)
320+
// CHECK-NEXT: #loc82 = loc({{.*}}:33:18)
321+
// CHECK-NEXT: #loc83 = loc({{.*}}:33:8)
322+
// CHECK-NEXT: #loc84 = loc({{.*}}:36:12)
323+
// CHECK-NEXT: #loc85 = loc({{.*}}:36:15)
324+
// CHECK-NEXT: #loc86 = loc({{.*}}:36:9)
325+
// CHECK-NEXT: #loc87 = loc({{.*}}:36:6)
326+
// CHECK-NEXT: #loc88 = loc({{.*}}:37:15)
327+
// CHECK-NEXT: #loc89 = loc({{.*}}:37:18)
328+
// CHECK-NEXT: #loc90 = loc({{.*}}:37:8)
329+
// CHECK-NEXT: #loc91 = loc({{.*}}:39:13)
330+
// CHECK-NEXT: #loc92 = loc({{.*}}:39:19)
331+
// CHECK-NEXT: #loc93 = loc({{.*}}:39:22)
332+
// CHECK-NEXT: #loc94 = loc({{.*}}:39:16)
333+
// CHECK-NEXT: #loc95 = loc({{.*}}:39:6)
334+
// CHECK-NEXT: #loc96 = loc({{.*}}:40:13)
335+
// CHECK-NEXT: #loc97 = loc({{.*}}:40:16)
336+
// CHECK-NEXT: #loc98 = loc({{.*}}:40:9)
337+
// CHECK-NEXT: #loc99 = loc({{.*}}:40:6)
338+
// CHECK-NEXT: #loc100 = loc({{.*}}:41:15)
339+
// CHECK-NEXT: #loc101 = loc({{.*}}:41:19)
340+
// CHECK-NEXT: #loc102 = loc({{.*}}:41:8)
341+
// CHECK-NEXT: #loc103 = loc({{.*}}:43:13)
342+
// CHECK-NEXT: #loc104 = loc({{.*}}:43:22)
343+
// CHECK-NEXT: #loc105 = loc({{.*}}:43:25)
344+
// CHECK-NEXT: #loc106 = loc({{.*}}:43:18)
345+
// CHECK-NEXT: #loc107 = loc({{.*}}:43:6)
346+
// CHECK-NEXT: #loc108 = loc({{.*}}:44:13)
347+
// CHECK-NEXT: #loc109 = loc({{.*}}:44:20)
348+
// CHECK-NEXT: #loc110 = loc({{.*}}:44:23)
349+
// CHECK-NEXT: #loc111 = loc({{.*}}:44:17)
350+
// CHECK-NEXT: #loc112 = loc({{.*}}:44:6)
351+
// CHECK-NEXT: #loc113 = loc({{.*}}:45:12)
352+
// CHECK-NEXT: #loc114 = loc({{.*}}:45:15)
353+
// CHECK-NEXT: #loc115 = loc({{.*}}:45:9)
354+
// CHECK-NEXT: #loc116 = loc({{.*}}:45:6)
355+
// CHECK-NEXT: #loc117 = loc({{.*}}:46:15)
356+
// CHECK-NEXT: #loc118 = loc({{.*}}:46:18)
357+
// CHECK-NEXT: #loc119 = loc({{.*}}:46:8)
358+
// CHECK-NEXT: #loc120 = loc({{.*}}:48:13)
359+
// CHECK-NEXT: #loc121 = loc({{.*}}:48:21)
360+
// CHECK-NEXT: #loc122 = loc({{.*}}:48:17)
361+
// CHECK-NEXT: #loc123 = loc({{.*}}:48:6)
362+
// CHECK-NEXT: #loc124 = loc({{.*}}:49:13)
363+
// CHECK-NEXT: #loc125 = loc({{.*}}:49:23)
364+
// CHECK-NEXT: #loc126 = loc({{.*}}:49:16)
365+
// CHECK-NEXT: #loc127 = loc({{.*}}:49:6)
366+
// CHECK-NEXT: #loc128 = loc({{.*}}:50:13)
367+
// CHECK-NEXT: #loc129 = loc({{.*}}:50:16)
368+
// CHECK-NEXT: #loc130 = loc({{.*}}:50:6)
369+
// CHECK-EMPTY:

0 commit comments

Comments
 (0)