1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky | FileCheck %s 3; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky -relocation-model=pic -code-model=small | FileCheck %s --check-prefix=CHECK-PIC-SMALL 4; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky -relocation-model=pic -code-model=large | FileCheck %s --check-prefix=CHECK-PIC-LARGE 5 6@p_fun = global void (i32, i32)* @bar, align 8 7 8declare void @bar(i32, i32) 9 10define void @foo(i32 %a, i32* %ptr){ 11; CHECK-LABEL: foo: 12; CHECK: # %bb.0: # %entry 13; CHECK-NEXT: subi16 sp, sp, 4 14; CHECK-NEXT: .cfi_def_cfa_offset 4 15; CHECK-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 16; CHECK-NEXT: .cfi_offset lr, -4 17; CHECK-NEXT: subi16 sp, sp, 4 18; CHECK-NEXT: .cfi_def_cfa_offset 8 19; CHECK-NEXT: ld16.w a1, (a1, 0) 20; CHECK-NEXT: lrw32 a2, [.LCPI0_0] 21; CHECK-NEXT: jsr16 a2 22; CHECK-NEXT: addi16 sp, sp, 4 23; CHECK-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 24; CHECK-NEXT: addi16 sp, sp, 4 25; CHECK-NEXT: rts16 26; CHECK-NEXT: .p2align 1 27; CHECK-NEXT: # %bb.1: 28; CHECK-NEXT: .p2align 2 29; CHECK-NEXT: .LCPI0_0: 30; CHECK-NEXT: .long bar 31; 32; CHECK-PIC-SMALL-LABEL: foo: 33; CHECK-PIC-SMALL: # %bb.0: # %entry 34; CHECK-PIC-SMALL-NEXT: subi16 sp, sp, 8 35; CHECK-PIC-SMALL-NEXT: .cfi_def_cfa_offset 8 36; CHECK-PIC-SMALL-NEXT: st32.w rgb, (sp, 4) # 4-byte Folded Spill 37; CHECK-PIC-SMALL-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 38; CHECK-PIC-SMALL-NEXT: .cfi_offset rgb, -4 39; CHECK-PIC-SMALL-NEXT: .cfi_offset lr, -8 40; CHECK-PIC-SMALL-NEXT: subi16 sp, sp, 4 41; CHECK-PIC-SMALL-NEXT: .cfi_def_cfa_offset 12 42; CHECK-PIC-SMALL-NEXT: lrw32 rgb, [.LCPI0_0] 43; CHECK-PIC-SMALL-NEXT: mov32 a2, rgb 44; CHECK-PIC-SMALL-NEXT: ld16.w a1, (a1, 0) 45; CHECK-PIC-SMALL-NEXT: lrw32 a3, [.LCPI0_1] 46; CHECK-PIC-SMALL-NEXT: addu16 a2, a2, a3 47; CHECK-PIC-SMALL-NEXT: ld16.w a2, (a2, 0) 48; CHECK-PIC-SMALL-NEXT: jsr16 a2 49; CHECK-PIC-SMALL-NEXT: addi16 sp, sp, 4 50; CHECK-PIC-SMALL-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 51; CHECK-PIC-SMALL-NEXT: ld32.w rgb, (sp, 4) # 4-byte Folded Reload 52; CHECK-PIC-SMALL-NEXT: addi16 sp, sp, 8 53; CHECK-PIC-SMALL-NEXT: rts16 54; CHECK-PIC-SMALL-NEXT: .p2align 1 55; CHECK-PIC-SMALL-NEXT: # %bb.1: 56; CHECK-PIC-SMALL-NEXT: .p2align 2 57; CHECK-PIC-SMALL-NEXT: .LCPI0_0: 58; CHECK-PIC-SMALL-NEXT: .long _GLOBAL_OFFSET_TABLE_ 59; CHECK-PIC-SMALL-NEXT: .LCPI0_1: 60; CHECK-PIC-SMALL-NEXT: .long bar@PLT 61; 62; CHECK-PIC-LARGE-LABEL: foo: 63; CHECK-PIC-LARGE: # %bb.0: # %entry 64; CHECK-PIC-LARGE-NEXT: subi16 sp, sp, 8 65; CHECK-PIC-LARGE-NEXT: .cfi_def_cfa_offset 8 66; CHECK-PIC-LARGE-NEXT: st32.w rgb, (sp, 4) # 4-byte Folded Spill 67; CHECK-PIC-LARGE-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 68; CHECK-PIC-LARGE-NEXT: .cfi_offset rgb, -4 69; CHECK-PIC-LARGE-NEXT: .cfi_offset lr, -8 70; CHECK-PIC-LARGE-NEXT: subi16 sp, sp, 4 71; CHECK-PIC-LARGE-NEXT: .cfi_def_cfa_offset 12 72; CHECK-PIC-LARGE-NEXT: lrw32 rgb, [.LCPI0_0] 73; CHECK-PIC-LARGE-NEXT: mov32 a2, rgb 74; CHECK-PIC-LARGE-NEXT: ld16.w a1, (a1, 0) 75; CHECK-PIC-LARGE-NEXT: lrw32 a3, [.LCPI0_1] 76; CHECK-PIC-LARGE-NEXT: addu16 a2, a2, a3 77; CHECK-PIC-LARGE-NEXT: ld16.w a2, (a2, 0) 78; CHECK-PIC-LARGE-NEXT: jsr16 a2 79; CHECK-PIC-LARGE-NEXT: addi16 sp, sp, 4 80; CHECK-PIC-LARGE-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 81; CHECK-PIC-LARGE-NEXT: ld32.w rgb, (sp, 4) # 4-byte Folded Reload 82; CHECK-PIC-LARGE-NEXT: addi16 sp, sp, 8 83; CHECK-PIC-LARGE-NEXT: rts16 84; CHECK-PIC-LARGE-NEXT: .p2align 1 85; CHECK-PIC-LARGE-NEXT: # %bb.1: 86; CHECK-PIC-LARGE-NEXT: .p2align 2 87; CHECK-PIC-LARGE-NEXT: .LCPI0_0: 88; CHECK-PIC-LARGE-NEXT: .long _GLOBAL_OFFSET_TABLE_ 89; CHECK-PIC-LARGE-NEXT: .LCPI0_1: 90; CHECK-PIC-LARGE-NEXT: .long bar@PLT 91; CHECK-PIC-LABEL: foo: 92; CHECK-PIC: # %bb.0: # %entry 93; CHECK-PIC-NEXT: ld32.w a1, a1, 0 94; CHECK-PIC-NEXT: br32 bar 95entry: 96 %0 = load i32, i32* %ptr 97 tail call void (i32, i32) @bar(i32 %a, i32 %0) 98 ret void 99} 100 101define void @foo_indirect(i32 %a, i32* %ptr) { 102; CHECK-LABEL: foo_indirect: 103; CHECK: # %bb.0: # %entry 104; CHECK-NEXT: subi16 sp, sp, 4 105; CHECK-NEXT: .cfi_def_cfa_offset 4 106; CHECK-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 107; CHECK-NEXT: .cfi_offset lr, -4 108; CHECK-NEXT: subi16 sp, sp, 4 109; CHECK-NEXT: .cfi_def_cfa_offset 8 110; CHECK-NEXT: lrw32 a2, [.LCPI1_0] 111; CHECK-NEXT: ld16.w a2, (a2, 0) 112; CHECK-NEXT: ld16.w a1, (a1, 0) 113; CHECK-NEXT: jsr16 a2 114; CHECK-NEXT: addi16 sp, sp, 4 115; CHECK-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 116; CHECK-NEXT: addi16 sp, sp, 4 117; CHECK-NEXT: rts16 118; CHECK-NEXT: .p2align 1 119; CHECK-NEXT: # %bb.1: 120; CHECK-NEXT: .p2align 2 121; CHECK-NEXT: .LCPI1_0: 122; CHECK-NEXT: .long p_fun 123; 124; CHECK-PIC-SMALL-LABEL: foo_indirect: 125; CHECK-PIC-SMALL: # %bb.0: # %entry 126; CHECK-PIC-SMALL-NEXT: subi16 sp, sp, 8 127; CHECK-PIC-SMALL-NEXT: .cfi_def_cfa_offset 8 128; CHECK-PIC-SMALL-NEXT: st32.w rgb, (sp, 4) # 4-byte Folded Spill 129; CHECK-PIC-SMALL-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 130; CHECK-PIC-SMALL-NEXT: .cfi_offset rgb, -4 131; CHECK-PIC-SMALL-NEXT: .cfi_offset lr, -8 132; CHECK-PIC-SMALL-NEXT: subi16 sp, sp, 4 133; CHECK-PIC-SMALL-NEXT: .cfi_def_cfa_offset 12 134; CHECK-PIC-SMALL-NEXT: lrw32 rgb, [.LCPI1_0] 135; CHECK-PIC-SMALL-NEXT: mov32 a2, rgb 136; CHECK-PIC-SMALL-NEXT: lrw32 a3, [.LCPI1_1] 137; CHECK-PIC-SMALL-NEXT: addu16 a2, a2, a3 138; CHECK-PIC-SMALL-NEXT: ld16.w a2, (a2, 0) 139; CHECK-PIC-SMALL-NEXT: ld16.w a2, (a2, 0) 140; CHECK-PIC-SMALL-NEXT: ld16.w a1, (a1, 0) 141; CHECK-PIC-SMALL-NEXT: jsr16 a2 142; CHECK-PIC-SMALL-NEXT: addi16 sp, sp, 4 143; CHECK-PIC-SMALL-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 144; CHECK-PIC-SMALL-NEXT: ld32.w rgb, (sp, 4) # 4-byte Folded Reload 145; CHECK-PIC-SMALL-NEXT: addi16 sp, sp, 8 146; CHECK-PIC-SMALL-NEXT: rts16 147; CHECK-PIC-SMALL-NEXT: .p2align 1 148; CHECK-PIC-SMALL-NEXT: # %bb.1: 149; CHECK-PIC-SMALL-NEXT: .p2align 2 150; CHECK-PIC-SMALL-NEXT: .LCPI1_0: 151; CHECK-PIC-SMALL-NEXT: .long _GLOBAL_OFFSET_TABLE_ 152; CHECK-PIC-SMALL-NEXT: .LCPI1_1: 153; CHECK-PIC-SMALL-NEXT: .long p_fun@GOT 154; 155; CHECK-PIC-LARGE-LABEL: foo_indirect: 156; CHECK-PIC-LARGE: # %bb.0: # %entry 157; CHECK-PIC-LARGE-NEXT: subi16 sp, sp, 8 158; CHECK-PIC-LARGE-NEXT: .cfi_def_cfa_offset 8 159; CHECK-PIC-LARGE-NEXT: st32.w rgb, (sp, 4) # 4-byte Folded Spill 160; CHECK-PIC-LARGE-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill 161; CHECK-PIC-LARGE-NEXT: .cfi_offset rgb, -4 162; CHECK-PIC-LARGE-NEXT: .cfi_offset lr, -8 163; CHECK-PIC-LARGE-NEXT: subi16 sp, sp, 4 164; CHECK-PIC-LARGE-NEXT: .cfi_def_cfa_offset 12 165; CHECK-PIC-LARGE-NEXT: lrw32 rgb, [.LCPI1_0] 166; CHECK-PIC-LARGE-NEXT: mov32 a2, rgb 167; CHECK-PIC-LARGE-NEXT: lrw32 a3, [.LCPI1_1] 168; CHECK-PIC-LARGE-NEXT: addu16 a2, a2, a3 169; CHECK-PIC-LARGE-NEXT: ld16.w a2, (a2, 0) 170; CHECK-PIC-LARGE-NEXT: ld16.w a2, (a2, 0) 171; CHECK-PIC-LARGE-NEXT: ld16.w a1, (a1, 0) 172; CHECK-PIC-LARGE-NEXT: jsr16 a2 173; CHECK-PIC-LARGE-NEXT: addi16 sp, sp, 4 174; CHECK-PIC-LARGE-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload 175; CHECK-PIC-LARGE-NEXT: ld32.w rgb, (sp, 4) # 4-byte Folded Reload 176; CHECK-PIC-LARGE-NEXT: addi16 sp, sp, 8 177; CHECK-PIC-LARGE-NEXT: rts16 178; CHECK-PIC-LARGE-NEXT: .p2align 1 179; CHECK-PIC-LARGE-NEXT: # %bb.1: 180; CHECK-PIC-LARGE-NEXT: .p2align 2 181; CHECK-PIC-LARGE-NEXT: .LCPI1_0: 182; CHECK-PIC-LARGE-NEXT: .long _GLOBAL_OFFSET_TABLE_ 183; CHECK-PIC-LARGE-NEXT: .LCPI1_1: 184; CHECK-PIC-LARGE-NEXT: .long p_fun@GOT 185; CHECK-PIC-LABEL: foo_indirect: 186; CHECK-PIC: # %bb.0: # %entry 187; CHECK-PIC-NEXT: movi32 a2, p_fun 188; CHECK-PIC-NEXT: movih32 a3, p_fun 189; CHECK-PIC-NEXT: or32 a2, a3, a2 190; CHECK-PIC-NEXT: ld32.w a2, a2, 0 191; CHECK-PIC-NEXT: ld32.w a1, a1, 0 192; CHECK-PIC-NEXT: jmp32 a2 193entry: 194 %0 = load void (i32, i32)*, void (i32, i32)** @p_fun, align 8 195 %1 = load i32, i32* %ptr 196 tail call void (i32, i32) %0(i32 %a, i32 %1) 197 ret void 198} 199