; RUN: llvm-as %s -o %t.bc ; RUN: llvm-link %t.bc -S | FileCheck %s declare void @f(ptr) ; Test that a blockaddress in @y referring to %label in @x can be moved when @y ; appears after @x. define void @x() { br label %label label: call void @y() ret void } define void @y() { ; CHECK: define void @y() { ; CHECK-NEXT: call void @f(ptr blockaddress(@x, %label)) call void @f(ptr blockaddress(@x, %label)) ret void } ; Test that a blockaddress in @a referring to %label in @b can be moved when @a ; appears before @b. define void @a() { ; CHECK: define void @a() { ; CHECK-NEXT: call void @f(ptr blockaddress(@b, %label)) call void @f(ptr blockaddress(@b, %label)) ret void } define void @b() { br label %label label: call void @a() ret void } ; Test that @c and @d can both have blockaddress Constants that refer to one ; another. define void @c() { ; CHECK: define void @c() { ; CHECK-NEXT: br label %label ; CHECK-EMPTY: ; CHECK-NEXT: label: ; CHECK-NEXT: call void @f(ptr blockaddress(@d, %label)) br label %label label: call void @f(ptr blockaddress(@d, %label)) ret void } define void @d() { ; CHECK: define void @d() { ; CHECK-NEXT: br label %label ; CHECK-EMPTY: ; CHECK-NEXT: label: ; CHECK-NEXT: call void @f(ptr blockaddress(@c, %label)) br label %label label: call void @f(ptr blockaddress(@c, %label)) ret void } ; Test that Functions added to IRLinker's Worklist member lazily (linkonce_odr) ; aren't susceptible to the the same issues as @x/@y above. define void @parsed() { br label %label label: ret void } define linkonce_odr void @lazy() { ; CHECK: define linkonce_odr void @lazy() { ; CHECK-NEXT: br label %label ; CHECK-EMPTY: ; CHECK-NEXT: label: ; CHECK-NEXT: call void @f(ptr blockaddress(@parsed, %label)) br label %label label: call void @f(ptr blockaddress(@parsed, %label)) ret void } define void @parsed2() { call void @lazy() ret void } ; Same test as @lazy, just with one more level of lazy parsed functions. define void @parsed3() { br label %label label: ret void } define linkonce_odr void @lazy1() { ; CHECK: define linkonce_odr void @lazy1() { ; CHECK-NEXT: br label %label ; CHECK-EMPTY: ; CHECK-NEXT: label: ; CHECK-NEXT: call void @f(ptr blockaddress(@parsed3, %label)) br label %label label: call void @f(ptr blockaddress(@parsed3, %label)) ret void } define linkonce_odr void @lazy2() { call void @lazy1() ret void } define void @parsed4() { call void @lazy2() ret void }