1*4666953cSVitaly Buka; REQUIRES: aarch64-registered-target 2*4666953cSVitaly Buka 3*4666953cSVitaly Buka; For convenience, to show what is being serialized. 4*4666953cSVitaly Buka; RUN: opt -S -passes="print<stack-safety-local>" -disable-output < %s 2>&1 | FileCheck %s --check-prefixes=SSI 5*4666953cSVitaly Buka 6*4666953cSVitaly Buka; RUN: opt -module-summary %s -o %t.bc 7*4666953cSVitaly Buka; RUN: llvm-bcanalyzer -dump %t.bc | FileCheck %s -check-prefixes=BC 8*4666953cSVitaly Buka 9*4666953cSVitaly Buka; RUN: llvm-dis -o - %t.bc | FileCheck %s --check-prefix=DIS 10*4666953cSVitaly Buka; Round trip it through llvm-as 11*4666953cSVitaly Buka; RUN: llvm-dis -o - %t.bc | llvm-as -o - | llvm-dis -o - | FileCheck %s --check-prefix=DIS 12*4666953cSVitaly Buka 13*4666953cSVitaly Buka; RUN: opt -thinlto-bc %s -o %t.bc 14*4666953cSVitaly Buka; RUN: llvm-bcanalyzer -dump %t.bc | FileCheck %s -check-prefixes=BC 15*4666953cSVitaly Buka 16*4666953cSVitaly Buka; RUN: llvm-dis -o - %t.bc | FileCheck %s --check-prefix=DIS 17*4666953cSVitaly Buka; Round trip it through llvm-as 18*4666953cSVitaly Buka; RUN: llvm-dis -o - %t.bc | llvm-as -o - | llvm-dis -o - | FileCheck %s --check-prefix=DIS 19*4666953cSVitaly Buka 20*4666953cSVitaly Buka; DIS: ^0 = module: (path: "{{.*}}", hash: ({{.*}})) 21*4666953cSVitaly Buka; ModuleID = 'thinlto-function-summary-paramaccess.ll' 22*4666953cSVitaly Bukatarget datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" 23*4666953cSVitaly Bukatarget triple = "aarch64-unknown-linux" 24*4666953cSVitaly Buka 25*4666953cSVitaly Bukaattributes #0 = { noinline sanitize_memtag "target-features"="+mte,+neon" } 26*4666953cSVitaly Buka 27*4666953cSVitaly Buka; BC-LABEL: <GLOBALVAL_SUMMARY_BLOCK 28*4666953cSVitaly Buka; BC-NEXT: <VERSION 29*4666953cSVitaly Buka; BC-NEXT: <FLAGS 30*4666953cSVitaly Buka 31*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "Callee") ; guid = 900789920918863816 32*4666953cSVitaly Bukadeclare void @Callee(i8* %p) 33*4666953cSVitaly Buka 34*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "Callee2") ; guid = 72710208629861106 35*4666953cSVitaly Bukadeclare void @Callee2(i32 %x, i8* %p) 36*4666953cSVitaly Buka 37*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 38*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "NoParam", summaries: {{.*}} guid = 10287433468618421703 39*4666953cSVitaly Bukadefine void @NoParam() #0 { 40*4666953cSVitaly Bukaentry: 41*4666953cSVitaly Buka ret void 42*4666953cSVitaly Buka} 43*4666953cSVitaly Buka 44*4666953cSVitaly Buka; SSI-LABEL: function 'IntParam' 45*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 46*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "IntParam", summaries: {{.*}} guid = 13164714711077064397 47*4666953cSVitaly Bukadefine void @IntParam(i32 %x) #0 { 48*4666953cSVitaly Bukaentry: 49*4666953cSVitaly Buka ret void 50*4666953cSVitaly Buka} 51*4666953cSVitaly Buka 52*4666953cSVitaly Buka; SSI-LABEL: for function 'WriteNone' 53*4666953cSVitaly Buka; SSI: p[]: empty-set 54*4666953cSVitaly Buka; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=0/> 55*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 56*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "WriteNone", summaries: {{.*}} params: ((param: 0, offset: [0, -1]))))) ; guid = 15261848357689602442 57*4666953cSVitaly Bukadefine void @WriteNone(i8* %p) #0 { 58*4666953cSVitaly Bukaentry: 59*4666953cSVitaly Buka ret void 60*4666953cSVitaly Buka} 61*4666953cSVitaly Buka 62*4666953cSVitaly Buka; SSI-LABEL: for function 'Write0' 63*4666953cSVitaly Buka; SSI: p[]: [0,1) 64*4666953cSVitaly Buka; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=2 op3=0/> 65*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 66*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "Write0", summaries: {{.*}} params: ((param: 0, offset: [0, 0]))))) ; guid = 5540766144860458461 67*4666953cSVitaly Bukadefine void @Write0(i8* %p) #0 { 68*4666953cSVitaly Bukaentry: 69*4666953cSVitaly Buka store i8 0, i8* %p 70*4666953cSVitaly Buka ret void 71*4666953cSVitaly Buka} 72*4666953cSVitaly Buka 73*4666953cSVitaly Buka; SSI-LABEL: for function 'WriteOffset' 74*4666953cSVitaly Buka; SSI: p[]: [12,16) 75*4666953cSVitaly Buka; BC-NEXT: <PARAM_ACCESS op0=0 op1=24 op2=32 op3=0/> 76*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 77*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "WriteOffset", summaries: {{.*}} params: ((param: 0, offset: [12, 15]))))) ; guid = 1417835201204712148 78*4666953cSVitaly Bukadefine void @WriteOffset(i8* %p) #0 { 79*4666953cSVitaly Bukaentry: 80*4666953cSVitaly Buka %0 = bitcast i8* %p to i32* 81*4666953cSVitaly Buka %1 = getelementptr i32, i32* %0, i64 3 82*4666953cSVitaly Buka store i32 0, i32* %1 83*4666953cSVitaly Buka ret void 84*4666953cSVitaly Buka} 85*4666953cSVitaly Buka 86*4666953cSVitaly Buka; SSI-LABEL: for function 'WriteNegOffset' 87*4666953cSVitaly Buka; SSI: p[]: [-56,-48) 88*4666953cSVitaly Buka; BC-NEXT: <PARAM_ACCESS op0=0 op1=113 op2=97 op3=0/> 89*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 90*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "WriteNegOffset", summaries: {{.*}} params: ((param: 0, offset: [-56, -49]))))) ; guid = 11847411556962310546 91*4666953cSVitaly Bukadefine void @WriteNegOffset(i8* %p) #0 { 92*4666953cSVitaly Bukaentry: 93*4666953cSVitaly Buka %0 = bitcast i8* %p to i64* 94*4666953cSVitaly Buka %1 = getelementptr i64, i64* %0, i64 -7 95*4666953cSVitaly Buka store i64 0, i64* %1 96*4666953cSVitaly Buka ret void 97*4666953cSVitaly Buka} 98*4666953cSVitaly Buka 99*4666953cSVitaly Buka; SSI-LABEL: for function 'WriteAnyOffset' 100*4666953cSVitaly Buka; SSI: p[]: [-9223372036854775808,9223372036854775807) 101*4666953cSVitaly Buka; BC-NEXT: <PARAM_ACCESS op0=0 op1=1 op2=-2 op3=0/> 102*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 103*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "WriteAnyOffset", summaries: {{.*}} params: ((param: 0, offset: [-9223372036854775808, 9223372036854775806]))))) ; guid = 16159595372881907190 104*4666953cSVitaly Bukadefine void @WriteAnyOffset(i8* %p, i64 %i) #0 { 105*4666953cSVitaly Bukaentry: 106*4666953cSVitaly Buka %0 = bitcast i8* %p to i24* 107*4666953cSVitaly Buka %1 = getelementptr i24, i24* %0, i64 %i 108*4666953cSVitaly Buka store i24 0, i24* %1 109*4666953cSVitaly Buka ret void 110*4666953cSVitaly Buka} 111*4666953cSVitaly Buka 112*4666953cSVitaly Buka; SSI-LABEL: for function 'WritePQ' 113*4666953cSVitaly Buka; SSI: p[]: [0,1) 114*4666953cSVitaly Buka; SSI: q[]: [0,4) 115*4666953cSVitaly Buka; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=2 op3=0 op4=1 op5=0 op6=8 op7=0/> 116*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 117*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "WritePQ", summaries: {{.*}} params: ((param: 0, offset: [0, 0]), (param: 1, offset: [0, 3]))))) ; guid = 6187077497926519485 118*4666953cSVitaly Bukadefine void @WritePQ(i8* %p, i32* %q) #0 { 119*4666953cSVitaly Bukaentry: 120*4666953cSVitaly Buka store i8 5, i8* %p 121*4666953cSVitaly Buka store i32 6, i32* %q 122*4666953cSVitaly Buka ret void 123*4666953cSVitaly Buka} 124*4666953cSVitaly Buka 125*4666953cSVitaly Buka; SSI-LABEL: for function 'WriteTwoPIQ' 126*4666953cSVitaly Buka; SSI: p[]: [0,1) 127*4666953cSVitaly Buka; SSI: q[]: [0,4) 128*4666953cSVitaly Buka; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=2 op3=0 op4=2 op5=0 op6=8 op7=0/> 129*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 130*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "WriteTwoPIQ", summaries: {{.*}} params: ((param: 0, offset: [0, 0]), (param: 2, offset: [0, 3]))))) ; guid = 2949024673554120799 131*4666953cSVitaly Bukadefine void @WriteTwoPIQ(i8* %p, i32 %i, i32* %q) #0 { 132*4666953cSVitaly Bukaentry: 133*4666953cSVitaly Buka store i8 7, i8* %p 134*4666953cSVitaly Buka store i32 %i, i32* %q 135*4666953cSVitaly Buka ret void 136*4666953cSVitaly Buka} 137*4666953cSVitaly Buka 138*4666953cSVitaly Buka; SSI-LABEL: for function 'Call' 139*4666953cSVitaly Buka; SSI: p[]: empty-set, @Callee(arg0, [0,1)) 140*4666953cSVitaly Buka; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=1 op4=0 op5=[[CALLEE:-?[0-9]+]] op6=0 op7=2/> 141*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 142*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "Call", summaries: {{.*}} calls: ((callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [0, 0]))))))) ; guid = 8411925997558855107 143*4666953cSVitaly Bukadefine void @Call(i8* %p) #0 { 144*4666953cSVitaly Bukaentry: 145*4666953cSVitaly Buka call void @Callee(i8* %p) 146*4666953cSVitaly Buka ret void 147*4666953cSVitaly Buka} 148*4666953cSVitaly Buka 149*4666953cSVitaly Buka; SSI-LABEL: for function 'CallOffset' 150*4666953cSVitaly Buka; SSI: p[]: empty-set, @Callee(arg0, [2,3)) 151*4666953cSVitaly Buka; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=1 op4=0 op5=[[CALLEE]] op6=4 op7=6/> 152*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 153*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "CallOffset", summaries: {{.*}} calls: ((callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [2, 2]))))))) ; guid = 1075564720951610524 154*4666953cSVitaly Bukadefine void @CallOffset(i8* %p) #0 { 155*4666953cSVitaly Bukaentry: 156*4666953cSVitaly Buka %p1 = getelementptr i8, i8* %p, i64 2 157*4666953cSVitaly Buka call void @Callee(i8* %p1) 158*4666953cSVitaly Buka ret void 159*4666953cSVitaly Buka} 160*4666953cSVitaly Buka 161*4666953cSVitaly Buka; SSI-LABEL: for function 'CallNegOffset' 162*4666953cSVitaly Buka; SSI: p[]: empty-set, @Callee(arg0, [-715,-714)) 163*4666953cSVitaly Buka; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=1 op4=0 op5=[[CALLEE]] op6=1431 op7=1429/> 164*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 165*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "CallNegOffset", summaries: {{.*}} calls: ((callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [-715, -715]))))))) ; guid = 16532891468562335146 166*4666953cSVitaly Bukadefine void @CallNegOffset(i8* %p) #0 { 167*4666953cSVitaly Bukaentry: 168*4666953cSVitaly Buka %p1 = getelementptr i8, i8* %p, i64 -715 169*4666953cSVitaly Buka call void @Callee(i8* %p1) 170*4666953cSVitaly Buka ret void 171*4666953cSVitaly Buka} 172*4666953cSVitaly Buka 173*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 174*4666953cSVitaly Buka; SSI-LABEL: for function 'CallAnyOffset' 175*4666953cSVitaly Buka; SSI: p[]: empty-set, @Callee(arg0, full-set) 176*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "CallAnyOffset", summaries: {{.*}} calls: ((callee: ^{{.*}}))))) ; guid = 4179978066780831873 177*4666953cSVitaly Bukadefine void @CallAnyOffset(i8* %p, i64 %i) #0 { 178*4666953cSVitaly Bukaentry: 179*4666953cSVitaly Buka %p1 = getelementptr i8, i8* %p, i64 %i 180*4666953cSVitaly Buka call void @Callee(i8* %p1) 181*4666953cSVitaly Buka ret void 182*4666953cSVitaly Buka} 183*4666953cSVitaly Buka 184*4666953cSVitaly Buka; SSI-LABEL: for function 'CallMany' 185*4666953cSVitaly Buka; SSI: p[]: empty-set, @Callee(arg0, [-715,-714)), @Callee(arg0, [-33,-32)), @Callee(arg0, [124,125)) 186*4666953cSVitaly Buka; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=3 op4=0 op5=[[CALLEE]] op6=1431 op7=1429 op8=0 op9=[[CALLEE]] op10=67 op11=65 op12=0 op13=[[CALLEE]] op14=248 op15=250/> 187*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 188*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "CallMany", summaries: {{.*}} calls: ((callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [-715, -715]), (callee: ^{{.*}}, param: 0, offset: [-33, -33]), (callee: ^{{.*}}, param: 0, offset: [124, 124]))))))) ; guid = 17150418543861409076 189*4666953cSVitaly Bukadefine void @CallMany(i8* %p) #0 { 190*4666953cSVitaly Bukaentry: 191*4666953cSVitaly Buka %p0 = getelementptr i8, i8* %p, i64 -715 192*4666953cSVitaly Buka call void @Callee(i8* %p0) 193*4666953cSVitaly Buka 194*4666953cSVitaly Buka %p1 = getelementptr i8, i8* %p, i64 -33 195*4666953cSVitaly Buka call void @Callee(i8* %p1) 196*4666953cSVitaly Buka 197*4666953cSVitaly Buka %p2 = getelementptr i8, i8* %p, i64 124 198*4666953cSVitaly Buka call void @Callee(i8* %p2) 199*4666953cSVitaly Buka 200*4666953cSVitaly Buka ret void 201*4666953cSVitaly Buka} 202*4666953cSVitaly Buka 203*4666953cSVitaly Buka; SSI-LABEL: for function 'CallMany2' 204*4666953cSVitaly Buka; SSI: p[]: empty-set, @Callee(arg0, [-715,-714)), @Callee2(arg1, [-33,-32)), @Callee(arg0, [124,125)) 205*4666953cSVitaly Buka; BC-NEXT: <PARAM_ACCESS op0=0 op1=0 op2=0 op3=3 op4=0 op5=[[CALLEE]] op6=1431 op7=1429 op8=1 op9=[[CALLEE2:-?[0-9]+]] op10=67 op11=65 op12=0 op13=[[CALLEE]] op14=248 op15=250/> 206*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 207*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "CallMany2", summaries: {{.*}} calls: ((callee: ^{{.*}}), (callee: ^{{.*}})), params: ((param: 0, offset: [0, -1], calls: ((callee: ^{{.*}}, param: 0, offset: [-715, -715]), (callee: ^{{.*}}, param: 1, offset: [-33, -33]), (callee: ^{{.*}}, param: 0, offset: [124, 124]))))))) ; guid = 16654048340802466690 208*4666953cSVitaly Bukadefine void @CallMany2(i8* %p) #0 { 209*4666953cSVitaly Bukaentry: 210*4666953cSVitaly Buka %p0 = getelementptr i8, i8* %p, i64 -715 211*4666953cSVitaly Buka call void @Callee(i8* %p0) 212*4666953cSVitaly Buka 213*4666953cSVitaly Buka %p1 = getelementptr i8, i8* %p, i64 -33 214*4666953cSVitaly Buka call void @Callee2(i32 6, i8* %p1) 215*4666953cSVitaly Buka 216*4666953cSVitaly Buka %p2 = getelementptr i8, i8* %p, i64 124 217*4666953cSVitaly Buka call void @Callee(i8* %p2) 218*4666953cSVitaly Buka 219*4666953cSVitaly Buka ret void 220*4666953cSVitaly Buka} 221*4666953cSVitaly Buka 222*4666953cSVitaly Buka; SSI-LABEL: for function 'CallManyUnsafe' 223*4666953cSVitaly Buka; SSI: p[]: full-set, @Callee(arg0, [-715,-714)), @Callee(arg0, [-33,-32)), @Callee(arg0, [124,125)) 224*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 225*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "CallManyUnsafe", summaries: {{.*}} calls: ((callee: ^{{.*}}))))) ; guid = 15696680128757863301 226*4666953cSVitaly Bukadefine void @CallManyUnsafe(i8* %p, i64 %i) #0 { 227*4666953cSVitaly Bukaentry: 228*4666953cSVitaly Buka %pi = getelementptr i8, i8* %p, i64 %i 229*4666953cSVitaly Buka store i8 5, i8* %pi 230*4666953cSVitaly Buka 231*4666953cSVitaly Buka %p0 = getelementptr i8, i8* %p, i64 -715 232*4666953cSVitaly Buka call void @Callee(i8* %p0) 233*4666953cSVitaly Buka 234*4666953cSVitaly Buka %p1 = getelementptr i8, i8* %p, i64 -33 235*4666953cSVitaly Buka call void @Callee(i8* %p1) 236*4666953cSVitaly Buka 237*4666953cSVitaly Buka %p2 = getelementptr i8, i8* %p, i64 124 238*4666953cSVitaly Buka call void @Callee(i8* %p2) 239*4666953cSVitaly Buka 240*4666953cSVitaly Buka ret void 241*4666953cSVitaly Buka} 242*4666953cSVitaly Buka 243*4666953cSVitaly Buka; SSI-LABEL: for function 'Ret' 244*4666953cSVitaly Buka; SSI: p[]: full-set 245*4666953cSVitaly Buka; BC-NEXT: <PERMODULE 246*4666953cSVitaly Buka; DIS-DAG: = gv: (name: "Ret", summaries: {{.*}} ; guid = 6707380319572075172 247*4666953cSVitaly Bukadefine i8* @Ret(i8* %p) #0 { 248*4666953cSVitaly Bukaentry: 249*4666953cSVitaly Buka ret i8* %p 250*4666953cSVitaly Buka} 251*4666953cSVitaly Buka 252*4666953cSVitaly Buka; BC-NOT: <PERMODULE 253*4666953cSVitaly Buka; BC-NOT: <PARAM_ACCESS1 254*4666953cSVitaly Buka 255*4666953cSVitaly Buka 256