274 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2; RUN: llc -global-isel -mtriple=amdgcn -O0 -stop-after=irtranslator %s -o - | FileCheck %s3 4; Size operand should be the minimum of the two pointer sizes.5 6define void @test_memcpy_p1_p3_i64(ptr addrspace(1) %dst, ptr addrspace(3) %src) {7 ; CHECK-LABEL: name: test_memcpy_p1_p3_i648 ; CHECK: bb.1 (%ir-block.0):9 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr210 ; CHECK-NEXT: {{ $}}11 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr012 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr113 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)14 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p3) = COPY $vgpr215 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 25616 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)17 ; CHECK-NEXT: G_MEMCPY [[MV]](p1), [[COPY2]](p3), [[TRUNC]](s32), 0 :: (store (s8) into %ir.dst, addrspace 1), (load (s8) from %ir.src, addrspace 3)18 ; CHECK-NEXT: SI_RETURN19 call void @llvm.memcpy.p1.p3.i64(ptr addrspace(1) %dst, ptr addrspace(3) %src, i64 256, i1 false)20 ret void21}22 23define void @test_memcpy_p1_p3_i32(ptr addrspace(1) %dst, ptr addrspace(3) %src) {24 ; CHECK-LABEL: name: test_memcpy_p1_p3_i3225 ; CHECK: bb.1 (%ir-block.0):26 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr227 ; CHECK-NEXT: {{ $}}28 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr029 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr130 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)31 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p3) = COPY $vgpr232 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 25633 ; CHECK-NEXT: G_MEMCPY [[MV]](p1), [[COPY2]](p3), [[C]](s32), 0 :: (store (s8) into %ir.dst, addrspace 1), (load (s8) from %ir.src, addrspace 3)34 ; CHECK-NEXT: SI_RETURN35 call void @llvm.memcpy.p1.p3.i32(ptr addrspace(1) %dst, ptr addrspace(3) %src, i32 256, i1 false)36 ret void37}38 39define void @test_memcpy_p1_p3_i16(ptr addrspace(1) %dst, ptr addrspace(3) %src) {40 ; CHECK-LABEL: name: test_memcpy_p1_p3_i1641 ; CHECK: bb.1 (%ir-block.0):42 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr243 ; CHECK-NEXT: {{ $}}44 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr045 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr146 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)47 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p3) = COPY $vgpr248 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 25649 ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[C]](s16)50 ; CHECK-NEXT: G_MEMCPY [[MV]](p1), [[COPY2]](p3), [[ZEXT]](s32), 0 :: (store (s8) into %ir.dst, addrspace 1), (load (s8) from %ir.src, addrspace 3)51 ; CHECK-NEXT: SI_RETURN52 call void @llvm.memcpy.p1.p3.i16(ptr addrspace(1) %dst, ptr addrspace(3) %src, i16 256, i1 false)53 ret void54}55 56define void @test_memcpy_p3_p1_i64(ptr addrspace(3) %dst, ptr addrspace(1) %src) {57 ; CHECK-LABEL: name: test_memcpy_p3_p1_i6458 ; CHECK: bb.1 (%ir-block.0):59 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr260 ; CHECK-NEXT: {{ $}}61 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p3) = COPY $vgpr062 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr163 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr264 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)65 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 25666 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)67 ; CHECK-NEXT: G_MEMCPY [[COPY]](p3), [[MV]](p1), [[TRUNC]](s32), 0 :: (store (s8) into %ir.dst, addrspace 3), (load (s8) from %ir.src, addrspace 1)68 ; CHECK-NEXT: SI_RETURN69 call void @llvm.memcpy.p3.p1.i64(ptr addrspace(3) %dst, ptr addrspace(1) %src, i64 256, i1 false)70 ret void71}72 73define void @test_memcpy_p3_p1_i32(ptr addrspace(3) %dst, ptr addrspace(1) %src) {74 ; CHECK-LABEL: name: test_memcpy_p3_p1_i3275 ; CHECK: bb.1 (%ir-block.0):76 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr277 ; CHECK-NEXT: {{ $}}78 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p3) = COPY $vgpr079 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr180 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr281 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)82 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 25683 ; CHECK-NEXT: G_MEMCPY [[COPY]](p3), [[MV]](p1), [[C]](s32), 0 :: (store (s8) into %ir.dst, addrspace 3), (load (s8) from %ir.src, addrspace 1)84 ; CHECK-NEXT: SI_RETURN85 call void @llvm.memcpy.p3.p1.i32(ptr addrspace(3) %dst, ptr addrspace(1) %src, i32 256, i1 false)86 ret void87}88 89define void @test_memcpy_p3_p1_i16(ptr addrspace(3) %dst, ptr addrspace(1) %src) {90 ; CHECK-LABEL: name: test_memcpy_p3_p1_i1691 ; CHECK: bb.1 (%ir-block.0):92 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr293 ; CHECK-NEXT: {{ $}}94 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p3) = COPY $vgpr095 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr196 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr297 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)98 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 25699 ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[C]](s16)100 ; CHECK-NEXT: G_MEMCPY [[COPY]](p3), [[MV]](p1), [[ZEXT]](s32), 0 :: (store (s8) into %ir.dst, addrspace 3), (load (s8) from %ir.src, addrspace 1)101 ; CHECK-NEXT: SI_RETURN102 call void @llvm.memcpy.p3.p1.i16(ptr addrspace(3) %dst, ptr addrspace(1) %src, i16 256, i1 false)103 ret void104}105 106define void @test_memmove_p1_p3_i64(ptr addrspace(1) %dst, ptr addrspace(3) %src) {107 ; CHECK-LABEL: name: test_memmove_p1_p3_i64108 ; CHECK: bb.1 (%ir-block.0):109 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2110 ; CHECK-NEXT: {{ $}}111 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0112 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1113 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)114 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p3) = COPY $vgpr2115 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 256116 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)117 ; CHECK-NEXT: G_MEMMOVE [[MV]](p1), [[COPY2]](p3), [[TRUNC]](s32), 0 :: (store (s8) into %ir.dst, addrspace 1), (load (s8) from %ir.src, addrspace 3)118 ; CHECK-NEXT: SI_RETURN119 call void @llvm.memmove.p1.p3.i64(ptr addrspace(1) %dst, ptr addrspace(3) %src, i64 256, i1 false)120 ret void121}122 123define void @test_memmove_p1_p3_i32(ptr addrspace(1) %dst, ptr addrspace(3) %src) {124 ; CHECK-LABEL: name: test_memmove_p1_p3_i32125 ; CHECK: bb.1 (%ir-block.0):126 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2127 ; CHECK-NEXT: {{ $}}128 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0129 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1130 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)131 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p3) = COPY $vgpr2132 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 256133 ; CHECK-NEXT: G_MEMMOVE [[MV]](p1), [[COPY2]](p3), [[C]](s32), 0 :: (store (s8) into %ir.dst, addrspace 1), (load (s8) from %ir.src, addrspace 3)134 ; CHECK-NEXT: SI_RETURN135 call void @llvm.memmove.p1.p3.i32(ptr addrspace(1) %dst, ptr addrspace(3) %src, i32 256, i1 false)136 ret void137}138 139define void @test_memmove_p1_p3_i16(ptr addrspace(1) %dst, ptr addrspace(3) %src) {140 ; CHECK-LABEL: name: test_memmove_p1_p3_i16141 ; CHECK: bb.1 (%ir-block.0):142 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2143 ; CHECK-NEXT: {{ $}}144 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0145 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1146 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)147 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p3) = COPY $vgpr2148 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 256149 ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[C]](s16)150 ; CHECK-NEXT: G_MEMMOVE [[MV]](p1), [[COPY2]](p3), [[ZEXT]](s32), 0 :: (store (s8) into %ir.dst, addrspace 1), (load (s8) from %ir.src, addrspace 3)151 ; CHECK-NEXT: SI_RETURN152 call void @llvm.memmove.p1.p3.i16(ptr addrspace(1) %dst, ptr addrspace(3) %src, i16 256, i1 false)153 ret void154}155 156define void @test_memset_p1_i64(ptr addrspace(1) %dst, i8 %val) {157 ; CHECK-LABEL: name: test_memset_p1_i64158 ; CHECK: bb.1 (%ir-block.0):159 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2160 ; CHECK-NEXT: {{ $}}161 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0162 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1163 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)164 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2165 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY2]](s32)166 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 256167 ; CHECK-NEXT: G_MEMSET [[MV]](p1), [[TRUNC]](s8), [[C]](s64), 0 :: (store (s8) into %ir.dst, addrspace 1)168 ; CHECK-NEXT: SI_RETURN169 call void @llvm.memset.p1.i64(ptr addrspace(1) %dst, i8 %val, i64 256, i1 false)170 ret void171}172 173define void @test_memset_p1_i32(ptr addrspace(1) %dst, i8 %val) {174 ; CHECK-LABEL: name: test_memset_p1_i32175 ; CHECK: bb.1 (%ir-block.0):176 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2177 ; CHECK-NEXT: {{ $}}178 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0179 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1180 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)181 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2182 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY2]](s32)183 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 256184 ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[C]](s32)185 ; CHECK-NEXT: G_MEMSET [[MV]](p1), [[TRUNC]](s8), [[ZEXT]](s64), 0 :: (store (s8) into %ir.dst, addrspace 1)186 ; CHECK-NEXT: SI_RETURN187 call void @llvm.memset.p1.i32(ptr addrspace(1) %dst, i8 %val, i32 256, i1 false)188 ret void189}190 191define void @test_memset_p1_i16(ptr addrspace(1) %dst, i8 %val) {192 ; CHECK-LABEL: name: test_memset_p1_i16193 ; CHECK: bb.1 (%ir-block.0):194 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2195 ; CHECK-NEXT: {{ $}}196 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0197 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1198 ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)199 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2200 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY2]](s32)201 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 256202 ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[C]](s16)203 ; CHECK-NEXT: G_MEMSET [[MV]](p1), [[TRUNC]](s8), [[ZEXT]](s64), 0 :: (store (s8) into %ir.dst, addrspace 1)204 ; CHECK-NEXT: SI_RETURN205 call void @llvm.memset.p1.i16(ptr addrspace(1) %dst, i8 %val, i16 256, i1 false)206 ret void207}208 209define void @test_memset_p3_i64(ptr addrspace(3) %dst, i8 %val) {210 ; CHECK-LABEL: name: test_memset_p3_i64211 ; CHECK: bb.1 (%ir-block.0):212 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1213 ; CHECK-NEXT: {{ $}}214 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p3) = COPY $vgpr0215 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1216 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY1]](s32)217 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 256218 ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)219 ; CHECK-NEXT: G_MEMSET [[COPY]](p3), [[TRUNC]](s8), [[TRUNC1]](s32), 0 :: (store (s8) into %ir.dst, addrspace 3)220 ; CHECK-NEXT: SI_RETURN221 call void @llvm.memset.p3.i64(ptr addrspace(3) %dst, i8 %val, i64 256, i1 false)222 ret void223}224 225define void @test_memset_p3_i32(ptr addrspace(3) %dst, i8 %val) {226 ; CHECK-LABEL: name: test_memset_p3_i32227 ; CHECK: bb.1 (%ir-block.0):228 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1229 ; CHECK-NEXT: {{ $}}230 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p3) = COPY $vgpr0231 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1232 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY1]](s32)233 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 256234 ; CHECK-NEXT: G_MEMSET [[COPY]](p3), [[TRUNC]](s8), [[C]](s32), 0 :: (store (s8) into %ir.dst, addrspace 3)235 ; CHECK-NEXT: SI_RETURN236 call void @llvm.memset.p3.i32(ptr addrspace(3) %dst, i8 %val, i32 256, i1 false)237 ret void238}239 240define void @test_memset_p3_i16(ptr addrspace(3) %dst, i8 %val) {241 ; CHECK-LABEL: name: test_memset_p3_i16242 ; CHECK: bb.1 (%ir-block.0):243 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1244 ; CHECK-NEXT: {{ $}}245 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p3) = COPY $vgpr0246 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1247 ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY1]](s32)248 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 256249 ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[C]](s16)250 ; CHECK-NEXT: G_MEMSET [[COPY]](p3), [[TRUNC]](s8), [[ZEXT]](s32), 0 :: (store (s8) into %ir.dst, addrspace 3)251 ; CHECK-NEXT: SI_RETURN252 call void @llvm.memset.p3.i16(ptr addrspace(3) %dst, i8 %val, i16 256, i1 false)253 ret void254}255 256declare void @llvm.memcpy.p1.p3.i64(ptr addrspace(1) noalias nocapture writeonly, ptr addrspace(3) noalias nocapture readonly, i64, i1 immarg) #0257declare void @llvm.memcpy.p1.p3.i32(ptr addrspace(1) noalias nocapture writeonly, ptr addrspace(3) noalias nocapture readonly, i32, i1 immarg) #0258declare void @llvm.memcpy.p1.p3.i16(ptr addrspace(1) noalias nocapture writeonly, ptr addrspace(3) noalias nocapture readonly, i16, i1 immarg) #0259declare void @llvm.memcpy.p3.p1.i64(ptr addrspace(3) noalias nocapture writeonly, ptr addrspace(1) noalias nocapture readonly, i64, i1 immarg) #0260declare void @llvm.memcpy.p3.p1.i32(ptr addrspace(3) noalias nocapture writeonly, ptr addrspace(1) noalias nocapture readonly, i32, i1 immarg) #0261declare void @llvm.memcpy.p3.p1.i16(ptr addrspace(3) noalias nocapture writeonly, ptr addrspace(1) noalias nocapture readonly, i16, i1 immarg) #0262declare void @llvm.memmove.p1.p3.i64(ptr addrspace(1) nocapture, ptr addrspace(3) nocapture readonly, i64, i1 immarg) #0263declare void @llvm.memmove.p1.p3.i32(ptr addrspace(1) nocapture, ptr addrspace(3) nocapture readonly, i32, i1 immarg) #0264declare void @llvm.memmove.p1.p3.i16(ptr addrspace(1) nocapture, ptr addrspace(3) nocapture readonly, i16, i1 immarg) #0265declare void @llvm.memset.p1.i64(ptr addrspace(1) nocapture writeonly, i8, i64, i1 immarg) #1266declare void @llvm.memset.p1.i32(ptr addrspace(1) nocapture writeonly, i8, i32, i1 immarg) #1267declare void @llvm.memset.p1.i16(ptr addrspace(1) nocapture writeonly, i8, i16, i1 immarg) #1268declare void @llvm.memset.p3.i64(ptr addrspace(3) nocapture writeonly, i8, i64, i1 immarg) #1269declare void @llvm.memset.p3.i32(ptr addrspace(3) nocapture writeonly, i8, i32, i1 immarg) #1270declare void @llvm.memset.p3.i16(ptr addrspace(3) nocapture writeonly, i8, i16, i1 immarg) #1271 272attributes #0 = { argmemonly nounwind willreturn }273attributes #1 = { argmemonly nounwind willreturn writeonly }274