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=1 op1=2 17*6baaad74SWende Tan; CHECK: <FUNCTION_BLOCK 18*6baaad74SWende Tan; CHECK: <FUNCTION_BLOCK 19*6baaad74SWende Tan 20*6baaad74SWende Tandefine void @repro() { 21*6baaad74SWende Tan br label %label 22*6baaad74SWende Tan 23*6baaad74SWende Tanlabel: 24*6baaad74SWende Tan call void @fun() 25*6baaad74SWende Tan ret void 26*6baaad74SWende Tan} 27*6baaad74SWende Tan 28*6baaad74SWende Tandefine void @fun() noinline { 29*6baaad74SWende Tan call void @f(i64 add (i64 ptrtoint (i8* blockaddress(@repro, %label) to i64), i64 1)) 30*6baaad74SWende Tan ret void 31*6baaad74SWende Tan} 32*6baaad74SWende Tan 33*6baaad74SWende Tandefine void @fun2() noinline { 34*6baaad74SWende Tan call void @f(i64 add (i64 ptrtoint (i8* blockaddress(@repro, %label) to i64), i64 2)) 35*6baaad74SWende Tan ret void 36*6baaad74SWende Tan} 37*6baaad74SWende Tan 38*6baaad74SWende Tandeclare void @f(i64) 39