|
| 1 | +// RUN: solc --strict-assembly --mlir-action=print-std-mlir --mlir-target=evm --mmlir --mlir-print-debuginfo %s | FileCheck %s |
| 2 | + |
| 3 | +object "Test" { |
| 4 | + code { |
| 5 | + let x := mload(0) |
| 6 | + let y := mload(32) |
| 7 | + let m := mload(64) |
| 8 | + mstore(0, addmod(x, y, m)) |
| 9 | + mstore(32, mulmod(x, y, m)) |
| 10 | + return(0, 64) |
| 11 | + } |
| 12 | +} |
| 13 | +// NOTE: Assertions have been autogenerated by test/updFileCheckTest.py |
| 14 | +// CHECK: #Prague = #sol<EvmVersion Prague> |
| 15 | +// CHECK-NEXT: module @Test attributes {sol.evm_version = #Prague} { |
| 16 | +// CHECK-NEXT: func.func @".unreachable"() attributes {llvm.linkage = #llvm.linkage<private>, passthrough = ["nofree", "null_pointer_is_valid"]} { |
| 17 | +// CHECK-NEXT: llvm.unreachable loc(#loc1) |
| 18 | +// CHECK-NEXT: } loc(#loc) |
| 19 | +// CHECK-NEXT: func.func @__entry() attributes {llvm.linkage = #llvm.linkage<external>, passthrough = ["nofree", "null_pointer_is_valid"]} { |
| 20 | +// CHECK-NEXT: %c64_i256 = arith.constant 64 : i256 loc(#loc) |
| 21 | +// CHECK-NEXT: %c32_i256 = arith.constant 32 : i256 loc(#loc) |
| 22 | +// CHECK-NEXT: %c1_i256 = arith.constant 1 : i256 loc(#loc) |
| 23 | +// CHECK-NEXT: %c0_i256 = arith.constant 0 : i256 loc(#loc) |
| 24 | +// CHECK-NEXT: %0 = llvm.inttoptr %c0_i256 : i256 to !llvm.ptr<1> loc(#loc2) |
| 25 | +// CHECK-NEXT: %1 = llvm.load %0 {alignment = 1 : i64} : !llvm.ptr<1> -> i256 loc(#loc2) |
| 26 | +// CHECK-NEXT: %2 = llvm.alloca %c1_i256 x i256 {alignment = 32 : i64} : (i256) -> !llvm.ptr loc(#loc3) |
| 27 | +// CHECK-NEXT: llvm.store %1, %2 {alignment = 32 : i64} : i256, !llvm.ptr loc(#loc4) |
| 28 | +// CHECK-NEXT: %3 = llvm.inttoptr %c32_i256 : i256 to !llvm.ptr<1> loc(#loc5) |
| 29 | +// CHECK-NEXT: %4 = llvm.load %3 {alignment = 1 : i64} : !llvm.ptr<1> -> i256 loc(#loc5) |
| 30 | +// CHECK-NEXT: %5 = llvm.alloca %c1_i256 x i256 {alignment = 32 : i64} : (i256) -> !llvm.ptr loc(#loc6) |
| 31 | +// CHECK-NEXT: llvm.store %4, %5 {alignment = 32 : i64} : i256, !llvm.ptr loc(#loc7) |
| 32 | +// CHECK-NEXT: %6 = llvm.inttoptr %c64_i256 : i256 to !llvm.ptr<1> loc(#loc8) |
| 33 | +// CHECK-NEXT: %7 = llvm.load %6 {alignment = 1 : i64} : !llvm.ptr<1> -> i256 loc(#loc8) |
| 34 | +// CHECK-NEXT: %8 = llvm.alloca %c1_i256 x i256 {alignment = 32 : i64} : (i256) -> !llvm.ptr loc(#loc9) |
| 35 | +// CHECK-NEXT: llvm.store %7, %8 {alignment = 32 : i64} : i256, !llvm.ptr loc(#loc10) |
| 36 | +// CHECK-NEXT: %9 = llvm.load %2 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc11) |
| 37 | +// CHECK-NEXT: %10 = llvm.load %5 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc12) |
| 38 | +// CHECK-NEXT: %11 = llvm.load %8 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc13) |
| 39 | +// CHECK-NEXT: %12 = "llvm.intrcall"(%9, %10, %11) <{id = 3684 : i32, name = "evm.addmod"}> : (i256, i256, i256) -> i256 loc(#loc14) |
| 40 | +// CHECK-NEXT: %13 = llvm.inttoptr %c0_i256 : i256 to !llvm.ptr<1> loc(#loc15) |
| 41 | +// CHECK-NEXT: llvm.store %12, %13 {alignment = 1 : i64} : i256, !llvm.ptr<1> loc(#loc15) |
| 42 | +// CHECK-NEXT: %14 = llvm.load %2 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc16) |
| 43 | +// CHECK-NEXT: %15 = llvm.load %5 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc17) |
| 44 | +// CHECK-NEXT: %16 = llvm.load %8 {alignment = 32 : i64} : !llvm.ptr -> i256 loc(#loc18) |
| 45 | +// CHECK-NEXT: %17 = "llvm.intrcall"(%14, %15, %16) <{id = 3730 : i32, name = "evm.mulmod"}> : (i256, i256, i256) -> i256 loc(#loc19) |
| 46 | +// CHECK-NEXT: %18 = llvm.inttoptr %c32_i256 : i256 to !llvm.ptr<1> loc(#loc20) |
| 47 | +// CHECK-NEXT: llvm.store %17, %18 {alignment = 1 : i64} : i256, !llvm.ptr<1> loc(#loc20) |
| 48 | +// CHECK-NEXT: %19 = llvm.inttoptr %c0_i256 : i256 to !llvm.ptr<1> loc(#loc1) |
| 49 | +// CHECK-NEXT: "llvm.intrcall"(%19, %c64_i256) <{id = 3735 : i32, name = "evm.return"}> : (!llvm.ptr<1>, i256) -> () loc(#loc1) |
| 50 | +// CHECK-NEXT: call @".unreachable"() : () -> () loc(#loc1) |
| 51 | +// CHECK-NEXT: llvm.unreachable loc(#loc) |
| 52 | +// CHECK-NEXT: } loc(#loc) |
| 53 | +// CHECK-NEXT: } loc(#loc) |
| 54 | +// CHECK-NEXT: #loc = loc(unknown) |
| 55 | +// CHECK-NEXT: #loc1 = loc({{.*}}:9:4) |
| 56 | +// CHECK-NEXT: #loc2 = loc({{.*}}:4:13) |
| 57 | +// CHECK-NEXT: #loc3 = loc({{.*}}:4:8) |
| 58 | +// CHECK-NEXT: #loc4 = loc({{.*}}:4:4) |
| 59 | +// CHECK-NEXT: #loc5 = loc({{.*}}:5:13) |
| 60 | +// CHECK-NEXT: #loc6 = loc({{.*}}:5:8) |
| 61 | +// CHECK-NEXT: #loc7 = loc({{.*}}:5:4) |
| 62 | +// CHECK-NEXT: #loc8 = loc({{.*}}:6:13) |
| 63 | +// CHECK-NEXT: #loc9 = loc({{.*}}:6:8) |
| 64 | +// CHECK-NEXT: #loc10 = loc({{.*}}:6:4) |
| 65 | +// CHECK-NEXT: #loc11 = loc({{.*}}:7:21) |
| 66 | +// CHECK-NEXT: #loc12 = loc({{.*}}:7:24) |
| 67 | +// CHECK-NEXT: #loc13 = loc({{.*}}:7:27) |
| 68 | +// CHECK-NEXT: #loc14 = loc({{.*}}:7:14) |
| 69 | +// CHECK-NEXT: #loc15 = loc({{.*}}:7:4) |
| 70 | +// CHECK-NEXT: #loc16 = loc({{.*}}:8:22) |
| 71 | +// CHECK-NEXT: #loc17 = loc({{.*}}:8:25) |
| 72 | +// CHECK-NEXT: #loc18 = loc({{.*}}:8:28) |
| 73 | +// CHECK-NEXT: #loc19 = loc({{.*}}:8:15) |
| 74 | +// CHECK-NEXT: #loc20 = loc({{.*}}:8:4) |
| 75 | +// CHECK-EMPTY: |
0 commit comments