brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 0e5f9bf Raw
126 lines · plain
1; RUN: llvm-as %s -o %t.bc2; RUN: llvm-link %t.bc -S | FileCheck %s3 4declare void @f(ptr)5 6; Test that a blockaddress in @y referring to %label in @x can be moved when @y7; appears after @x.8define void @x() {9  br label %label10 11label:12  call void @y()13  ret void14}15 16define void @y() {17; CHECK: define void @y() {18; CHECK-NEXT: call void @f(ptr blockaddress(@x, %label))19  call void @f(ptr blockaddress(@x, %label))20  ret void21}22 23; Test that a blockaddress in @a referring to %label in @b can be moved when @a24; appears before @b.25define void @a() {26; CHECK: define void @a() {27; CHECK-NEXT: call void @f(ptr blockaddress(@b, %label))28  call void @f(ptr blockaddress(@b, %label))29  ret void30}31 32define void @b() {33  br label %label34 35label:36  call void @a()37  ret void38}39 40; Test that @c and @d can both have blockaddress Constants that refer to one41; another.42 43define void @c() {44; CHECK: define void @c() {45; CHECK-NEXT:  br label %label46; CHECK-EMPTY:47; CHECK-NEXT: label:48; CHECK-NEXT: call void @f(ptr blockaddress(@d, %label))49  br label %label50 51label:52  call void @f(ptr blockaddress(@d, %label))53  ret void54}55 56define void @d() {57; CHECK: define void @d() {58; CHECK-NEXT:  br label %label59; CHECK-EMPTY:60; CHECK-NEXT: label:61; CHECK-NEXT: call void @f(ptr blockaddress(@c, %label))62  br label %label63 64label:65  call void @f(ptr blockaddress(@c, %label))66  ret void67}68 69; Test that Functions added to IRLinker's Worklist member lazily (linkonce_odr)70; aren't susceptible to the the same issues as @x/@y above.71define void @parsed() {72  br label %label73 74label:75  ret void76}77 78define linkonce_odr void @lazy() {79; CHECK: define linkonce_odr void @lazy() {80; CHECK-NEXT: br label %label81; CHECK-EMPTY:82; CHECK-NEXT: label:83; CHECK-NEXT: call void @f(ptr blockaddress(@parsed, %label))84  br label %label85 86label:87  call void @f(ptr blockaddress(@parsed, %label))88  ret void89}90 91define void @parsed2() {92  call void @lazy()93  ret void94}95 96; Same test as @lazy, just with one more level of lazy parsed functions.97define void @parsed3() {98  br label %label99 100label:101  ret void102}103 104define linkonce_odr void @lazy1() {105; CHECK: define linkonce_odr void @lazy1() {106; CHECK-NEXT: br label %label107; CHECK-EMPTY:108; CHECK-NEXT: label:109; CHECK-NEXT: call void @f(ptr blockaddress(@parsed3, %label))110  br label %label111 112label:113  call void @f(ptr blockaddress(@parsed3, %label))114  ret void115}116 117define linkonce_odr void @lazy2() {118  call void @lazy1()119  ret void120}121 122define void @parsed4() {123  call void @lazy2()124  ret void125}126