1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=generic -mtriple=i686-pc-linux-gnu -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false | FileCheck %s -check-prefix=LINUX 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker@ptr = external global i32* 4*9880d681SAndroid Build Coastguard Worker@dst = external global i32 5*9880d681SAndroid Build Coastguard Worker@src = external global i32 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine void @test0() nounwind { 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker store i32* @dst, i32** @ptr 10*9880d681SAndroid Build Coastguard Worker %tmp.s = load i32, i32* @src 11*9880d681SAndroid Build Coastguard Worker store i32 %tmp.s, i32* @dst 12*9880d681SAndroid Build Coastguard Worker ret void 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test0: 15*9880d681SAndroid Build Coastguard Worker; LINUX: calll .L0$pb 16*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .L0$pb: 17*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: popl 18*9880d681SAndroid Build Coastguard Worker; LINUX: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L0$pb), 19*9880d681SAndroid Build Coastguard Worker; LINUX: movl dst@GOT(%eax), 20*9880d681SAndroid Build Coastguard Worker; LINUX: movl ptr@GOT(%eax), 21*9880d681SAndroid Build Coastguard Worker; LINUX: movl src@GOT(%eax), 22*9880d681SAndroid Build Coastguard Worker; LINUX: ret 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker@ptr2 = global i32* null 26*9880d681SAndroid Build Coastguard Worker@dst2 = global i32 0 27*9880d681SAndroid Build Coastguard Worker@src2 = global i32 0 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine void @test1() nounwind { 30*9880d681SAndroid Build Coastguard Workerentry: 31*9880d681SAndroid Build Coastguard Worker store i32* @dst2, i32** @ptr2 32*9880d681SAndroid Build Coastguard Worker %tmp.s = load i32, i32* @src2 33*9880d681SAndroid Build Coastguard Worker store i32 %tmp.s, i32* @dst2 34*9880d681SAndroid Build Coastguard Worker ret void 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test1: 37*9880d681SAndroid Build Coastguard Worker; LINUX: calll .L1$pb 38*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .L1$pb: 39*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: popl 40*9880d681SAndroid Build Coastguard Worker; LINUX: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L1$pb), %eax 41*9880d681SAndroid Build Coastguard Worker; LINUX: movl dst2@GOT(%eax), 42*9880d681SAndroid Build Coastguard Worker; LINUX: movl ptr2@GOT(%eax), 43*9880d681SAndroid Build Coastguard Worker; LINUX: movl src2@GOT(%eax), 44*9880d681SAndroid Build Coastguard Worker; LINUX: ret 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdeclare i8* @malloc(i32) 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine void @test2() nounwind { 51*9880d681SAndroid Build Coastguard Workerentry: 52*9880d681SAndroid Build Coastguard Worker %ptr = call i8* @malloc(i32 40) 53*9880d681SAndroid Build Coastguard Worker ret void 54*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test2: 55*9880d681SAndroid Build Coastguard Worker; LINUX: pushl %ebx 56*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: subl $8, %esp 57*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: calll .L2$pb 58*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .L2$pb: 59*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: popl %ebx 60*9880d681SAndroid Build Coastguard Worker; LINUX: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L2$pb), %ebx 61*9880d681SAndroid Build Coastguard Worker; LINUX: movl $40, (%esp) 62*9880d681SAndroid Build Coastguard Worker; LINUX: calll malloc@PLT 63*9880d681SAndroid Build Coastguard Worker; LINUX: addl $8, %esp 64*9880d681SAndroid Build Coastguard Worker; LINUX: popl %ebx 65*9880d681SAndroid Build Coastguard Worker; LINUX: ret 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker@pfoo = external global void(...)* 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdefine void @test3() nounwind { 71*9880d681SAndroid Build Coastguard Workerentry: 72*9880d681SAndroid Build Coastguard Worker %tmp = call void(...)*(...) @afoo() 73*9880d681SAndroid Build Coastguard Worker store void(...)* %tmp, void(...)** @pfoo 74*9880d681SAndroid Build Coastguard Worker %tmp1 = load void(...)*, void(...)** @pfoo 75*9880d681SAndroid Build Coastguard Worker call void(...) %tmp1() 76*9880d681SAndroid Build Coastguard Worker ret void 77*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test3: 78*9880d681SAndroid Build Coastguard Worker; LINUX: calll .L3$pb 79*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .L3$pb: 80*9880d681SAndroid Build Coastguard Worker; LINUX: popl 81*9880d681SAndroid Build Coastguard Worker; LINUX: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L3$pb), %[[REG3:e..]] 82*9880d681SAndroid Build Coastguard Worker; LINUX: calll afoo@PLT 83*9880d681SAndroid Build Coastguard Worker; LINUX: movl pfoo@GOT(%[[REG3]]), 84*9880d681SAndroid Build Coastguard Worker; LINUX: calll * 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdeclare void(...)* @afoo(...) 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine void @test4() nounwind { 90*9880d681SAndroid Build Coastguard Workerentry: 91*9880d681SAndroid Build Coastguard Worker call void(...) @foo() 92*9880d681SAndroid Build Coastguard Worker ret void 93*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test4: 94*9880d681SAndroid Build Coastguard Worker; LINUX: calll .L4$pb 95*9880d681SAndroid Build Coastguard Worker; LINUX: popl %ebx 96*9880d681SAndroid Build Coastguard Worker; LINUX: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L4$pb), %ebx 97*9880d681SAndroid Build Coastguard Worker; LINUX: calll foo@PLT 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerdeclare void @foo(...) 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker@ptr6 = internal global i32* null 104*9880d681SAndroid Build Coastguard Worker@dst6 = internal global i32 0 105*9880d681SAndroid Build Coastguard Worker@src6 = internal global i32 0 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdefine void @test5() nounwind { 108*9880d681SAndroid Build Coastguard Workerentry: 109*9880d681SAndroid Build Coastguard Worker store i32* @dst6, i32** @ptr6 110*9880d681SAndroid Build Coastguard Worker %tmp.s = load i32, i32* @src6 111*9880d681SAndroid Build Coastguard Worker store i32 %tmp.s, i32* @dst6 112*9880d681SAndroid Build Coastguard Worker ret void 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test5: 115*9880d681SAndroid Build Coastguard Worker; LINUX: calll .L5$pb 116*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .L5$pb: 117*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: popl %eax 118*9880d681SAndroid Build Coastguard Worker; LINUX: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L5$pb), %eax 119*9880d681SAndroid Build Coastguard Worker; LINUX: leal dst6@GOTOFF(%eax), %ecx 120*9880d681SAndroid Build Coastguard Worker; LINUX: movl %ecx, ptr6@GOTOFF(%eax) 121*9880d681SAndroid Build Coastguard Worker; LINUX: movl src6@GOTOFF(%eax), %ecx 122*9880d681SAndroid Build Coastguard Worker; LINUX: movl %ecx, dst6@GOTOFF(%eax) 123*9880d681SAndroid Build Coastguard Worker; LINUX: ret 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker;; Test constant pool references. 128*9880d681SAndroid Build Coastguard Workerdefine double @test6(i32 %a.u) nounwind { 129*9880d681SAndroid Build Coastguard Workerentry: 130*9880d681SAndroid Build Coastguard Worker %tmp = icmp eq i32 %a.u,0 131*9880d681SAndroid Build Coastguard Worker %retval = select i1 %tmp, double 4.561230e+02, double 1.234560e+02 132*9880d681SAndroid Build Coastguard Worker ret double %retval 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker; LINUX: .LCPI6_0: 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test6: 137*9880d681SAndroid Build Coastguard Worker; LINUX: calll .L6$pb 138*9880d681SAndroid Build Coastguard Worker; LINUX: .L6$pb: 139*9880d681SAndroid Build Coastguard Worker; LINUX: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L6$pb), 140*9880d681SAndroid Build Coastguard Worker; LINUX: fldl .LCPI6_0@GOTOFF( 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker;; Test jump table references. 145*9880d681SAndroid Build Coastguard Workerdefine void @test7(i32 %n.u) nounwind { 146*9880d681SAndroid Build Coastguard Workerentry: 147*9880d681SAndroid Build Coastguard Worker 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 ] 148*9880d681SAndroid Build Coastguard Workerbb: 149*9880d681SAndroid Build Coastguard Worker tail call void(...) @foo1() 150*9880d681SAndroid Build Coastguard Worker ret void 151*9880d681SAndroid Build Coastguard Workerbb1: 152*9880d681SAndroid Build Coastguard Worker tail call void(...) @foo2() 153*9880d681SAndroid Build Coastguard Worker ret void 154*9880d681SAndroid Build Coastguard Workerbb2: 155*9880d681SAndroid Build Coastguard Worker tail call void(...) @foo6() 156*9880d681SAndroid Build Coastguard Worker ret void 157*9880d681SAndroid Build Coastguard Workerbb3: 158*9880d681SAndroid Build Coastguard Worker tail call void(...) @foo3() 159*9880d681SAndroid Build Coastguard Worker ret void 160*9880d681SAndroid Build Coastguard Workerbb4: 161*9880d681SAndroid Build Coastguard Worker tail call void(...) @foo4() 162*9880d681SAndroid Build Coastguard Worker ret void 163*9880d681SAndroid Build Coastguard Workerbb5: 164*9880d681SAndroid Build Coastguard Worker tail call void(...) @foo5() 165*9880d681SAndroid Build Coastguard Worker ret void 166*9880d681SAndroid Build Coastguard Workerbb6: 167*9880d681SAndroid Build Coastguard Worker tail call void(...) @foo1() 168*9880d681SAndroid Build Coastguard Worker ret void 169*9880d681SAndroid Build Coastguard Workerbb7: 170*9880d681SAndroid Build Coastguard Worker tail call void(...) @foo2() 171*9880d681SAndroid Build Coastguard Worker ret void 172*9880d681SAndroid Build Coastguard Workerbb8: 173*9880d681SAndroid Build Coastguard Worker tail call void(...) @foo6() 174*9880d681SAndroid Build Coastguard Worker ret void 175*9880d681SAndroid Build Coastguard Workerbb9: 176*9880d681SAndroid Build Coastguard Worker tail call void(...) @foo3() 177*9880d681SAndroid Build Coastguard Worker ret void 178*9880d681SAndroid Build Coastguard Workerbb10: 179*9880d681SAndroid Build Coastguard Worker tail call void(...) @foo4() 180*9880d681SAndroid Build Coastguard Worker ret void 181*9880d681SAndroid Build Coastguard Workerbb11: 182*9880d681SAndroid Build Coastguard Worker tail call void(...) @foo5() 183*9880d681SAndroid Build Coastguard Worker ret void 184*9880d681SAndroid Build Coastguard Workerbb12: 185*9880d681SAndroid Build Coastguard Worker tail call void(...) @foo6() 186*9880d681SAndroid Build Coastguard Worker ret void 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test7: 189*9880d681SAndroid Build Coastguard Worker; LINUX: calll .L7$pb 190*9880d681SAndroid Build Coastguard Worker; LINUX: .L7$pb: 191*9880d681SAndroid Build Coastguard Worker; LINUX: addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L7$pb), 192*9880d681SAndroid Build Coastguard Worker; LINUX: .LJTI7_0@GOTOFF( 193*9880d681SAndroid Build Coastguard Worker; LINUX: jmpl * 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Worker; LINUX: .p2align 2 196*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .LJTI7_0: 197*9880d681SAndroid Build Coastguard Worker; LINUX: .long .LBB7_2@GOTOFF 198*9880d681SAndroid Build Coastguard Worker; LINUX: .long .LBB7_8@GOTOFF 199*9880d681SAndroid Build Coastguard Worker; LINUX: .long .LBB7_4@GOTOFF 200*9880d681SAndroid Build Coastguard Worker; LINUX: .long .LBB7_6@GOTOFF 201*9880d681SAndroid Build Coastguard Worker; LINUX: .long .LBB7_5@GOTOFF 202*9880d681SAndroid Build Coastguard Worker; LINUX: .long .LBB7_8@GOTOFF 203*9880d681SAndroid Build Coastguard Worker; LINUX: .long .LBB7_7@GOTOFF 204*9880d681SAndroid Build Coastguard Worker} 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Workerdeclare void @foo1(...) 207*9880d681SAndroid Build Coastguard Workerdeclare void @foo2(...) 208*9880d681SAndroid Build Coastguard Workerdeclare void @foo6(...) 209*9880d681SAndroid Build Coastguard Workerdeclare void @foo3(...) 210*9880d681SAndroid Build Coastguard Workerdeclare void @foo4(...) 211*9880d681SAndroid Build Coastguard Workerdeclare void @foo5(...) 212