1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck -check-prefix=SM20 %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=nvptx64 -mcpu=sm_35 | FileCheck -check-prefix=SM35 %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-n16:32:64" 5*9880d681SAndroid Build Coastguard Workertarget triple = "nvptx64-unknown-unknown" 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo1( 8*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.f32 9*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo1( 10*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.f32 11*9880d681SAndroid Build Coastguard Workerdefine void @foo1(float * noalias readonly %from, float * %to) { 12*9880d681SAndroid Build Coastguard Worker %1 = load float, float * %from 13*9880d681SAndroid Build Coastguard Worker store float %1, float * %to 14*9880d681SAndroid Build Coastguard Worker ret void 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo2( 18*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.f64 19*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo2( 20*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.f64 21*9880d681SAndroid Build Coastguard Workerdefine void @foo2(double * noalias readonly %from, double * %to) { 22*9880d681SAndroid Build Coastguard Worker %1 = load double, double * %from 23*9880d681SAndroid Build Coastguard Worker store double %1, double * %to 24*9880d681SAndroid Build Coastguard Worker ret void 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo3( 28*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.u16 29*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo3( 30*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.u16 31*9880d681SAndroid Build Coastguard Workerdefine void @foo3(i16 * noalias readonly %from, i16 * %to) { 32*9880d681SAndroid Build Coastguard Worker %1 = load i16, i16 * %from 33*9880d681SAndroid Build Coastguard Worker store i16 %1, i16 * %to 34*9880d681SAndroid Build Coastguard Worker ret void 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo4( 38*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.u32 39*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo4( 40*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.u32 41*9880d681SAndroid Build Coastguard Workerdefine void @foo4(i32 * noalias readonly %from, i32 * %to) { 42*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32 * %from 43*9880d681SAndroid Build Coastguard Worker store i32 %1, i32 * %to 44*9880d681SAndroid Build Coastguard Worker ret void 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo5( 48*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.u64 49*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo5( 50*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.u64 51*9880d681SAndroid Build Coastguard Workerdefine void @foo5(i64 * noalias readonly %from, i64 * %to) { 52*9880d681SAndroid Build Coastguard Worker %1 = load i64, i64 * %from 53*9880d681SAndroid Build Coastguard Worker store i64 %1, i64 * %to 54*9880d681SAndroid Build Coastguard Worker ret void 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; i128 is non standard integer in nvptx64 58*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo6( 59*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.u64 60*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.u64 61*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo6( 62*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.u64 63*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.u64 64*9880d681SAndroid Build Coastguard Workerdefine void @foo6(i128 * noalias readonly %from, i128 * %to) { 65*9880d681SAndroid Build Coastguard Worker %1 = load i128, i128 * %from 66*9880d681SAndroid Build Coastguard Worker store i128 %1, i128 * %to 67*9880d681SAndroid Build Coastguard Worker ret void 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo7( 71*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.v2.u8 72*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo7( 73*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.v2.u8 74*9880d681SAndroid Build Coastguard Workerdefine void @foo7(<2 x i8> * noalias readonly %from, <2 x i8> * %to) { 75*9880d681SAndroid Build Coastguard Worker %1 = load <2 x i8>, <2 x i8> * %from 76*9880d681SAndroid Build Coastguard Worker store <2 x i8> %1, <2 x i8> * %to 77*9880d681SAndroid Build Coastguard Worker ret void 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo8( 81*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.v2.u16 82*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo8( 83*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.v2.u16 84*9880d681SAndroid Build Coastguard Workerdefine void @foo8(<2 x i16> * noalias readonly %from, <2 x i16> * %to) { 85*9880d681SAndroid Build Coastguard Worker %1 = load <2 x i16>, <2 x i16> * %from 86*9880d681SAndroid Build Coastguard Worker store <2 x i16> %1, <2 x i16> * %to 87*9880d681SAndroid Build Coastguard Worker ret void 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo9( 91*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.v2.u32 92*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo9( 93*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.v2.u32 94*9880d681SAndroid Build Coastguard Workerdefine void @foo9(<2 x i32> * noalias readonly %from, <2 x i32> * %to) { 95*9880d681SAndroid Build Coastguard Worker %1 = load <2 x i32>, <2 x i32> * %from 96*9880d681SAndroid Build Coastguard Worker store <2 x i32> %1, <2 x i32> * %to 97*9880d681SAndroid Build Coastguard Worker ret void 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo10( 101*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.v2.u64 102*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo10( 103*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.v2.u64 104*9880d681SAndroid Build Coastguard Workerdefine void @foo10(<2 x i64> * noalias readonly %from, <2 x i64> * %to) { 105*9880d681SAndroid Build Coastguard Worker %1 = load <2 x i64>, <2 x i64> * %from 106*9880d681SAndroid Build Coastguard Worker store <2 x i64> %1, <2 x i64> * %to 107*9880d681SAndroid Build Coastguard Worker ret void 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo11( 111*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.v2.f32 112*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo11( 113*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.v2.f32 114*9880d681SAndroid Build Coastguard Workerdefine void @foo11(<2 x float> * noalias readonly %from, <2 x float> * %to) { 115*9880d681SAndroid Build Coastguard Worker %1 = load <2 x float>, <2 x float> * %from 116*9880d681SAndroid Build Coastguard Worker store <2 x float> %1, <2 x float> * %to 117*9880d681SAndroid Build Coastguard Worker ret void 118*9880d681SAndroid Build Coastguard Worker} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo12( 121*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.v2.f64 122*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo12( 123*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.v2.f64 124*9880d681SAndroid Build Coastguard Workerdefine void @foo12(<2 x double> * noalias readonly %from, <2 x double> * %to) { 125*9880d681SAndroid Build Coastguard Worker %1 = load <2 x double>, <2 x double> * %from 126*9880d681SAndroid Build Coastguard Worker store <2 x double> %1, <2 x double> * %to 127*9880d681SAndroid Build Coastguard Worker ret void 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo13( 131*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.v4.u8 132*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo13( 133*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.v4.u8 134*9880d681SAndroid Build Coastguard Workerdefine void @foo13(<4 x i8> * noalias readonly %from, <4 x i8> * %to) { 135*9880d681SAndroid Build Coastguard Worker %1 = load <4 x i8>, <4 x i8> * %from 136*9880d681SAndroid Build Coastguard Worker store <4 x i8> %1, <4 x i8> * %to 137*9880d681SAndroid Build Coastguard Worker ret void 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo14( 141*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.v4.u16 142*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo14( 143*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.v4.u16 144*9880d681SAndroid Build Coastguard Workerdefine void @foo14(<4 x i16> * noalias readonly %from, <4 x i16> * %to) { 145*9880d681SAndroid Build Coastguard Worker %1 = load <4 x i16>, <4 x i16> * %from 146*9880d681SAndroid Build Coastguard Worker store <4 x i16> %1, <4 x i16> * %to 147*9880d681SAndroid Build Coastguard Worker ret void 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo15( 151*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.v4.u32 152*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo15( 153*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.v4.u32 154*9880d681SAndroid Build Coastguard Workerdefine void @foo15(<4 x i32> * noalias readonly %from, <4 x i32> * %to) { 155*9880d681SAndroid Build Coastguard Worker %1 = load <4 x i32>, <4 x i32> * %from 156*9880d681SAndroid Build Coastguard Worker store <4 x i32> %1, <4 x i32> * %to 157*9880d681SAndroid Build Coastguard Worker ret void 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo16( 161*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.v4.f32 162*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo16( 163*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.v4.f32 164*9880d681SAndroid Build Coastguard Workerdefine void @foo16(<4 x float> * noalias readonly %from, <4 x float> * %to) { 165*9880d681SAndroid Build Coastguard Worker %1 = load <4 x float>, <4 x float> * %from 166*9880d681SAndroid Build Coastguard Worker store <4 x float> %1, <4 x float> * %to 167*9880d681SAndroid Build Coastguard Worker ret void 168*9880d681SAndroid Build Coastguard Worker} 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo17( 171*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.v2.f64 172*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.v2.f64 173*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo17( 174*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.v2.f64 175*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.v2.f64 176*9880d681SAndroid Build Coastguard Workerdefine void @foo17(<4 x double> * noalias readonly %from, <4 x double> * %to) { 177*9880d681SAndroid Build Coastguard Worker %1 = load <4 x double>, <4 x double> * %from 178*9880d681SAndroid Build Coastguard Worker store <4 x double> %1, <4 x double> * %to 179*9880d681SAndroid Build Coastguard Worker ret void 180*9880d681SAndroid Build Coastguard Worker} 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo18( 183*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.u64 184*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo18( 185*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.u64 186*9880d681SAndroid Build Coastguard Workerdefine void @foo18(float ** noalias readonly %from, float ** %to) { 187*9880d681SAndroid Build Coastguard Worker %1 = load float *, float ** %from 188*9880d681SAndroid Build Coastguard Worker store float * %1, float ** %to 189*9880d681SAndroid Build Coastguard Worker ret void 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker; Test that we can infer a cached load for a pointer induction variable. 193*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: .visible .entry foo19( 194*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.f32 195*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: .visible .entry foo19( 196*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.nc.f32 197*9880d681SAndroid Build Coastguard Workerdefine void @foo19(float * noalias readonly %from, float * %to, i32 %n) { 198*9880d681SAndroid Build Coastguard Workerentry: 199*9880d681SAndroid Build Coastguard Worker br label %loop 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Workerloop: 202*9880d681SAndroid Build Coastguard Worker %i = phi i32 [ 0, %entry ], [ %nexti, %loop ] 203*9880d681SAndroid Build Coastguard Worker %sum = phi float [ 0.0, %entry ], [ %nextsum, %loop ] 204*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds float, float * %from, i32 %i 205*9880d681SAndroid Build Coastguard Worker %value = load float, float * %ptr, align 4 206*9880d681SAndroid Build Coastguard Worker %nextsum = fadd float %value, %sum 207*9880d681SAndroid Build Coastguard Worker %nexti = add nsw i32 %i, 1 208*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %nexti, %n 209*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %exit, label %loop 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Workerexit: 212*9880d681SAndroid Build Coastguard Worker store float %nextsum, float * %to 213*9880d681SAndroid Build Coastguard Worker ret void 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker; This test captures the case of a non-kernel function. In a 217*9880d681SAndroid Build Coastguard Worker; non-kernel function, without interprocedural analysis, we do not 218*9880d681SAndroid Build Coastguard Worker; know that the parameter is global. We also do not know that the 219*9880d681SAndroid Build Coastguard Worker; pointed-to memory is never written to (for the duration of the 220*9880d681SAndroid Build Coastguard Worker; kernel). For both reasons, we cannot use a cached load here. 221*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: notkernel( 222*9880d681SAndroid Build Coastguard Worker; SM20: ld.f32 223*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: notkernel( 224*9880d681SAndroid Build Coastguard Worker; SM35: ld.f32 225*9880d681SAndroid Build Coastguard Workerdefine void @notkernel(float * noalias readonly %from, float * %to) { 226*9880d681SAndroid Build Coastguard Worker %1 = load float, float * %from 227*9880d681SAndroid Build Coastguard Worker store float %1, float * %to 228*9880d681SAndroid Build Coastguard Worker ret void 229*9880d681SAndroid Build Coastguard Worker} 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Worker; As @notkernel, but with the parameter explicitly marked as global. We still 232*9880d681SAndroid Build Coastguard Worker; do not know that the parameter is never written to (for the duration of the 233*9880d681SAndroid Build Coastguard Worker; kernel). This case does not currently come up normally since we do not infer 234*9880d681SAndroid Build Coastguard Worker; that pointers are global interprocedurally as of 2015-08-05. 235*9880d681SAndroid Build Coastguard Worker; SM20-LABEL: notkernel2( 236*9880d681SAndroid Build Coastguard Worker; SM20: ld.global.f32 237*9880d681SAndroid Build Coastguard Worker; SM35-LABEL: notkernel2( 238*9880d681SAndroid Build Coastguard Worker; SM35: ld.global.f32 239*9880d681SAndroid Build Coastguard Workerdefine void @notkernel2(float addrspace(1) * noalias readonly %from, float * %to) { 240*9880d681SAndroid Build Coastguard Worker %1 = load float, float addrspace(1) * %from 241*9880d681SAndroid Build Coastguard Worker store float %1, float * %to 242*9880d681SAndroid Build Coastguard Worker ret void 243*9880d681SAndroid Build Coastguard Worker} 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker!nvvm.annotations = !{!1 ,!2 ,!3 ,!4 ,!5 ,!6, !7 ,!8 ,!9 ,!10 ,!11 ,!12, !13, !14, !15, !16, !17, !18, !19} 246*9880d681SAndroid Build Coastguard Worker!1 = !{void (float *, float *)* @foo1, !"kernel", i32 1} 247*9880d681SAndroid Build Coastguard Worker!2 = !{void (double *, double *)* @foo2, !"kernel", i32 1} 248*9880d681SAndroid Build Coastguard Worker!3 = !{void (i16 *, i16 *)* @foo3, !"kernel", i32 1} 249*9880d681SAndroid Build Coastguard Worker!4 = !{void (i32 *, i32 *)* @foo4, !"kernel", i32 1} 250*9880d681SAndroid Build Coastguard Worker!5 = !{void (i64 *, i64 *)* @foo5, !"kernel", i32 1} 251*9880d681SAndroid Build Coastguard Worker!6 = !{void (i128 *, i128 *)* @foo6, !"kernel", i32 1} 252*9880d681SAndroid Build Coastguard Worker!7 = !{void (<2 x i8> *, <2 x i8> *)* @foo7, !"kernel", i32 1} 253*9880d681SAndroid Build Coastguard Worker!8 = !{void (<2 x i16> *, <2 x i16> *)* @foo8, !"kernel", i32 1} 254*9880d681SAndroid Build Coastguard Worker!9 = !{void (<2 x i32> *, <2 x i32> *)* @foo9, !"kernel", i32 1} 255*9880d681SAndroid Build Coastguard Worker!10 = !{void (<2 x i64> *, <2 x i64> *)* @foo10, !"kernel", i32 1} 256*9880d681SAndroid Build Coastguard Worker!11 = !{void (<2 x float> *, <2 x float> *)* @foo11, !"kernel", i32 1} 257*9880d681SAndroid Build Coastguard Worker!12 = !{void (<2 x double> *, <2 x double> *)* @foo12, !"kernel", i32 1} 258*9880d681SAndroid Build Coastguard Worker!13 = !{void (<4 x i8> *, <4 x i8> *)* @foo13, !"kernel", i32 1} 259*9880d681SAndroid Build Coastguard Worker!14 = !{void (<4 x i16> *, <4 x i16> *)* @foo14, !"kernel", i32 1} 260*9880d681SAndroid Build Coastguard Worker!15 = !{void (<4 x i32> *, <4 x i32> *)* @foo15, !"kernel", i32 1} 261*9880d681SAndroid Build Coastguard Worker!16 = !{void (<4 x float> *, <4 x float> *)* @foo16, !"kernel", i32 1} 262*9880d681SAndroid Build Coastguard Worker!17 = !{void (<4 x double> *, <4 x double> *)* @foo17, !"kernel", i32 1} 263*9880d681SAndroid Build Coastguard Worker!18 = !{void (float **, float **)* @foo18, !"kernel", i32 1} 264*9880d681SAndroid Build Coastguard Worker!19 = !{void (float *, float *, i32)* @foo19, !"kernel", i32 1} 265