brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.9 KiB · 37c2f52 Raw
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