|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| 2 | +; RUN: opt -aa-pipeline=default -passes=dse -S < %s | FileCheck %s |
| 3 | +target datalayout = "E-p:256:256-i256:256:256-S256-a:256:256" |
| 4 | +target triple = "evm-unknown-unknown" |
| 5 | + |
| 6 | +declare i256 @llvm.evm.callvalue() |
| 7 | +declare i256 @llvm.evm.calldatasize() |
| 8 | +declare void @llvm.evm.return(ptr addrspace(1) readonly, i256) |
| 9 | +declare void @llvm.evm.revert(ptr addrspace(1) readonly, i256) |
| 10 | + |
| 11 | +; Check that DSE eliminates the initialization of unused free memory pointer: |
| 12 | +; store i256 128, ptr addrspace(1) inttoptr (i256 64 to ptr addrspace(1)), align 64 |
| 13 | + |
| 14 | +define void @remove_free_ptr() noreturn { |
| 15 | +; CHECK-LABEL: define void @remove_free_ptr( |
| 16 | +; CHECK-SAME: ) #[[ATTR2:[0-9]+]] { |
| 17 | +; CHECK-NEXT: [[TRY:.*:]] |
| 18 | +; CHECK-NEXT: [[CALLVALUE_I:%.*]] = tail call i256 @llvm.evm.callvalue() |
| 19 | +; CHECK-NEXT: [[COMPARISON_RESULT_I:%.*]] = icmp eq i256 [[CALLVALUE_I]], 0 |
| 20 | +; CHECK-NEXT: br i1 [[COMPARISON_RESULT_I]], label %"block_rt_1/0.i", label %"block_rt_2/0.i" |
| 21 | +; CHECK: "block_rt_1/0.i": |
| 22 | +; CHECK-NEXT: [[CALLDATASIZE_I:%.*]] = tail call i256 @llvm.evm.calldatasize() |
| 23 | +; CHECK-NEXT: [[COMPARISON_RESULT7_I:%.*]] = icmp ult i256 [[CALLDATASIZE_I]], 4 |
| 24 | +; CHECK-NEXT: br i1 [[COMPARISON_RESULT7_I]], label %"block_rt_2/0.i", label %[[SHIFT_RIGHT_NON_OVERFLOW_I:.*]] |
| 25 | +; CHECK: "block_rt_2/0.i": |
| 26 | +; CHECK-NEXT: tail call void @llvm.evm.revert(ptr addrspace(1) noalias nocapture nofree noundef nonnull align 32 null, i256 0) |
| 27 | +; CHECK-NEXT: unreachable |
| 28 | +; CHECK: "block_rt_3/0.i": |
| 29 | +; CHECK-NEXT: store i256 42, ptr addrspace(1) inttoptr (i256 128 to ptr addrspace(1)), align 128 |
| 30 | +; CHECK-NEXT: tail call void @llvm.evm.return(ptr addrspace(1) noalias nocapture nofree noundef nonnull align 32 inttoptr (i256 128 to ptr addrspace(1)), i256 32) |
| 31 | +; CHECK-NEXT: unreachable |
| 32 | +; CHECK: "block_rt_4/0.i": |
| 33 | +; CHECK-NEXT: store i256 99, ptr addrspace(1) inttoptr (i256 128 to ptr addrspace(1)), align 128 |
| 34 | +; CHECK-NEXT: tail call void @llvm.evm.return(ptr addrspace(1) noalias nocapture nofree noundef nonnull align 32 inttoptr (i256 128 to ptr addrspace(1)), i256 32) |
| 35 | +; CHECK-NEXT: unreachable |
| 36 | +; CHECK: [[SHIFT_RIGHT_NON_OVERFLOW_I]]: |
| 37 | +; CHECK-NEXT: [[CALLDATA_LOAD_RESULT_I:%.*]] = load i256, ptr addrspace(2) null, align 4294967296 |
| 38 | +; CHECK-NEXT: [[SHIFT_RIGHT_NON_OVERFLOW_RESULT_I:%.*]] = lshr i256 [[CALLDATA_LOAD_RESULT_I]], 224 |
| 39 | +; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw i256 [[SHIFT_RIGHT_NON_OVERFLOW_RESULT_I]] to i32 |
| 40 | +; CHECK-NEXT: switch i32 [[TRUNC]], label %"block_rt_2/0.i" [ |
| 41 | +; CHECK-NEXT: i32 1039457780, label %"block_rt_3/0.i" |
| 42 | +; CHECK-NEXT: i32 1519042605, label %"block_rt_4/0.i" |
| 43 | +; CHECK-NEXT: ] |
| 44 | +; |
| 45 | +try: |
| 46 | + store i256 128, ptr addrspace(1) inttoptr (i256 64 to ptr addrspace(1)), align 64 |
| 47 | + %callvalue.i = tail call i256 @llvm.evm.callvalue() |
| 48 | + %comparison_result.i = icmp eq i256 %callvalue.i, 0 |
| 49 | + br i1 %comparison_result.i, label %"block_rt_1/0.i", label %"block_rt_2/0.i" |
| 50 | + |
| 51 | +"block_rt_1/0.i": |
| 52 | + %calldatasize.i = tail call i256 @llvm.evm.calldatasize() |
| 53 | + %comparison_result7.i = icmp ult i256 %calldatasize.i, 4 |
| 54 | + br i1 %comparison_result7.i, label %"block_rt_2/0.i", label %shift_right_non_overflow.i |
| 55 | + |
| 56 | +"block_rt_2/0.i": |
| 57 | + tail call void @llvm.evm.revert(ptr addrspace(1) noalias nocapture nofree noundef nonnull align 32 null, i256 0) |
| 58 | + unreachable |
| 59 | + |
| 60 | +"block_rt_3/0.i": |
| 61 | + store i256 42, ptr addrspace(1) inttoptr (i256 128 to ptr addrspace(1)), align 128 |
| 62 | + tail call void @llvm.evm.return(ptr addrspace(1) noalias nocapture nofree noundef nonnull align 32 inttoptr (i256 128 to ptr addrspace(1)), i256 32) |
| 63 | + unreachable |
| 64 | + |
| 65 | +"block_rt_4/0.i": |
| 66 | + store i256 99, ptr addrspace(1) inttoptr (i256 128 to ptr addrspace(1)), align 128 |
| 67 | + tail call void @llvm.evm.return(ptr addrspace(1) noalias nocapture nofree noundef nonnull align 32 inttoptr (i256 128 to ptr addrspace(1)), i256 32) |
| 68 | + unreachable |
| 69 | + |
| 70 | +shift_right_non_overflow.i: |
| 71 | + %calldata_load_result.i = load i256, ptr addrspace(2) null, align 4294967296 |
| 72 | + %shift_right_non_overflow_result.i = lshr i256 %calldata_load_result.i, 224 |
| 73 | + %trunc = trunc nuw i256 %shift_right_non_overflow_result.i to i32 |
| 74 | + switch i32 %trunc, label %"block_rt_2/0.i" [ |
| 75 | + i32 1039457780, label %"block_rt_3/0.i" |
| 76 | + i32 1519042605, label %"block_rt_4/0.i" |
| 77 | + ] |
| 78 | +} |
0 commit comments