376 lines · plain
1; RUN: llc < %s -mcpu=generic -mtriple=i686-pc-linux-gnu -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,CHECK-I6862; RUN: llc < %s -mcpu=generic -mtriple=x86_64-pc-linux-gnux32 -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,CHECK-X323; RUN: llc < %s -mcpu=generic -mtriple=x86_64-pc-linux-gnux32 -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false -fast-isel -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,CHECK-X324 5@ptr = external global ptr 6@dst = external global i32 7@src = external global i32 8 9define void @test0() nounwind {10entry:11 store ptr @dst, ptr @ptr12 %tmp.s = load i32, ptr @src13 store i32 %tmp.s, ptr @dst14 ret void15 16; CHECK-LABEL: test0:17; CHECK-I686: calll .L0$pb18; CHECK-I686-NEXT: .L0$pb:19; CHECK-I686-NEXT: popl20; CHECK-I686: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L0$pb),21; CHECK-I686: movl dst@GOT(%eax),22; CHECK-I686: movl ptr@GOT(%eax),23; CHECK-I686: movl src@GOT(%eax),24; CHECK-I686: ret25; CHECK-X32-DAG: movl dst@GOTPCREL(%rip),26; CHECK-X32-DAG: movl ptr@GOTPCREL(%rip),27; CHECK-X32-DAG: movl src@GOTPCREL(%rip),28; CHECK-X32: retq29}30 31@ptr2 = global ptr null32@dst2 = global i32 033@src2 = global i32 034 35define void @test1() nounwind {36entry:37 store ptr @dst2, ptr @ptr238 %tmp.s = load i32, ptr @src239 store i32 %tmp.s, ptr @dst240 ret void41 42; CHECK-LABEL: test1:43; CHECK-I686: calll .L1$pb44; CHECK-I686-NEXT: .L1$pb:45; CHECK-I686-NEXT: popl46; CHECK-I686: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L1$pb), %eax47; CHECK-I686: movl dst2@GOT(%eax),48; CHECK-I686: movl ptr2@GOT(%eax),49; CHECK-I686: movl src2@GOT(%eax),50; CHECK-I686: ret51; CHECK-X32-DAG: movl dst2@GOTPCREL(%rip),52; CHECK-X32-DAG: movl ptr2@GOTPCREL(%rip),53; CHECK-X32-DAG: movl src2@GOTPCREL(%rip),54; CHECK-X32: retq55 56}57 58declare ptr @malloc(i32)59 60define void @test2() nounwind {61entry:62 %ptr = call ptr @malloc(i32 40)63 ret void64; CHECK-LABEL: test2:65; CHECK-I686: pushl %ebx66; CHECK-I686-NEXT: subl $8, %esp67; CHECK-I686-NEXT: calll .L2$pb68; CHECK-I686-NEXT: .L2$pb:69; CHECK-I686-NEXT: popl %ebx70; CHECK-I686: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L2$pb), %ebx71; CHECK-I686: movl $40, (%esp)72; CHECK-I686: calll malloc@PLT73; CHECK-I686: addl $8, %esp74; CHECK-I686: popl %ebx75; CHECK-I686: ret76; CHECK-X32: pushq %rax77; CHECK-X32: movl $40, %edi78; CHECK-X32: callq malloc@PLT79; CHECK-X32: popq %rax80; CHECK-X32: retq81 82}83 84@pfoo = external global ptr 85 86define void @test3() nounwind {87entry:88 %tmp = call ptr(...) @afoo()89 store ptr %tmp, ptr @pfoo90 %tmp1 = load ptr, ptr @pfoo91 call void(...) %tmp1()92 ret void93; CHECK-LABEL: test3:94; CHECK-I686: calll .L3$pb95; CHECK-I686-NEXT: .L3$pb:96; CHECK-I686: popl97; CHECK-I686: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L3$pb), %[[REG3:e..]]98; CHECK-I686: calll afoo@PLT99; CHECK-I686: movl pfoo@GOT(%[[REG3]]),100; CHECK-I686: calll *101; CHECK-X32: callq afoo@PLT102; CHECK-X32: movl pfoo@GOTPCREL(%rip),103; CHECK-X32: callq *104}105 106declare ptr @afoo(...)107 108define void @test4() nounwind {109entry:110 call void(...) @foo()111 ret void112; CHECK-LABEL: test4:113; CHECK-I686: calll .L4$pb114; CHECK-I686: popl %ebx115; CHECK-I686: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L4$pb), %ebx116; CHECK-I686: calll foo@PLT117; CHECK-X32: callq foo@PLT118 119}120 121declare void @foo(...)122 123 124@ptr6 = internal global ptr null125@dst6 = internal global i32 0126@src6 = internal global i32 0127 128define void @test5() nounwind {129entry:130 store ptr @dst6, ptr @ptr6131 %tmp.s = load i32, ptr @src6132 store i32 %tmp.s, ptr @dst6133 ret void134 135; CHECK-LABEL: test5:136; CHECK-I686: calll .L5$pb137; CHECK-I686-NEXT: .L5$pb:138; CHECK-I686-NEXT: popl %eax139; CHECK-I686: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L5$pb), %eax140; CHECK-I686: leal dst6@GOTOFF(%eax), %ecx141; CHECK-I686: movl %ecx, ptr6@GOTOFF(%eax)142; CHECK-I686: movl src6@GOTOFF(%eax), %ecx143; CHECK-I686: movl %ecx, dst6@GOTOFF(%eax)144; CHECK-I686: ret145; CHECK-X32: leal dst6(%rip), %eax146; CHECK-X32: movl %eax, ptr6(%rip)147; CHECK-X32: movl src6(%rip), %eax148; CHECK-X32: movl %eax, dst6(%rip)149; CHECK-X32: retq150}151 152 153;; Test constant pool references.154define double @test6(i32 %a.u) nounwind {155entry:156 %tmp = icmp eq i32 %a.u,0157 %retval = select i1 %tmp, double 4.561230e+02, double 1.234560e+02158 ret double %retval159 160; CHECK: .LCPI6_0:161 162; CHECK-LABEL: test6:163; CHECK-I686: calll .L6$pb164; CHECK-I686: .L6$pb:165; CHECK-I686: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L6$pb), 166; CHECK-I686: fldl .LCPI6_0@GOTOFF(167; CHECK-X32: .LCPI6_0(%rip),168}169 170 171;; Test jump table references.172define void @test7(i32 %n.u) nounwind {173entry:174 switch i32 %n.u, label %bb12 [i32 1, label %bb i32 2, label %bb6 i32 4, label %bb7 i32 5, label %bb8 i32 6, label %bb10 i32 7, label %bb1 i32 8, label %bb3 i32 9, label %bb4 i32 10, label %bb9 i32 11, label %bb2 i32 12, label %bb5 i32 13, label %bb11 ]175bb:176 tail call void(...) @foo1()177 ret void178bb1:179 tail call void(...) @foo2()180 ret void181bb2:182 tail call void(...) @foo6()183 ret void184bb3:185 tail call void(...) @foo3()186 ret void187bb4:188 tail call void(...) @foo4()189 ret void190bb5:191 tail call void(...) @foo5()192 ret void193bb6:194 tail call void(...) @foo1()195 ret void196bb7:197 tail call void(...) @foo2()198 ret void199bb8:200 tail call void(...) @foo6()201 ret void202bb9:203 tail call void(...) @foo3()204 ret void205bb10:206 tail call void(...) @foo4()207 ret void208bb11:209 tail call void(...) @foo5()210 ret void211bb12:212 tail call void(...) @foo6()213 ret void214 215; CHECK-LABEL: test7:216; CHECK-I686: calll .L7$pb217; CHECK-I686: .L7$pb:218; CHECK-I686: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L7$pb),219; CHECK-I686: .LJTI7_0@GOTOFF(220; CHECK-I686: jmpl *221; CHECK-X32: leal .LJTI7_0(%rip), %eax222; CHECK-X32: addl (%eax,%edi,4), %eax223; CHECK-X32: jmpq *%rax224 225; CHECK: .p2align 2226; CHECK-NEXT: .LJTI7_0:227; CHECK-I686: .long .LBB7_2@GOTOFF228; CHECK-I686: .long .LBB7_8@GOTOFF229; CHECK-I686: .long .LBB7_4@GOTOFF230; CHECK-I686: .long .LBB7_6@GOTOFF231; CHECK-I686: .long .LBB7_5@GOTOFF232; CHECK-I686: .long .LBB7_8@GOTOFF233; CHECK-I686: .long .LBB7_7@GOTOFF234; CHECK-X32: .long .LBB7_2-.LJTI7_0235; CHECK-X32: .long .LBB7_2-.LJTI7_0236; CHECK-X32: .long .LBB7_12-.LJTI7_0237; CHECK-X32: .long .LBB7_5-.LJTI7_0238; CHECK-X32: .long .LBB7_12-.LJTI7_0239; CHECK-X32: .long .LBB7_9-.LJTI7_0240; CHECK-X32: .long .LBB7_5-.LJTI7_0241; CHECK-X32: .long .LBB7_8-.LJTI7_0242; CHECK-X32: .long .LBB7_9-.LJTI7_0243; CHECK-X32: .long .LBB7_8-.LJTI7_0244; CHECK-X32: .long .LBB7_12-.LJTI7_0245; CHECK-X32: .long .LBB7_3-.LJTI7_0246; CHECK-X32: .long .LBB7_3-.LJTI7_0247}248 249declare void @foo1(...)250declare void @foo2(...)251declare void @foo6(...)252declare void @foo3(...)253declare void @foo4(...)254declare void @foo5(...)255 256;; Check TLS references257@tlsptrgd = thread_local global ptr null258@tlsdstgd = thread_local global i32 0259@tlssrcgd = thread_local global i32 0260@tlsptrld = thread_local(localdynamic) global ptr null261@tlsdstld = thread_local(localdynamic) global i32 0262@tlssrcld = thread_local(localdynamic) global i32 0263@tlsptrie = thread_local(initialexec) global ptr null264@tlsdstie = thread_local(initialexec) global i32 0265@tlssrcie = thread_local(initialexec) global i32 0266@tlsptrle = thread_local(localexec) global ptr null267@tlsdstle = thread_local(localexec) global i32 0268@tlssrcle = thread_local(localexec) global i32 0269 270define void @test8() nounwind {271entry:272 store ptr @tlsdstgd, ptr @tlsptrgd273 %tmp.s = load i32, ptr @tlssrcgd274 store i32 %tmp.s, ptr @tlsdstgd275 ret void276 277; CHECK-LABEL: test8:278; CHECK-I686: calll .L8$pb279; CHECK-I686-NEXT: .L8$pb:280; CHECK-I686-NEXT: popl281; CHECK-I686: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L8$pb), %ebx282; CHECK-I686-DAG: leal tlsdstgd@TLSGD(,%ebx), %eax283; CHECK-I686-DAG: calll ___tls_get_addr@PLT284; CHECK-I686-DAG: leal tlsptrgd@TLSGD(,%ebx), %eax285; CHECK-I686-DAG: calll ___tls_get_addr@PLT286; CHECK-I686-DAG: leal tlssrcgd@TLSGD(,%ebx), %eax287; CHECK-I686-DAG: calll ___tls_get_addr@PLT288; CHECK-X32-NOT: data16289; CHECK-X32-DAG: leaq tlsdstgd@TLSGD(%rip), %rdi290; CHECK-X32-DAG: callq __tls_get_addr@PLT291; CHECK-X32-DAG: leaq tlsptrgd@TLSGD(%rip), %rdi292; CHECK-X32-DAG: callq __tls_get_addr@PLT293; CHECK-X32-DAG: leaq tlssrcgd@TLSGD(%rip), %rdi294; CHECK-X32-DAG: callq __tls_get_addr@PLT295; CHECK-I686: ret296; CHECK-X32: retq297}298 299define void @test9() nounwind {300entry:301 store ptr @tlsdstld, ptr @tlsptrld302 %tmp.s = load i32, ptr @tlssrcld303 store i32 %tmp.s, ptr @tlsdstld304 ret void305 306; CHECK-LABEL: test9:307; CHECK-I686: calll .L9$pb308; CHECK-I686-NEXT: .L9$pb:309; CHECK-I686-NEXT: popl310; CHECK-I686: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L9$pb), %ebx311; CHECK-I686: leal tlsdstld@TLSLDM(%ebx), %eax312; CHECK-X32: leaq tlsdstld@TLSLD(%rip), %rdi313; CHECK-I686: calll ___tls_get_addr@PLT314; CHECK-X32: callq __tls_get_addr@PLT315; CHECK: leal tlsdstld@DTPOFF(316; CHECK: movl {{%.*}}, tlsptrld@DTPOFF(317; CHECK: movl tlssrcld@DTPOFF(318; CHECK: movl {{%.*}}, tlsdstld@DTPOFF(319; CHECK-I686: ret320; CHECK-X32: retq321}322 323define void @test10() nounwind {324entry:325 store ptr @tlsdstie, ptr @tlsptrie326 %tmp.s = load i32, ptr @tlssrcie327 store i32 %tmp.s, ptr @tlsdstie328 ret void329 330; CHECK-LABEL: test10:331; CHECK-I686: calll .L10$pb332; CHECK-I686-NEXT: .L10$pb:333; CHECK-I686-NEXT: popl334; CHECK-I686: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L10$pb),335; CHECK-I686-DAG: movl tlsdstie@GOTNTPOFF(336; CHECK-I686-DAG: movl %gs:0,337; CHECK-X32-DAG: movl tlsdstie@GOTTPOFF(%rip),338; CHECK-X32-DAG: movl %fs:0,339; CHECK-I686: addl340; CHECK-X32: leal ({{%.*,%.*}}),341; CHECK-I686: movl tlsptrie@GOTNTPOFF(342; CHECK-X32: movl tlsptrie@GOTTPOFF(%rip),343; CHECK-I686: movl {{%.*}}, %gs:(344; CHECK-X32: movl {{%.*}}, ({{%.*,%.*}})345; CHECK-I686: movl tlssrcie@GOTNTPOFF(346; CHECK-X32: movl tlssrcie@GOTTPOFF(%rip),347; CHECK-I686: movl %gs:(348; CHECK-X32: movl ({{%.*,%.*}}),349; CHECK-I686: movl {{%.*}}, %gs:(350; CHECK-X32: movl {{%.*}}, ({{%.*,%.*}})351; CHECK-I686: ret352; CHECK-X32: retq353}354 355define void @test11() nounwind {356entry:357 store ptr @tlsdstle, ptr @tlsptrle358 %tmp.s = load i32, ptr @tlssrcle359 store i32 %tmp.s, ptr @tlsdstle360 ret void361 362; CHECK-LABEL: test11:363; CHECK-I686: movl %gs:0,364; CHECK-X32: movl %fs:0,365; CHECK-I686: leal tlsdstle@NTPOFF(366; CHECK-X32: leal tlsdstle@TPOFF(367; CHECK-I686: movl {{%.*}}, %gs:tlsptrle@NTPOFF368; CHECK-X32: movl {{%.*}}, %fs:tlsptrle@TPOFF369; CHECK-I686: movl %gs:tlssrcle@NTPOFF,370; CHECK-X32: movl %fs:tlssrcle@TPOFF,371; CHECK-I686: movl {{%.*}}, %gs:tlsdstle@NTPOFF372; CHECK-X32: movl {{%.*}}, %fs:tlsdstle@TPOFF373; CHECK-I686: ret374; CHECK-X32: retq375}376