brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.7 KiB · baf9c74 Raw
200 lines · plain
1/// Test LoongArch64 ABI rewrite of struct returned by value (BIND(C), VALUE derived types).2/// This test test cases where the struct can be returned in registers.3/// Test cases can be roughly divided into two categories:4///  - struct with a single intrinsic component;5///  - sturct with more than one field;6/// Since the argument marshalling logic is largely the same within each category,7/// only the first example in each category checks the entire invocation process,8/// while the other examples only check the signatures.9 10// RUN: fir-opt --split-input-file --target-rewrite="target=loongarch64-unknown-linux-gnu" %s | FileCheck %s11 12 13/// *********************** Struct with a single intrinsic component *********************** ///14 15!ty_i16   = !fir.type<ti16{i:i16}>16!ty_i32   = !fir.type<ti32{i:i32}>17!ty_i64   = !fir.type<ti64{i:i64}>18!ty_i128  = !fir.type<ti128{i:i128}>19!ty_f16   = !fir.type<tf16{i:f16}>20!ty_f32   = !fir.type<tf32{i:f32}>21!ty_f64   = !fir.type<tf64{i:f64}>22!ty_f128  = !fir.type<tf128{i:f128}>23!ty_bf16  = !fir.type<tbf16{i:bf16}>24!ty_char1 = !fir.type<tchar1{i:!fir.char<1>}>25!ty_char2 = !fir.type<tchar2{i:!fir.char<1,2>}>26!ty_log1  = !fir.type<tlog1{i:!fir.logical<1>}>27!ty_log2  = !fir.type<tlog2{i:!fir.logical<2>}>28!ty_log4  = !fir.type<tlog4{i:!fir.logical<4>}>29!ty_log8  = !fir.type<tlog8{i:!fir.logical<8>}>30!ty_log16 = !fir.type<tlog16{i:!fir.logical<16>}>31!ty_cmplx_f32  = !fir.type<tcmplx_f32{i:complex<f32>}>32!ty_cmplx_f64  = !fir.type<tcmplx_f64{i:complex<f64>}>33 34module attributes {fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.data_layout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128", llvm.target_triple = "loongarch64-unknown-linux-gnu"} {35 36// CHECK-LABEL: func.func private @test_func_i16() -> i6437func.func private @test_func_i16() -> !ty_i1638// CHECK-LABEL: func.func @test_call_i16(39// CHECK-SAME:    %[[ARG0:.*]]: !fir.ref<!fir.type<ti16{i:i16}>>) {40func.func @test_call_i16(%arg0: !fir.ref<!ty_i16>) {41  // CHECK: %[[OUT:.*]] = fir.call @test_func_i16() : () -> i6442  // CHECK: %[[STACK:.*]] = llvm.intr.stacksave : !llvm.ptr43  // CHECK: %[[ARR:.*]] = fir.alloca i6444  // CHECK: fir.store %[[OUT]] to %[[ARR]] : !fir.ref<i64>45  // CHECK: %[[CVT:.*]] = fir.convert %[[ARR]] : (!fir.ref<i64>) -> !fir.ref<!fir.type<ti16{i:i16}>>46  // CHECK: %[[LD:.*]] = fir.load %[[CVT]] : !fir.ref<!fir.type<ti16{i:i16}>>47  // CHECK: llvm.intr.stackrestore %[[STACK]] : !llvm.ptr48  %out = fir.call @test_func_i16() : () -> !ty_i1649  // CHECK: fir.store %[[LD]] to %[[ARG0]] : !fir.ref<!fir.type<ti16{i:i16}>>50  fir.store %out to %arg0 : !fir.ref<!ty_i16>51  // CHECK: return52  return53}54 55// CHECK-LABEL: func.func private @test_func_i32() -> i6456func.func private @test_func_i32() -> !ty_i3257 58// CHECK-LABEL: func.func private @test_func_i64() -> i6459func.func private @test_func_i64() -> !ty_i6460 61// CHECK-LABEL: func.func private @test_func_i128() -> i12862func.func private @test_func_i128() -> !ty_i12863 64// CHECK-LABEL: func.func private @test_func_f16() -> i6465func.func private @test_func_f16() -> !ty_f1666 67// CHECK-LABEL: func.func private @test_func_f32() -> f3268func.func private @test_func_f32() -> !ty_f3269 70// CHECK-LABEL: func.func private @test_func_f64() -> f6471func.func private @test_func_f64() -> !ty_f6472 73// CHECK-LABEL: func.func private @test_func_f128() -> i12874func.func private @test_func_f128() -> !ty_f12875 76// CHECK-LABEL: func.func private @test_func_bf16() -> i6477func.func private @test_func_bf16() -> !ty_bf1678 79// CHECK-LABEL: func.func private @test_func_char1() -> i6480func.func private @test_func_char1() -> !ty_char181 82// CHECK-LABEL: func.func private @test_func_char2() -> i6483func.func private @test_func_char2() -> !ty_char284 85// CHECK-LABEL: func.func private @test_func_log1() -> i6486func.func private @test_func_log1() -> !ty_log187 88// CHECK-LABEL: func.func private @test_func_log2() -> i6489func.func private @test_func_log2() -> !ty_log290 91// CHECK-LABEL: func.func private @test_func_log4() -> i6492func.func private @test_func_log4() -> !ty_log493 94// CHECK-LABEL: func.func private @test_func_log8() -> i6495func.func private @test_func_log8() -> !ty_log896 97// CHECK-LABEL: func.func private @test_func_log16() -> i12898func.func private @test_func_log16() -> !ty_log1699 100// CHECK-LABEL: func.func private @test_func_cmplx_f32() -> tuple<f32, f32>101func.func private @test_func_cmplx_f32() -> !ty_cmplx_f32102 103// CHECK-LABEL: func.func private @test_func_cmplx_f64() -> tuple<f64, f64>104func.func private @test_func_cmplx_f64() -> !ty_cmplx_f64105}106 107 108/// *************************** Struct with more than one field **************************** ///109 110// -----111 112!ty_i32_f32 = !fir.type<ti32_f32{i:i32,j:f32}>113!ty_i32_f64 = !fir.type<ti32_f64{i:i32,j:f64}>114!ty_i64_f32 = !fir.type<ti64_f32{i:i64,j:f32}>115!ty_i64_f64 = !fir.type<ti64_f64{i:i64,j:f64}>116!ty_f64_i64 = !fir.type<tf64_i64{i:f64,j:i64}>117!ty_f16_f16 = !fir.type<tf16_f16{i:f16,j:f16}>118!ty_f32_f32 = !fir.type<tf32_f32{i:f32,j:f32}>119!ty_f64_f64 = !fir.type<tf64_f64{i:f64,j:f64}>120!ty_f32_i32_i32 = !fir.type<tf32_i32_i32{i:f32,j:i32,k:i32}>121!ty_f32_f32_i32 = !fir.type<tf32_f32_i32{i:f32,j:f32,k:i32}>122!ty_f32_f32_f32 = !fir.type<tf32_f32_f32{i:f32,j:f32,k:f32}>123 124!ty_i8_a8  = !fir.type<ti8_a8{i:!fir.array<8xi8>}>125!ty_i8_a16 = !fir.type<ti8_a16{i:!fir.array<16xi8>}>126!ty_f32_a2 = !fir.type<tf32_a2{i:!fir.array<2xf32>}>127!ty_f64_a2 = !fir.type<tf64_a2{i:!fir.array<2xf64>}>128!ty_nested_i32_f32 = !fir.type<t11{i:!ty_i32_f32}>129!ty_nested_i8_a8_i32 = !fir.type<t12{i:!ty_i8_a8, j:i32}>130 131module attributes {fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.data_layout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128", llvm.target_triple = "loongarch64-unknown-linux-gnu"} {132 133// CHECK-LABEL: func.func private @test_func_i32_f32() -> tuple<i32, f32>134func.func private @test_func_i32_f32() -> !ty_i32_f32135// CHECK-LABEL: func.func @test_call_i32_f32(136// CHECK-SAME:    %[[ARG0:.*]]: !fir.ref<!fir.type<ti32_f32{i:i32,j:f32}>>) {137func.func @test_call_i32_f32(%arg0: !fir.ref<!ty_i32_f32>) {138  // CHECK: %[[OUT:.*]] = fir.call @test_func_i32_f32() : () -> tuple<i32, f32>139  // CHECK: %[[STACK:.*]] = llvm.intr.stacksave : !llvm.ptr140  // CHECK: %[[ARR:.*]] = fir.alloca tuple<i32, f32>141  // CHECK: fir.store %[[OUT]] to %[[ARR]] : !fir.ref<tuple<i32, f32>>142  // CHECK: %[[CVT:.*]] = fir.convert %[[ARR]] : (!fir.ref<tuple<i32, f32>>) -> !fir.ref<!fir.type<ti32_f32{i:i32,j:f32}>>143  // CHECK: %[[LD:.*]] = fir.load %[[CVT]] : !fir.ref<!fir.type<ti32_f32{i:i32,j:f32}>>144  // CHECK: llvm.intr.stackrestore %[[STACK]] : !llvm.ptr145  %out = fir.call @test_func_i32_f32() : () -> !ty_i32_f32146  // CHECK: fir.store %[[LD]] to %[[ARG0]] : !fir.ref<!fir.type<ti32_f32{i:i32,j:f32}>>147  fir.store %out to %arg0 : !fir.ref<!ty_i32_f32>148  // CHECK: return149  return150}151 152// CHECK-LABEL: func.func private @test_func_i32_f64() -> tuple<i32, f64>153func.func private @test_func_i32_f64() -> !ty_i32_f64154 155// CHECK-LABEL: func.func private @test_func_i64_f32() -> tuple<i64, f32>156func.func private @test_func_i64_f32() -> !ty_i64_f32157 158// CHECK-LABEL: func.func private @test_func_i64_f64() -> tuple<i64, f64>159func.func private @test_func_i64_f64() -> !ty_i64_f64160 161// CHECK-LABEL: func.func private @test_func_f64_i64() -> tuple<f64, i64>162func.func private @test_func_f64_i64() -> !ty_f64_i64163 164// CHECK-LABEL: func.func private @test_func_f16_f16() -> i64165func.func private @test_func_f16_f16() -> !ty_f16_f16166 167// CHECK-LABEL: func.func private @test_func_f32_f32() -> tuple<f32, f32>168func.func private @test_func_f32_f32() -> !ty_f32_f32169 170// CHECK-LABEL: func.func private @test_func_f64_f64() -> tuple<f64, f64>171func.func private @test_func_f64_f64() -> !ty_f64_f64172 173// CHECK-LABEL: func.func private @test_func_f32_i32_i32() -> !fir.array<2xi64>174func.func private @test_func_f32_i32_i32() -> !ty_f32_i32_i32175 176// CHECK-LABEL: func.func private @test_func_f32_f32_i32() -> !fir.array<2xi64>177func.func private @test_func_f32_f32_i32() -> !ty_f32_f32_i32178 179// CHECK-LABEL: func.func private @test_func_f32_f32_f32() -> !fir.array<2xi64>180func.func private @test_func_f32_f32_f32() -> !ty_f32_f32_f32181 182// CHECK-LABEL: func.func private @test_func_i8_a8() -> i64183func.func private @test_func_i8_a8() -> !ty_i8_a8184 185// CHECK-LABEL: func.func private @test_func_i8_a16() -> !fir.array<2xi64>186func.func private @test_func_i8_a16() -> !ty_i8_a16187 188// CHECK-LABEL: func.func private @test_func_f32_a2() -> tuple<f32, f32>189func.func private @test_func_f32_a2() -> !ty_f32_a2190 191// CHECK-LABEL: func.func private @test_func_f64_a2() -> tuple<f64, f64>192func.func private @test_func_f64_a2() -> !ty_f64_a2193 194// CHECK-LABEL: func.func private @test_func_nested_i32_f32() -> tuple<i32, f32>195func.func private @test_func_nested_i32_f32() -> !ty_nested_i32_f32196 197// CHECK-LABEL: func.func private @test_func_nested_i8_a8_i32() -> !fir.array<2xi64>198func.func private @test_func_nested_i8_a8_i32() -> !ty_nested_i8_a8_i32199}200