1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -mcpu=pwr7 -code-model=medium -filetype=obj -fast-isel=false %s -o - | \ 2*9880d681SAndroid Build Coastguard Worker; RUN: llvm-readobj -r | FileCheck -check-prefix=MEDIUM %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -mcpu=pwr7 -code-model=large -filetype=obj -fast-isel=false %s -o - | \ 4*9880d681SAndroid Build Coastguard Worker; RUN: llvm-readobj -r | FileCheck -check-prefix=LARGE %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; Run jump table test separately since jump tables aren't generated at -O0. 7*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=pwr7 -code-model=medium -filetype=obj -fast-isel=false %s -o - | \ 8*9880d681SAndroid Build Coastguard Worker; RUN: llvm-readobj -r | FileCheck -check-prefix=MEDIUM-JT %s 9*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=pwr7 -code-model=large -filetype=obj -fast-isel=false %s -o - | \ 10*9880d681SAndroid Build Coastguard Worker; RUN: llvm-readobj -r | FileCheck -check-prefix=LARGE-JT %s 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; FIXME: When asm-parse is available, could make this an assembly test. 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" 15*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64-unknown-linux-gnu" 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker@ei = external global i32 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine signext i32 @test_external() nounwind { 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @ei, align 4 22*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 23*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* @ei, align 4 24*9880d681SAndroid Build Coastguard Worker ret i32 %0 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for 28*9880d681SAndroid Build Coastguard Worker; accessing external variable ei. 29*9880d681SAndroid Build Coastguard Worker; 30*9880d681SAndroid Build Coastguard Worker; MEDIUM: Relocations [ 31*9880d681SAndroid Build Coastguard Worker; MEDIUM: Section {{.*}} .rela.text { 32*9880d681SAndroid Build Coastguard Worker; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM1:[^ ]+]] 33*9880d681SAndroid Build Coastguard Worker; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM1]] 34*9880d681SAndroid Build Coastguard Worker; 35*9880d681SAndroid Build Coastguard Worker; LARGE: Relocations [ 36*9880d681SAndroid Build Coastguard Worker; LARGE: Section {{.*}} .rela.text { 37*9880d681SAndroid Build Coastguard Worker; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM1:[^ ]+]] 38*9880d681SAndroid Build Coastguard Worker; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM1]] 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker@test_fn_static.si = internal global i32 0, align 4 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine signext i32 @test_fn_static() nounwind { 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @test_fn_static.si, align 4 45*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 46*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* @test_fn_static.si, align 4 47*9880d681SAndroid Build Coastguard Worker ret i32 %0 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO for 51*9880d681SAndroid Build Coastguard Worker; accessing function-scoped variable si. 52*9880d681SAndroid Build Coastguard Worker; 53*9880d681SAndroid Build Coastguard Worker; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM2:[^ ]+]] 54*9880d681SAndroid Build Coastguard Worker; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO [[SYM2]] 55*9880d681SAndroid Build Coastguard Worker; 56*9880d681SAndroid Build Coastguard Worker; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for 57*9880d681SAndroid Build Coastguard Worker; accessing function-scoped variable si. 58*9880d681SAndroid Build Coastguard Worker; 59*9880d681SAndroid Build Coastguard Worker; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM2:[^ ]+]] 60*9880d681SAndroid Build Coastguard Worker; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM2]] 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker@gi = global i32 5, align 4 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerdefine signext i32 @test_file_static() nounwind { 65*9880d681SAndroid Build Coastguard Workerentry: 66*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @gi, align 4 67*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 68*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* @gi, align 4 69*9880d681SAndroid Build Coastguard Worker ret i32 %0 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO for 73*9880d681SAndroid Build Coastguard Worker; accessing file-scope variable gi. 74*9880d681SAndroid Build Coastguard Worker; 75*9880d681SAndroid Build Coastguard Worker; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM3:[^ ]+]] 76*9880d681SAndroid Build Coastguard Worker; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO [[SYM3]] 77*9880d681SAndroid Build Coastguard Worker; 78*9880d681SAndroid Build Coastguard Worker; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for 79*9880d681SAndroid Build Coastguard Worker; accessing file-scope variable gi. 80*9880d681SAndroid Build Coastguard Worker; 81*9880d681SAndroid Build Coastguard Worker; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM3:[^ ]+]] 82*9880d681SAndroid Build Coastguard Worker; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM3]] 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdefine double @test_double_const() nounwind { 85*9880d681SAndroid Build Coastguard Workerentry: 86*9880d681SAndroid Build Coastguard Worker ret double 0x3F4FD4920B498CF0 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO for 90*9880d681SAndroid Build Coastguard Worker; accessing a constant. 91*9880d681SAndroid Build Coastguard Worker; 92*9880d681SAndroid Build Coastguard Worker; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM4:[^ ]+]] 93*9880d681SAndroid Build Coastguard Worker; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO [[SYM4]] 94*9880d681SAndroid Build Coastguard Worker; 95*9880d681SAndroid Build Coastguard Worker; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for 96*9880d681SAndroid Build Coastguard Worker; accessing a constant. 97*9880d681SAndroid Build Coastguard Worker; 98*9880d681SAndroid Build Coastguard Worker; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM4:[^ ]+]] 99*9880d681SAndroid Build Coastguard Worker; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM4]] 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker@ti = common global i32 0, align 4 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdefine signext i32 @test_tentative() nounwind { 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @ti, align 4 106*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 107*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* @ti, align 4 108*9880d681SAndroid Build Coastguard Worker ret i32 %0 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for 112*9880d681SAndroid Build Coastguard Worker; accessing tentatively declared variable ti. 113*9880d681SAndroid Build Coastguard Worker; 114*9880d681SAndroid Build Coastguard Worker; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM6:[^ ]+]] 115*9880d681SAndroid Build Coastguard Worker; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM6]] 116*9880d681SAndroid Build Coastguard Worker; 117*9880d681SAndroid Build Coastguard Worker; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM6:[^ ]+]] 118*9880d681SAndroid Build Coastguard Worker; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM6]] 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdefine i8* @test_fnaddr() nounwind { 121*9880d681SAndroid Build Coastguard Workerentry: 122*9880d681SAndroid Build Coastguard Worker %func = alloca i32 (i32)*, align 8 123*9880d681SAndroid Build Coastguard Worker store i32 (i32)* @foo, i32 (i32)** %func, align 8 124*9880d681SAndroid Build Coastguard Worker %0 = load i32 (i32)*, i32 (i32)** %func, align 8 125*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32 (i32)* %0 to i8* 126*9880d681SAndroid Build Coastguard Worker ret i8* %1 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workerdeclare signext i32 @foo(i32 signext) 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for 132*9880d681SAndroid Build Coastguard Worker; accessing function address foo. 133*9880d681SAndroid Build Coastguard Worker; 134*9880d681SAndroid Build Coastguard Worker; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM7:[^ ]+]] 135*9880d681SAndroid Build Coastguard Worker; MEDIUM-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM7]] 136*9880d681SAndroid Build Coastguard Worker; 137*9880d681SAndroid Build Coastguard Worker; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM7:[^ ]+]] 138*9880d681SAndroid Build Coastguard Worker; LARGE-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM7]] 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdefine signext i32 @test_jump_table(i32 signext %i) nounwind { 142*9880d681SAndroid Build Coastguard Workerentry: 143*9880d681SAndroid Build Coastguard Worker %i.addr = alloca i32, align 4 144*9880d681SAndroid Build Coastguard Worker store i32 %i, i32* %i.addr, align 4 145*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %i.addr, align 4 146*9880d681SAndroid Build Coastguard Worker switch i32 %0, label %sw.default [ 147*9880d681SAndroid Build Coastguard Worker i32 3, label %sw.bb 148*9880d681SAndroid Build Coastguard Worker i32 4, label %sw.bb1 149*9880d681SAndroid Build Coastguard Worker i32 5, label %sw.bb2 150*9880d681SAndroid Build Coastguard Worker i32 6, label %sw.bb3 151*9880d681SAndroid Build Coastguard Worker ] 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Workersw.default: ; preds = %entry 154*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workersw.bb: ; preds = %entry 157*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %i.addr, align 4 158*9880d681SAndroid Build Coastguard Worker %mul = mul nsw i32 %1, 7 159*9880d681SAndroid Build Coastguard Worker store i32 %mul, i32* %i.addr, align 4 160*9880d681SAndroid Build Coastguard Worker br label %sw.bb1 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workersw.bb1: ; preds = %entry, %sw.bb 163*9880d681SAndroid Build Coastguard Worker %2 = load i32, i32* %i.addr, align 4 164*9880d681SAndroid Build Coastguard Worker %dec = add nsw i32 %2, -1 165*9880d681SAndroid Build Coastguard Worker store i32 %dec, i32* %i.addr, align 4 166*9880d681SAndroid Build Coastguard Worker br label %sw.bb2 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workersw.bb2: ; preds = %entry, %sw.bb1 169*9880d681SAndroid Build Coastguard Worker %3 = load i32, i32* %i.addr, align 4 170*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %3, 3 171*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* %i.addr, align 4 172*9880d681SAndroid Build Coastguard Worker br label %sw.bb3 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Workersw.bb3: ; preds = %entry, %sw.bb2 175*9880d681SAndroid Build Coastguard Worker %4 = load i32, i32* %i.addr, align 4 176*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %4, 1 177*9880d681SAndroid Build Coastguard Worker store i32 %shl, i32* %i.addr, align 4 178*9880d681SAndroid Build Coastguard Worker br label %sw.epilog 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Workersw.epilog: ; preds = %sw.bb3, %sw.default 181*9880d681SAndroid Build Coastguard Worker %5 = load i32, i32* %i.addr, align 4 182*9880d681SAndroid Build Coastguard Worker ret i32 %5 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker; Verify generation of R_PPC64_TOC16_HA and R_PPC64_TOC16_LO_DS for 186*9880d681SAndroid Build Coastguard Worker; accessing a jump table address. 187*9880d681SAndroid Build Coastguard Worker; 188*9880d681SAndroid Build Coastguard Worker; MEDIUM-JT: Relocations [ 189*9880d681SAndroid Build Coastguard Worker; MEDIUM-JT: Section ({{.*}}) .rela.text { 190*9880d681SAndroid Build Coastguard Worker; MEDIUM-JT-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM:[^ ]+]] 191*9880d681SAndroid Build Coastguard Worker; MEDIUM-JT-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM]] 192*9880d681SAndroid Build Coastguard Worker; 193*9880d681SAndroid Build Coastguard Worker; LARGE-JT: Relocations [ 194*9880d681SAndroid Build Coastguard Worker; LARGE-JT: Section ({{.*}}) .rela.text { 195*9880d681SAndroid Build Coastguard Worker; LARGE-JT-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_HA [[SYM:[^ ]+]] 196*9880d681SAndroid Build Coastguard Worker; LARGE-JT-NEXT: 0x{{[0-9,A-F]+}} R_PPC64_TOC16_LO_DS [[SYM]] 197