1*6baaad74SWende Tan; RUN: llvm-as %s -o %t.bc 2*6baaad74SWende Tan; RUN: llvm-bcanalyzer -dump %t.bc | FileCheck %s 3*6baaad74SWende Tan; RUN: llvm-dis %t.bc 4*6baaad74SWende Tan 5*6baaad74SWende Tan; There's a curious case where blockaddress constants may refer to functions 6*6baaad74SWende Tan; outside of the function they're used in. There's a special bitcode function 7*6baaad74SWende Tan; code, FUNC_CODE_BLOCKADDR_USERS, used to signify that this is the case. 8*6baaad74SWende Tan 9*6baaad74SWende Tan; The intent of this test is two-fold: 10*6baaad74SWende Tan; 1. Ensure we produce BLOCKADDR_USERS bitcode function code on the first fn, 11*6baaad74SWende Tan; @repro, since @fun and @fun2 both refer to @repro via blockaddress 12*6baaad74SWende Tan; constants. 13*6baaad74SWende Tan; 2. Ensure we can round-trip serializing+desearlizing such case. 14*6baaad74SWende Tan 15*6baaad74SWende Tan; CHECK: <FUNCTION_BLOCK 16*6baaad74SWende Tan; CHECK: <BLOCKADDR_USERS op0=2 op1=1 17*6baaad74SWende Tan; CHECK: <FUNCTION_BLOCK 18*6baaad74SWende Tan; CHECK: <FUNCTION_BLOCK 19*6baaad74SWende Tan 20*6baaad74SWende Tan%struct.ptrs = type { i8*, i8* } 21*6baaad74SWende Tan 22*6baaad74SWende Tandefine void @repro() { 23*6baaad74SWende Tan br label %label 24*6baaad74SWende Tan 25*6baaad74SWende Tanlabel: 26*6baaad74SWende Tan call void @fun() 27*6baaad74SWende Tan ret void 28*6baaad74SWende Tan} 29*6baaad74SWende Tan 30*6baaad74SWende Tandefine void @fun() noinline { 31*6baaad74SWende Tan call void @f(%struct.ptrs { i8* blockaddress(@repro, %label), i8* blockaddress(@repro, %label) }) 32*6baaad74SWende Tan ret void 33*6baaad74SWende Tan} 34*6baaad74SWende Tan 35*6baaad74SWende Tandefine void @fun2() noinline { 36*6baaad74SWende Tan call void @f(%struct.ptrs { i8* blockaddress(@repro, %label), i8* blockaddress(@repro, %label) }) 37*6baaad74SWende Tan ret void 38*6baaad74SWende Tan} 39*6baaad74SWende Tan 40*6baaad74SWende Tandeclare void @f(%struct.ptrs) 41