454 lines · plain
1// RUN: mlir-opt %s --pass-pipeline="builtin.module(llvm.func(mem2reg))" --split-input-file | FileCheck %s2 3// CHECK-LABEL: llvm.func @basic_memset4// CHECK-SAME: (%[[MEMSET_VALUE:.*]]: i8)5llvm.func @basic_memset(%memset_value: i8) -> i32 {6 %0 = llvm.mlir.constant(1 : i32) : i327 %1 = llvm.alloca %0 x i32 {alignment = 4 : i64} : (i32) -> !llvm.ptr8 %memset_len = llvm.mlir.constant(4 : i32) : i329 "llvm.intr.memset"(%1, %memset_value, %memset_len) <{isVolatile = false}> : (!llvm.ptr, i8, i32) -> ()10 // CHECK-NOT: "llvm.intr.memset"11 // CHECK: %[[VALUE_8:.*]] = llvm.zext %[[MEMSET_VALUE]] : i8 to i3212 // CHECK: %[[C8:.*]] = llvm.mlir.constant(8 : i32) : i3213 // CHECK: %[[SHIFTED_8:.*]] = llvm.shl %[[VALUE_8]], %[[C8]]14 // CHECK: %[[VALUE_16:.*]] = llvm.or %[[VALUE_8]], %[[SHIFTED_8]]15 // CHECK: %[[C16:.*]] = llvm.mlir.constant(16 : i32) : i3216 // CHECK: %[[SHIFTED_16:.*]] = llvm.shl %[[VALUE_16]], %[[C16]]17 // CHECK: %[[VALUE_32:.*]] = llvm.or %[[VALUE_16]], %[[SHIFTED_16]]18 // CHECK-NOT: "llvm.intr.memset"19 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i3220 // CHECK: llvm.return %[[VALUE_32]] : i3221 llvm.return %2 : i3222}23 24// -----25 26// CHECK-LABEL: llvm.func @memset_float27// CHECK-SAME: (%[[MEMSET_VALUE:.*]]: i8)28llvm.func @memset_float(%memset_value: i8) -> f32 {29 %one = llvm.mlir.constant(1 : i32) : i3230 %alloca = llvm.alloca %one x i32 {alignment = 4 : i64} : (i32) -> !llvm.ptr31 %memset_len = llvm.mlir.constant(4 : i32) : i3232 "llvm.intr.memset"(%alloca, %memset_value, %memset_len) <{isVolatile = false}> : (!llvm.ptr, i8, i32) -> ()33 // CHECK-NOT: "llvm.intr.memset"34 // CHECK: %[[VALUE_8:.*]] = llvm.zext %[[MEMSET_VALUE]] : i8 to i3235 // CHECK: %[[C8:.*]] = llvm.mlir.constant(8 : i32) : i3236 // CHECK: %[[SHIFTED_8:.*]] = llvm.shl %[[VALUE_8]], %[[C8]]37 // CHECK: %[[VALUE_16:.*]] = llvm.or %[[VALUE_8]], %[[SHIFTED_8]]38 // CHECK: %[[C16:.*]] = llvm.mlir.constant(16 : i32) : i3239 // CHECK: %[[SHIFTED_16:.*]] = llvm.shl %[[VALUE_16]], %[[C16]]40 // CHECK: %[[VALUE_32:.*]] = llvm.or %[[VALUE_16]], %[[SHIFTED_16]]41 // CHECK: %[[VALUE_FLOAT:.+]] = llvm.bitcast %[[VALUE_32]] : i32 to f3242 // CHECK-NOT: "llvm.intr.memset"43 %load = llvm.load %alloca {alignment = 4 : i64} : !llvm.ptr -> f3244 // CHECK: llvm.return %[[VALUE_FLOAT]] : f3245 llvm.return %load : f3246}47 48// -----49 50// CHECK-LABEL: llvm.func @basic_memset_inline51// CHECK-SAME: (%[[MEMSET_VALUE:.*]]: i8)52llvm.func @basic_memset_inline(%memset_value: i8) -> i32 {53 %0 = llvm.mlir.constant(1 : i32) : i3254 %1 = llvm.alloca %0 x i32 {alignment = 4 : i64} : (i32) -> !llvm.ptr55 "llvm.intr.memset.inline"(%1, %memset_value) <{isVolatile = false, len = 4 : i32}> : (!llvm.ptr, i8) -> ()56 // CHECK-NOT: "llvm.intr.memset.inline"57 // CHECK: %[[VALUE_8:.*]] = llvm.zext %[[MEMSET_VALUE]] : i8 to i3258 // CHECK: %[[C8:.*]] = llvm.mlir.constant(8 : i32) : i3259 // CHECK: %[[SHIFTED_8:.*]] = llvm.shl %[[VALUE_8]], %[[C8]]60 // CHECK: %[[VALUE_16:.*]] = llvm.or %[[VALUE_8]], %[[SHIFTED_8]]61 // CHECK: %[[C16:.*]] = llvm.mlir.constant(16 : i32) : i3262 // CHECK: %[[SHIFTED_16:.*]] = llvm.shl %[[VALUE_16]], %[[C16]]63 // CHECK: %[[VALUE_32:.*]] = llvm.or %[[VALUE_16]], %[[SHIFTED_16]]64 // CHECK-NOT: "llvm.intr.memset.inline"65 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i3266 // CHECK: llvm.return %[[VALUE_32]] : i3267 llvm.return %2 : i3268}69 70// -----71 72// CHECK-LABEL: llvm.func @basic_memset_constant73llvm.func @basic_memset_constant() -> i32 {74 %0 = llvm.mlir.constant(1 : i32) : i3275 %1 = llvm.alloca %0 x i32 {alignment = 4 : i64} : (i32) -> !llvm.ptr76 %memset_value = llvm.mlir.constant(42 : i8) : i877 %memset_len = llvm.mlir.constant(4 : i32) : i3278 "llvm.intr.memset"(%1, %memset_value, %memset_len) <{isVolatile = false}> : (!llvm.ptr, i8, i32) -> ()79 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i3280 // CHECK: %[[CONSTANT_VAL:..*]] = llvm.mlir.constant(707406378 : i32) : i3281 // CHECK: llvm.return %[[CONSTANT_VAL]] : i3282 llvm.return %2 : i3283}84 85// -----86 87// CHECK-LABEL: llvm.func @memset_one_byte_constant88llvm.func @memset_one_byte_constant() -> i8 {89 %one = llvm.mlir.constant(1 : i32) : i3290 %alloca = llvm.alloca %one x i8 : (i32) -> !llvm.ptr91 // CHECK: %{{.+}} = llvm.mlir.constant(42 : i8) : i892 %value = llvm.mlir.constant(42 : i8) : i893 "llvm.intr.memset"(%alloca, %value, %one) <{isVolatile = false}> : (!llvm.ptr, i8, i32) -> ()94 %load = llvm.load %alloca : !llvm.ptr -> i895 // CHECK: %[[CONSTANT_VAL:..*]] = llvm.mlir.constant(42 : i8) : i896 // CHECK: llvm.return %[[CONSTANT_VAL]] : i897 llvm.return %load : i898}99 100// -----101 102// CHECK-LABEL: llvm.func @basic_memset_inline_constant103llvm.func @basic_memset_inline_constant() -> i32 {104 %0 = llvm.mlir.constant(1 : i32) : i32105 %1 = llvm.alloca %0 x i32 {alignment = 4 : i64} : (i32) -> !llvm.ptr106 %memset_value = llvm.mlir.constant(42 : i8) : i8107 "llvm.intr.memset.inline"(%1, %memset_value) <{isVolatile = false, len = 4}> : (!llvm.ptr, i8) -> ()108 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i32109 // CHECK: %[[CONSTANT_VAL:..*]] = llvm.mlir.constant(707406378 : i32) : i32110 // CHECK: llvm.return %[[CONSTANT_VAL]] : i32111 llvm.return %2 : i32112}113 114// -----115 116// CHECK-LABEL: llvm.func @exotic_target_memset117// CHECK-SAME: (%[[MEMSET_VALUE:.*]]: i8)118llvm.func @exotic_target_memset(%memset_value: i8) -> i40 {119 %0 = llvm.mlir.constant(1 : i32) : i32120 %1 = llvm.alloca %0 x i40 {alignment = 4 : i64} : (i32) -> !llvm.ptr121 %memset_len = llvm.mlir.constant(5 : i32) : i32122 "llvm.intr.memset"(%1, %memset_value, %memset_len) <{isVolatile = false}> : (!llvm.ptr, i8, i32) -> ()123 // CHECK-NOT: "llvm.intr.memset"124 // CHECK: %[[VALUE_8:.*]] = llvm.zext %[[MEMSET_VALUE]] : i8 to i40125 // CHECK: %[[C8:.*]] = llvm.mlir.constant(8 : i40) : i40126 // CHECK: %[[SHIFTED_8:.*]] = llvm.shl %[[VALUE_8]], %[[C8]]127 // CHECK: %[[VALUE_16:.*]] = llvm.or %[[VALUE_8]], %[[SHIFTED_8]]128 // CHECK: %[[C16:.*]] = llvm.mlir.constant(16 : i40) : i40129 // CHECK: %[[SHIFTED_16:.*]] = llvm.shl %[[VALUE_16]], %[[C16]]130 // CHECK: %[[VALUE_32:.*]] = llvm.or %[[VALUE_16]], %[[SHIFTED_16]]131 // CHECK: %[[C32:.*]] = llvm.mlir.constant(32 : i40) : i40132 // CHECK: %[[SHIFTED_COMPL:.*]] = llvm.shl %[[VALUE_32]], %[[C32]]133 // CHECK: %[[VALUE_COMPL:.*]] = llvm.or %[[VALUE_32]], %[[SHIFTED_COMPL]]134 // CHECK-NOT: "llvm.intr.memset"135 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i40136 // CHECK: llvm.return %[[VALUE_COMPL]] : i40137 llvm.return %2 : i40138}139 140// -----141 142// CHECK-LABEL: llvm.func @exotic_target_memset_inline143// CHECK-SAME: (%[[MEMSET_VALUE:.*]]: i8)144llvm.func @exotic_target_memset_inline(%memset_value: i8) -> i40 {145 %0 = llvm.mlir.constant(1 : i32) : i32146 %1 = llvm.alloca %0 x i40 {alignment = 4 : i64} : (i32) -> !llvm.ptr147 "llvm.intr.memset.inline"(%1, %memset_value) <{isVolatile = false, len = 5}> : (!llvm.ptr, i8) -> ()148 // CHECK-NOT: "llvm.intr.memset.inline"149 // CHECK: %[[VALUE_8:.*]] = llvm.zext %[[MEMSET_VALUE]] : i8 to i40150 // CHECK: %[[C8:.*]] = llvm.mlir.constant(8 : i40) : i40151 // CHECK: %[[SHIFTED_8:.*]] = llvm.shl %[[VALUE_8]], %[[C8]]152 // CHECK: %[[VALUE_16:.*]] = llvm.or %[[VALUE_8]], %[[SHIFTED_8]]153 // CHECK: %[[C16:.*]] = llvm.mlir.constant(16 : i40) : i40154 // CHECK: %[[SHIFTED_16:.*]] = llvm.shl %[[VALUE_16]], %[[C16]]155 // CHECK: %[[VALUE_32:.*]] = llvm.or %[[VALUE_16]], %[[SHIFTED_16]]156 // CHECK: %[[C32:.*]] = llvm.mlir.constant(32 : i40) : i40157 // CHECK: %[[SHIFTED_COMPL:.*]] = llvm.shl %[[VALUE_32]], %[[C32]]158 // CHECK: %[[VALUE_COMPL:.*]] = llvm.or %[[VALUE_32]], %[[SHIFTED_COMPL]]159 // CHECK-NOT: "llvm.intr.memset.inline"160 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i40161 // CHECK: llvm.return %[[VALUE_COMPL]] : i40162 llvm.return %2 : i40163}164 165// -----166 167// CHECK-LABEL: llvm.func @no_volatile_memset168llvm.func @no_volatile_memset() -> i32 {169 // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32170 // CHECK-DAG: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32171 // CHECK-DAG: %[[MEMSET_VALUE:.*]] = llvm.mlir.constant(42 : i8) : i8172 // CHECK-DAG: %[[MEMSET_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32173 %0 = llvm.mlir.constant(1 : i32) : i32174 %1 = llvm.alloca %0 x i32 {alignment = 4 : i64} : (i32) -> !llvm.ptr175 %memset_value = llvm.mlir.constant(42 : i8) : i8176 %memset_len = llvm.mlir.constant(4 : i32) : i32177 // CHECK: "llvm.intr.memset"(%[[ALLOCA]], %[[MEMSET_VALUE]], %[[MEMSET_LEN]]) <{isVolatile = true}>178 "llvm.intr.memset"(%1, %memset_value, %memset_len) <{isVolatile = true}> : (!llvm.ptr, i8, i32) -> ()179 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i32180 llvm.return %2 : i32181}182 183// -----184 185// CHECK-LABEL: llvm.func @no_volatile_memset_inline186llvm.func @no_volatile_memset_inline() -> i32 {187 // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32188 // CHECK-DAG: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32189 // CHECK-DAG: %[[MEMSET_VALUE:.*]] = llvm.mlir.constant(42 : i8) : i8190 %0 = llvm.mlir.constant(1 : i32) : i32191 %1 = llvm.alloca %0 x i32 {alignment = 4 : i64} : (i32) -> !llvm.ptr192 %memset_value = llvm.mlir.constant(42 : i8) : i8193 // CHECK: "llvm.intr.memset.inline"(%[[ALLOCA]], %[[MEMSET_VALUE]]) <{isVolatile = true, len = 4 : i64}>194 "llvm.intr.memset.inline"(%1, %memset_value) <{isVolatile = true, len = 4}> : (!llvm.ptr, i8) -> ()195 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i32196 llvm.return %2 : i32197}198 199// -----200 201// CHECK-LABEL: llvm.func @no_partial_memset202llvm.func @no_partial_memset() -> i32 {203 // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32204 // CHECK-DAG: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32205 // CHECK-DAG: %[[MEMSET_VALUE:.*]] = llvm.mlir.constant(42 : i8) : i8206 // CHECK-DAG: %[[MEMSET_LEN:.*]] = llvm.mlir.constant(2 : i32) : i32207 %0 = llvm.mlir.constant(1 : i32) : i32208 %1 = llvm.alloca %0 x i32 {alignment = 4 : i64} : (i32) -> !llvm.ptr209 %memset_value = llvm.mlir.constant(42 : i8) : i8210 %memset_len = llvm.mlir.constant(2 : i32) : i32211 // CHECK: "llvm.intr.memset"(%[[ALLOCA]], %[[MEMSET_VALUE]], %[[MEMSET_LEN]]) <{isVolatile = false}>212 "llvm.intr.memset"(%1, %memset_value, %memset_len) <{isVolatile = false}> : (!llvm.ptr, i8, i32) -> ()213 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i32214 llvm.return %2 : i32215}216 217// -----218 219// CHECK-LABEL: llvm.func @no_partial_memset_inline220llvm.func @no_partial_memset_inline() -> i32 {221 // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32222 // CHECK-DAG: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32223 // CHECK-DAG: %[[MEMSET_VALUE:.*]] = llvm.mlir.constant(42 : i8) : i8224 %0 = llvm.mlir.constant(1 : i32) : i32225 %1 = llvm.alloca %0 x i32 {alignment = 4 : i64} : (i32) -> !llvm.ptr226 %memset_value = llvm.mlir.constant(42 : i8) : i8227 // CHECK: "llvm.intr.memset.inline"(%[[ALLOCA]], %[[MEMSET_VALUE]]) <{isVolatile = false, len = 2 : i64}>228 "llvm.intr.memset.inline"(%1, %memset_value) <{isVolatile = false, len = 2}> : (!llvm.ptr, i8) -> ()229 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i32230 llvm.return %2 : i32231}232 233// -----234 235// CHECK-LABEL: llvm.func @no_overflowing_memset236llvm.func @no_overflowing_memset() -> i32 {237 // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32238 // CHECK-DAG: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32239 // CHECK-DAG: %[[MEMSET_VALUE:.*]] = llvm.mlir.constant(42 : i8) : i8240 // CHECK-DAG: %[[MEMSET_LEN:.*]] = llvm.mlir.constant(6 : i32) : i32241 %0 = llvm.mlir.constant(1 : i32) : i32242 %1 = llvm.alloca %0 x i32 {alignment = 4 : i64} : (i32) -> !llvm.ptr243 %memset_value = llvm.mlir.constant(42 : i8) : i8244 %memset_len = llvm.mlir.constant(6 : i32) : i32245 // CHECK: "llvm.intr.memset"(%[[ALLOCA]], %[[MEMSET_VALUE]], %[[MEMSET_LEN]]) <{isVolatile = false}>246 "llvm.intr.memset"(%1, %memset_value, %memset_len) <{isVolatile = false}> : (!llvm.ptr, i8, i32) -> ()247 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i32248 llvm.return %2 : i32249}250 251// -----252 253// CHECK-LABEL: llvm.func @no_overflowing_memset_inline254llvm.func @no_overflowing_memset_inline() -> i32 {255 // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32256 // CHECK-DAG: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32257 // CHECK-DAG: %[[MEMSET_VALUE:.*]] = llvm.mlir.constant(42 : i8) : i8258 %0 = llvm.mlir.constant(1 : i32) : i32259 %1 = llvm.alloca %0 x i32 {alignment = 4 : i64} : (i32) -> !llvm.ptr260 %memset_value = llvm.mlir.constant(42 : i8) : i8261 // CHECK: "llvm.intr.memset.inline"(%[[ALLOCA]], %[[MEMSET_VALUE]]) <{isVolatile = false, len = 6 : i64}>262 "llvm.intr.memset.inline"(%1, %memset_value) <{isVolatile = false, len = 6}> : (!llvm.ptr, i8) -> ()263 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i32264 llvm.return %2 : i32265}266 267// -----268 269// CHECK-LABEL: llvm.func @only_byte_aligned_integers_memset270llvm.func @only_byte_aligned_integers_memset() -> i10 {271 // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32272 // CHECK-DAG: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i10273 // CHECK-DAG: %[[MEMSET_VALUE:.*]] = llvm.mlir.constant(42 : i8) : i8274 // CHECK-DAG: %[[MEMSET_LEN:.*]] = llvm.mlir.constant(2 : i32) : i32275 %0 = llvm.mlir.constant(1 : i32) : i32276 %1 = llvm.alloca %0 x i10 {alignment = 4 : i64} : (i32) -> !llvm.ptr277 %memset_value = llvm.mlir.constant(42 : i8) : i8278 %memset_len = llvm.mlir.constant(2 : i32) : i32279 // CHECK: "llvm.intr.memset"(%[[ALLOCA]], %[[MEMSET_VALUE]], %[[MEMSET_LEN]]) <{isVolatile = false}>280 "llvm.intr.memset"(%1, %memset_value, %memset_len) <{isVolatile = false}> : (!llvm.ptr, i8, i32) -> ()281 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i10282 llvm.return %2 : i10283}284 285// -----286 287// CHECK-LABEL: llvm.func @only_byte_aligned_integers_memset_inline288llvm.func @only_byte_aligned_integers_memset_inline() -> i10 {289 // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32290 // CHECK-DAG: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i10291 // CHECK-DAG: %[[MEMSET_VALUE:.*]] = llvm.mlir.constant(42 : i8) : i8292 %0 = llvm.mlir.constant(1 : i32) : i32293 %1 = llvm.alloca %0 x i10 {alignment = 4 : i64} : (i32) -> !llvm.ptr294 %memset_value = llvm.mlir.constant(42 : i8) : i8295 // CHECK: "llvm.intr.memset.inline"(%[[ALLOCA]], %[[MEMSET_VALUE]]) <{isVolatile = false, len = 2 : i64}>296 "llvm.intr.memset.inline"(%1, %memset_value) <{isVolatile = false, len = 2}> : (!llvm.ptr, i8) -> ()297 %2 = llvm.load %1 {alignment = 4 : i64} : !llvm.ptr -> i10298 llvm.return %2 : i10299}300 301// -----302 303// CHECK-LABEL: llvm.func @basic_memcpy304// CHECK-SAME: (%[[SOURCE:.*]]: !llvm.ptr)305llvm.func @basic_memcpy(%source: !llvm.ptr) -> i32 {306 %0 = llvm.mlir.constant(1 : i32) : i32307 %1 = llvm.alloca %0 x i32 : (i32) -> !llvm.ptr308 %is_volatile = llvm.mlir.constant(false) : i1309 %memcpy_len = llvm.mlir.constant(4 : i32) : i32310 "llvm.intr.memcpy"(%1, %source, %memcpy_len) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i32) -> ()311 // CHECK-NOT: "llvm.intr.memcpy"312 // CHECK: %[[LOADED:.*]] = llvm.load %[[SOURCE]] : !llvm.ptr -> i32313 // CHECK-NOT: "llvm.intr.memcpy"314 %2 = llvm.load %1 : !llvm.ptr -> i32315 // CHECK: llvm.return %[[LOADED]] : i32316 llvm.return %2 : i32317}318 319// -----320 321// CHECK-LABEL: llvm.func @basic_memcpy_dest322// CHECK-SAME: (%[[DESTINATION:.*]]: !llvm.ptr)323llvm.func @basic_memcpy_dest(%destination: !llvm.ptr) -> i32 {324 %0 = llvm.mlir.constant(1 : i32) : i32325 // CHECK: %[[DATA:.*]] = llvm.mlir.constant(42 : i32) : i32326 %data = llvm.mlir.constant(42 : i32) : i32327 %is_volatile = llvm.mlir.constant(false) : i1328 %memcpy_len = llvm.mlir.constant(4 : i32) : i32329 330 %1 = llvm.alloca %0 x i32 : (i32) -> !llvm.ptr331 llvm.store %data, %1 : i32, !llvm.ptr332 "llvm.intr.memcpy"(%destination, %1, %memcpy_len) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i32) -> ()333 // CHECK-NOT: "llvm.intr.memcpy"334 // CHECK: llvm.store %[[DATA]], %[[DESTINATION]] : i32, !llvm.ptr335 // CHECK-NOT: "llvm.intr.memcpy"336 337 %2 = llvm.load %1 : !llvm.ptr -> i32338 // CHECK: llvm.return %[[DATA]] : i32339 llvm.return %2 : i32340}341 342// -----343 344// CHECK-LABEL: llvm.func @double_memcpy345llvm.func @double_memcpy() -> i32 {346 %0 = llvm.mlir.constant(1 : i32) : i32347 // CHECK: %[[DATA:.*]] = llvm.mlir.constant(42 : i32) : i32348 %data = llvm.mlir.constant(42 : i32) : i32349 %is_volatile = llvm.mlir.constant(false) : i1350 %memcpy_len = llvm.mlir.constant(4 : i32) : i32351 352 %1 = llvm.alloca %0 x i32 : (i32) -> !llvm.ptr353 %2 = llvm.alloca %0 x i32 : (i32) -> !llvm.ptr354 llvm.store %data, %1 : i32, !llvm.ptr355 "llvm.intr.memcpy"(%2, %1, %memcpy_len) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i32) -> ()356 357 %res = llvm.load %2 : !llvm.ptr -> i32358 // CHECK: llvm.return %[[DATA]] : i32359 llvm.return %res : i32360}361 362// -----363 364// CHECK-LABEL: llvm.func @ignore_self_memcpy365llvm.func @ignore_self_memcpy() -> i32 {366 // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32367 %0 = llvm.mlir.constant(1 : i32) : i32368 %is_volatile = llvm.mlir.constant(false) : i1369 %memcpy_len = llvm.mlir.constant(4 : i32) : i32370 371 // CHECK-DAG: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32372 %1 = llvm.alloca %0 x i32 : (i32) -> !llvm.ptr373 // CHECK: "llvm.intr.memcpy"(%[[ALLOCA]], %[[ALLOCA]]374 "llvm.intr.memcpy"(%1, %1, %memcpy_len) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i32) -> ()375 376 %res = llvm.load %1 : !llvm.ptr -> i32377 llvm.return %res : i32378}379 380// -----381 382// CHECK-LABEL: llvm.func @ignore_partial_memcpy383// CHECK-SAME: (%[[SOURCE:.*]]: !llvm.ptr)384llvm.func @ignore_partial_memcpy(%source: !llvm.ptr) -> i32 {385 // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32386 %0 = llvm.mlir.constant(1 : i32) : i32387 %is_volatile = llvm.mlir.constant(false) : i1388 // CHECK-DAG: %[[MEMCPY_LEN:.*]] = llvm.mlir.constant(2 : i32) : i32389 %memcpy_len = llvm.mlir.constant(2 : i32) : i32390 391 // CHECK-DAG: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32392 %1 = llvm.alloca %0 x i32 : (i32) -> !llvm.ptr393 // CHECK: "llvm.intr.memcpy"(%[[ALLOCA]], %[[SOURCE]], %[[MEMCPY_LEN]]) <{isVolatile = false}>394 "llvm.intr.memcpy"(%1, %source, %memcpy_len) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i32) -> ()395 396 %res = llvm.load %1 : !llvm.ptr -> i32397 llvm.return %res : i32398}399 400// -----401 402// CHECK-LABEL: llvm.func @ignore_volatile_memcpy403// CHECK-SAME: (%[[SOURCE:.*]]: !llvm.ptr)404llvm.func @ignore_volatile_memcpy(%source: !llvm.ptr) -> i32 {405 // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32406 // CHECK-DAG: %[[MEMCPY_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32407 %0 = llvm.mlir.constant(1 : i32) : i32408 %is_volatile = llvm.mlir.constant(false) : i1409 %memcpy_len = llvm.mlir.constant(4 : i32) : i32410 411 // CHECK-DAG: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32412 %1 = llvm.alloca %0 x i32 : (i32) -> !llvm.ptr413 // CHECK: "llvm.intr.memcpy"(%[[ALLOCA]], %[[SOURCE]], %[[MEMCPY_LEN]]) <{isVolatile = true}>414 "llvm.intr.memcpy"(%1, %source, %memcpy_len) <{isVolatile = true}> : (!llvm.ptr, !llvm.ptr, i32) -> ()415 416 %res = llvm.load %1 : !llvm.ptr -> i32417 llvm.return %res : i32418}419 420// -----421 422// CHECK-LABEL: llvm.func @basic_memmove423// CHECK-SAME: (%[[SOURCE:.*]]: !llvm.ptr)424llvm.func @basic_memmove(%source: !llvm.ptr) -> i32 {425 %0 = llvm.mlir.constant(1 : i32) : i32426 %1 = llvm.alloca %0 x i32 : (i32) -> !llvm.ptr427 %is_volatile = llvm.mlir.constant(false) : i1428 %memmove_len = llvm.mlir.constant(4 : i32) : i32429 "llvm.intr.memmove"(%1, %source, %memmove_len) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i32) -> ()430 // CHECK-NOT: "llvm.intr.memmove"431 // CHECK: %[[LOADED:.*]] = llvm.load %[[SOURCE]] : !llvm.ptr -> i32432 // CHECK-NOT: "llvm.intr.memmove"433 %2 = llvm.load %1 : !llvm.ptr -> i32434 // CHECK: llvm.return %[[LOADED]] : i32435 llvm.return %2 : i32436}437 438// -----439 440// CHECK-LABEL: llvm.func @basic_memcpy_inline441// CHECK-SAME: (%[[SOURCE:.*]]: !llvm.ptr)442llvm.func @basic_memcpy_inline(%source: !llvm.ptr) -> i32 {443 %0 = llvm.mlir.constant(1 : i32) : i32444 %1 = llvm.alloca %0 x i32 : (i32) -> !llvm.ptr445 %is_volatile = llvm.mlir.constant(false) : i1446 "llvm.intr.memcpy.inline"(%1, %source) <{isVolatile = false, len = 4 : i32}> : (!llvm.ptr, !llvm.ptr) -> ()447 // CHECK-NOT: "llvm.intr.memcpy.inline"448 // CHECK: %[[LOADED:.*]] = llvm.load %[[SOURCE]] : !llvm.ptr -> i32449 // CHECK-NOT: "llvm.intr.memcpy.inline"450 %2 = llvm.load %1 : !llvm.ptr -> i32451 // CHECK: llvm.return %[[LOADED]] : i32452 llvm.return %2 : i32453}454