1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -gvn -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker%struct.A = type { i32 (...)** } 4*9880d681SAndroid Build Coastguard Worker@_ZTV1A = available_externally unnamed_addr constant [4 x i8*] [i8* null, i8* bitcast (i8** @_ZTI1A to i8*), i8* bitcast (i32 (%struct.A*)* @_ZN1A3fooEv to i8*), i8* bitcast (i32 (%struct.A*)* @_ZN1A3barEv to i8*)], align 8 5*9880d681SAndroid Build Coastguard Worker@_ZTI1A = external constant i8* 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Checks if indirect calls can be replaced with direct 8*9880d681SAndroid Build Coastguard Worker; assuming that %vtable == @_ZTV1A (with alignment). 9*9880d681SAndroid Build Coastguard Worker; Checking const propagation across other BBs 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @_Z1gb( 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine void @_Z1gb(i1 zeroext %p) { 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker %call = tail call noalias i8* @_Znwm(i64 8) #4 15*9880d681SAndroid Build Coastguard Worker %0 = bitcast i8* %call to %struct.A* 16*9880d681SAndroid Build Coastguard Worker tail call void @_ZN1AC1Ev(%struct.A* %0) #1 17*9880d681SAndroid Build Coastguard Worker %1 = bitcast i8* %call to i8*** 18*9880d681SAndroid Build Coastguard Worker %vtable = load i8**, i8*** %1, align 8 19*9880d681SAndroid Build Coastguard Worker %cmp.vtables = icmp eq i8** %vtable, getelementptr inbounds ([4 x i8*], [4 x i8*]* @_ZTV1A, i64 0, i64 2) 20*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %cmp.vtables) 21*9880d681SAndroid Build Coastguard Worker br i1 %p, label %if.then, label %if.else 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 24*9880d681SAndroid Build Coastguard Worker %vtable1.cast = bitcast i8** %vtable to i32 (%struct.A*)** 25*9880d681SAndroid Build Coastguard Worker %2 = load i32 (%struct.A*)*, i32 (%struct.A*)** %vtable1.cast, align 8 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker ; CHECK: call i32 @_ZN1A3fooEv( 28*9880d681SAndroid Build Coastguard Worker %call2 = tail call i32 %2(%struct.A* %0) #1 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker br label %if.end 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 33*9880d681SAndroid Build Coastguard Worker %vfn47 = getelementptr inbounds i8*, i8** %vtable, i64 1 34*9880d681SAndroid Build Coastguard Worker %vfn4 = bitcast i8** %vfn47 to i32 (%struct.A*)** 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker ; CHECK: call i32 @_ZN1A3barEv( 37*9880d681SAndroid Build Coastguard Worker %3 = load i32 (%struct.A*)*, i32 (%struct.A*)** %vfn4, align 8 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker %call5 = tail call i32 %3(%struct.A* %0) #1 40*9880d681SAndroid Build Coastguard Worker br label %if.end 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.else, %if.then 43*9880d681SAndroid Build Coastguard Worker ret void 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; Check integration with invariant.group handling 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @invariantGroupHandling(i1 zeroext %p) { 48*9880d681SAndroid Build Coastguard Workerdefine void @invariantGroupHandling(i1 zeroext %p) { 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker %call = tail call noalias i8* @_Znwm(i64 8) #4 51*9880d681SAndroid Build Coastguard Worker %0 = bitcast i8* %call to %struct.A* 52*9880d681SAndroid Build Coastguard Worker tail call void @_ZN1AC1Ev(%struct.A* %0) #1 53*9880d681SAndroid Build Coastguard Worker %1 = bitcast i8* %call to i8*** 54*9880d681SAndroid Build Coastguard Worker %vtable = load i8**, i8*** %1, align 8, !invariant.group !0 55*9880d681SAndroid Build Coastguard Worker %cmp.vtables = icmp eq i8** %vtable, getelementptr inbounds ([4 x i8*], [4 x i8*]* @_ZTV1A, i64 0, i64 2) 56*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %cmp.vtables) 57*9880d681SAndroid Build Coastguard Worker br i1 %p, label %if.then, label %if.else 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 60*9880d681SAndroid Build Coastguard Worker %vtable1.cast = bitcast i8** %vtable to i32 (%struct.A*)** 61*9880d681SAndroid Build Coastguard Worker %2 = load i32 (%struct.A*)*, i32 (%struct.A*)** %vtable1.cast, align 8 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @_ZN1A3fooEv( 64*9880d681SAndroid Build Coastguard Worker %call2 = tail call i32 %2(%struct.A* %0) #1 65*9880d681SAndroid Build Coastguard Worker %vtable1 = load i8**, i8*** %1, align 8, !invariant.group !0 66*9880d681SAndroid Build Coastguard Worker %vtable2.cast = bitcast i8** %vtable1 to i32 (%struct.A*)** 67*9880d681SAndroid Build Coastguard Worker %call1 = load i32 (%struct.A*)*, i32 (%struct.A*)** %vtable2.cast, align 8 68*9880d681SAndroid Build Coastguard Worker; FIXME: those loads could be also direct, but right now the invariant.group 69*9880d681SAndroid Build Coastguard Worker; analysis works only on single block 70*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call i32 @_ZN1A3fooEv( 71*9880d681SAndroid Build Coastguard Worker %callx = tail call i32 %call1(%struct.A* %0) #1 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker %vtable2 = load i8**, i8*** %1, align 8, !invariant.group !0 74*9880d681SAndroid Build Coastguard Worker %vtable3.cast = bitcast i8** %vtable2 to i32 (%struct.A*)** 75*9880d681SAndroid Build Coastguard Worker %call4 = load i32 (%struct.A*)*, i32 (%struct.A*)** %vtable3.cast, align 8 76*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call i32 @_ZN1A3fooEv( 77*9880d681SAndroid Build Coastguard Worker %cally = tail call i32 %call4(%struct.A* %0) #1 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker %b = bitcast i8* %call to %struct.A** 80*9880d681SAndroid Build Coastguard Worker %vtable3 = load %struct.A*, %struct.A** %b, align 8, !invariant.group !0 81*9880d681SAndroid Build Coastguard Worker %vtable4.cast = bitcast %struct.A* %vtable3 to i32 (%struct.A*)** 82*9880d681SAndroid Build Coastguard Worker %vfun = load i32 (%struct.A*)*, i32 (%struct.A*)** %vtable4.cast, align 8 83*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call i32 @_ZN1A3fooEv( 84*9880d681SAndroid Build Coastguard Worker %unknown = tail call i32 %vfun(%struct.A* %0) #1 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker br label %if.end 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 89*9880d681SAndroid Build Coastguard Worker %vfn47 = getelementptr inbounds i8*, i8** %vtable, i64 1 90*9880d681SAndroid Build Coastguard Worker %vfn4 = bitcast i8** %vfn47 to i32 (%struct.A*)** 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker ; CHECK: call i32 @_ZN1A3barEv( 93*9880d681SAndroid Build Coastguard Worker %3 = load i32 (%struct.A*)*, i32 (%struct.A*)** %vfn4, align 8 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker %call5 = tail call i32 %3(%struct.A* %0) #1 96*9880d681SAndroid Build Coastguard Worker br label %if.end 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.else, %if.then 99*9880d681SAndroid Build Coastguard Worker ret void 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker; Checking const propagation in the same BB 104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @main() 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefine i32 @main() { 107*9880d681SAndroid Build Coastguard Workerentry: 108*9880d681SAndroid Build Coastguard Worker %call = tail call noalias i8* @_Znwm(i64 8) 109*9880d681SAndroid Build Coastguard Worker %0 = bitcast i8* %call to %struct.A* 110*9880d681SAndroid Build Coastguard Worker tail call void @_ZN1AC1Ev(%struct.A* %0) 111*9880d681SAndroid Build Coastguard Worker %1 = bitcast i8* %call to i8*** 112*9880d681SAndroid Build Coastguard Worker %vtable = load i8**, i8*** %1, align 8 113*9880d681SAndroid Build Coastguard Worker %cmp.vtables = icmp eq i8** %vtable, getelementptr inbounds ([4 x i8*], [4 x i8*]* @_ZTV1A, i64 0, i64 2) 114*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %cmp.vtables) 115*9880d681SAndroid Build Coastguard Worker %vtable1.cast = bitcast i8** %vtable to i32 (%struct.A*)** 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker ; CHECK: call i32 @_ZN1A3fooEv( 118*9880d681SAndroid Build Coastguard Worker %2 = load i32 (%struct.A*)*, i32 (%struct.A*)** %vtable1.cast, align 8 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker %call2 = tail call i32 %2(%struct.A* %0) 121*9880d681SAndroid Build Coastguard Worker ret i32 0 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; This tests checks const propatation with fcmp instruction. 125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define float @_Z1gf(float %p) 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workerdefine float @_Z1gf(float %p) { 128*9880d681SAndroid Build Coastguard Workerentry: 129*9880d681SAndroid Build Coastguard Worker %p.addr = alloca float, align 4 130*9880d681SAndroid Build Coastguard Worker %f = alloca float, align 4 131*9880d681SAndroid Build Coastguard Worker store float %p, float* %p.addr, align 4 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker store float 3.000000e+00, float* %f, align 4 134*9880d681SAndroid Build Coastguard Worker %0 = load float, float* %p.addr, align 4 135*9880d681SAndroid Build Coastguard Worker %1 = load float, float* %f, align 4 136*9880d681SAndroid Build Coastguard Worker %cmp = fcmp oeq float %1, %0 ; note const on lhs 137*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %cmp) 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker ; CHECK: ret float 3.000000e+00 140*9880d681SAndroid Build Coastguard Worker ret float %0 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define float @_Z1hf(float %p) 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdefine float @_Z1hf(float %p) { 146*9880d681SAndroid Build Coastguard Workerentry: 147*9880d681SAndroid Build Coastguard Worker %p.addr = alloca float, align 4 148*9880d681SAndroid Build Coastguard Worker store float %p, float* %p.addr, align 4 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker %0 = load float, float* %p.addr, align 4 151*9880d681SAndroid Build Coastguard Worker %cmp = fcmp nnan ueq float %0, 3.000000e+00 152*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %cmp) 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker ; CHECK: ret float 3.000000e+00 155*9880d681SAndroid Build Coastguard Worker ret float %0 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define float @_Z1if(float %p) 159*9880d681SAndroid Build Coastguard Workerdefine float @_Z1if(float %p) { 160*9880d681SAndroid Build Coastguard Workerentry: 161*9880d681SAndroid Build Coastguard Worker %p.addr = alloca float, align 4 162*9880d681SAndroid Build Coastguard Worker store float %p, float* %p.addr, align 4 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker %0 = load float, float* %p.addr, align 4 165*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ueq float %0, 3.000000e+00 ; no nnan flag - can't propagate 166*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %cmp) 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: ret float 3.000000e+00 169*9880d681SAndroid Build Coastguard Worker ret float %0 170*9880d681SAndroid Build Coastguard Worker} 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker; This test checks if constant propagation works for multiple node edges 173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @_Z1ii(i32 %p) 174*9880d681SAndroid Build Coastguard Workerdefine i32 @_Z1ii(i32 %p) { 175*9880d681SAndroid Build Coastguard Workerentry: 176*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %p, 42 177*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %cmp) 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker ; CHECK: br i1 true, label %bb2, label %bb2 180*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb2, label %bb2 181*9880d681SAndroid Build Coastguard Workerbb2: 182*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 true) 183*9880d681SAndroid Build Coastguard Worker ; CHECK: br i1 true, label %bb2, label %bb2 184*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb2, label %bb2 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Worker ; CHECK: ret i32 42 187*9880d681SAndroid Build Coastguard Worker ret i32 %p 188*9880d681SAndroid Build Coastguard Worker} 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @_Z1ij(i32 %p) 191*9880d681SAndroid Build Coastguard Workerdefine i32 @_Z1ij(i32 %p) { 192*9880d681SAndroid Build Coastguard Workerentry: 193*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %p, 42 194*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %cmp) 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker ; CHECK: br i1 true, label %bb2, label %bb2 197*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb2, label %bb2 198*9880d681SAndroid Build Coastguard Workerbb2: 199*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: %cmp2 = 200*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp eq i32 %p, 42 201*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: call void @llvm.assume( 202*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %cmp2) 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker ; CHECK: br i1 true, label %bb2, label %bb2 205*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb2, label %bb2 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker ; CHECK: ret i32 42 208*9880d681SAndroid Build Coastguard Worker ret i32 %p 209*9880d681SAndroid Build Coastguard Worker} 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @_Z1ik(i32 %p) 212*9880d681SAndroid Build Coastguard Workerdefine i32 @_Z1ik(i32 %p) { 213*9880d681SAndroid Build Coastguard Workerentry: 214*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %p, 42 215*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %cmp) 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Worker ; CHECK: br i1 true, label %bb2, label %bb3 218*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb2, label %bb3 219*9880d681SAndroid Build Coastguard Workerbb2: 220*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: %cmp3 = 221*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp eq i32 %p, 43 222*9880d681SAndroid Build Coastguard Worker ; CHECK: store i8 undef, i8* null 223*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %cmp3) 224*9880d681SAndroid Build Coastguard Worker ret i32 15 225*9880d681SAndroid Build Coastguard Workerbb3: 226*9880d681SAndroid Build Coastguard Worker ret i32 17 227*9880d681SAndroid Build Coastguard Worker} 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Worker; This test checks if GVN can do the constant propagation correctly 230*9880d681SAndroid Build Coastguard Worker; when there are multiple uses of the same assume value in the 231*9880d681SAndroid Build Coastguard Worker; basic block that has a loop back-edge pointing to itself. 232*9880d681SAndroid Build Coastguard Worker; 233*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @_Z1il(i32 %val, i1 %k) 234*9880d681SAndroid Build Coastguard Workerdefine i32 @_Z1il(i32 %val, i1 %k) { 235*9880d681SAndroid Build Coastguard Worker br label %next 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Workernext: 238*9880d681SAndroid Build Coastguard Worker; CHECK: tail call void @llvm.assume(i1 %k) 239*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %cmp = icmp eq i32 %val, 50 240*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %k) 241*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %k) 242*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %val, 50 243*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %next, label %meh 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workermeh: 246*9880d681SAndroid Build Coastguard Worker ret i32 0 247*9880d681SAndroid Build Coastguard Worker} 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker; This test checks if GVN can prevent the constant propagation correctly 250*9880d681SAndroid Build Coastguard Worker; in the successor blocks that are not dominated by the basic block 251*9880d681SAndroid Build Coastguard Worker; with the assume instruction. 252*9880d681SAndroid Build Coastguard Worker; 253*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i1 @_z1im(i32 %val, i1 %k, i1 %j) 254*9880d681SAndroid Build Coastguard Workerdefine i1 @_z1im(i32 %val, i1 %k, i1 %j) { 255*9880d681SAndroid Build Coastguard Worker br i1 %j, label %next, label %meh 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Workernext: 258*9880d681SAndroid Build Coastguard Worker; CHECK: tail call void @llvm.assume(i1 %k) 259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %meh 260*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %k) 261*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %k) 262*9880d681SAndroid Build Coastguard Worker br label %meh 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Workermeh: 265*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %k 266*9880d681SAndroid Build Coastguard Worker ret i1 %k 267*9880d681SAndroid Build Coastguard Worker} 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @_Znwm(i64) 270*9880d681SAndroid Build Coastguard Workerdeclare void @_ZN1AC1Ev(%struct.A*) 271*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.assume(i1) 272*9880d681SAndroid Build Coastguard Workerdeclare i32 @_ZN1A3fooEv(%struct.A*) 273*9880d681SAndroid Build Coastguard Workerdeclare i32 @_ZN1A3barEv(%struct.A*) 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Worker!0 = !{!"struct A"} 276