brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · 5037ffc Raw
103 lines · plain
1// Test powerpc64 ABI rewrite of struct returned by value (BIND(C), VALUE derived types).2//3// RUN: fir-opt --target-rewrite="target=powerpc64-ibm-aix" %s | FileCheck %s4 5module attributes {fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.data_layout = "E-m:a-Fi64-i64:64-i128:128-n32:64-S128-v256:256:256-v512:512:512", llvm.target_triple = "powerpc64-ibm-aix7.2.0.0"} {6 7// character type8func.func private @test_t1() -> !fir.type<t1<{c:!fir.char<1>}>>9//CHECK-LABEL: func.func private @test_t1(!fir.ref<!fir.type<t1<{c:!fir.char<1>}>>> {llvm.align = 8 : i32, llvm.sret = !fir.type<t1<{c:!fir.char<1>}>>})10func.func @test_call_t1(%arg0 : !fir.ref<!fir.type<t1<{c:!fir.char<1>}>>>) {11//CHECK-LABEL: func.func @test_call_t1(12//CHECK-SAME:    %[[ARG0:.*]]: !fir.ref<!fir.type<t1<{c:!fir.char<1>}>>>)13  %out = fir.call @test_t1() : () -> !fir.type<t1<{c:!fir.char<1>}>>14  fir.store %out to %arg0 : !fir.ref<!fir.type<t1<{c:!fir.char<1>}>>>15  return16  //CHECK: %[[STCK:.*]] = llvm.intr.stacksave : !llvm.ptr17  //CHECK: %[[ARG:.*]] = fir.alloca !fir.type<t1<{c:!fir.char<1>}>>18  //CHECK: fir.call @test_t1(%[[ARG]]) : (!fir.ref<!fir.type<t1<{c:!fir.char<1>}>>> {llvm.align = 8 : i32, llvm.sret = !fir.type<t1<{c:!fir.char<1>}>>}) -> ()19  //CHECK: %[[CVT:.*]] = fir.convert %[[ARG]] : (!fir.ref<!fir.type<t1<{c:!fir.char<1>}>>>) -> !fir.ref<!fir.type<t1<{c:!fir.char<1>}>>>20  //CHECK: %[[LD:.*]] = fir.load %[[CVT]] : !fir.ref<!fir.type<t1<{c:!fir.char<1>}>>>21  //CHECK: llvm.intr.stackrestore %[[STCK]] : !llvm.ptr22  //CHECK: fir.store %[[LD]] to %[[ARG0]] : !fir.ref<!fir.type<t1<{c:!fir.char<1>}>>>23  //CHECK: return24}25 26// integer type27func.func private @test_t2() -> !fir.type<t2<{i:i32}>>28//CHECK-LABEL: func.func private @test_t2(!fir.ref<!fir.type<t2<{i:i32}>>> {llvm.align = 8 : i32, llvm.sret = !fir.type<t2<{i:i32}>>})29func.func @test_call_t2(%arg0 : !fir.ref<!fir.type<t2<{i:i32}>>>) {30//CHECK-LABEL: func.func @test_call_t2(31//CHECK-SAME:    %[[ARG0:.*]]: !fir.ref<!fir.type<t2<{i:i32}>>>)32  %out = fir.call @test_t2() : () -> !fir.type<t2<{i:i32}>>33  fir.store %out to %arg0 : !fir.ref<!fir.type<t2<{i:i32}>>>34  return35  //CHECK: %[[STCK:.*]] = llvm.intr.stacksave : !llvm.ptr36  //CHECK: %[[ARG:.*]] = fir.alloca !fir.type<t2<{i:i32}>>37  //CHECK: fir.call @test_t2(%[[ARG]]) : (!fir.ref<!fir.type<t2<{i:i32}>>> {llvm.align = 8 : i32, llvm.sret = !fir.type<t2<{i:i32}>>}) -> ()38  //CHECK: %[[CVT:.*]] = fir.convert %[[ARG]] : (!fir.ref<!fir.type<t2<{i:i32}>>>) -> !fir.ref<!fir.type<t2<{i:i32}>>>39  //CHECK: %[[LD:.*]] = fir.load %[[CVT]] : !fir.ref<!fir.type<t2<{i:i32}>>>40  //CHECK: llvm.intr.stackrestore %[[STCK]] : !llvm.ptr41  //CHECK: fir.store %[[LD]] to %[[ARG0]] : !fir.ref<!fir.type<t2<{i:i32}>>>42  //CHECK: return43}44 45// real type (scalar)46func.func private @test_t3() -> !fir.type<t3<{r1:f32,r2:f32,r3:f32}>>47//CHECK-LABEL: func.func private @test_t3(!fir.ref<!fir.type<t3<{r1:f32,r2:f32,r3:f32}>>> {llvm.align = 8 : i32, llvm.sret = !fir.type<t3<{r1:f32,r2:f32,r3:f32}>>})48func.func @test_call_t3(%arg0 : !fir.ref<!fir.type<t3<{r1:f32,r2:f32,r3:f32}>>>) {49//CHECK-LABEL: func.func @test_call_t3(50//CHECK-SAME:    %[[ARG0:.*]]: !fir.ref<!fir.type<t3<{r1:f32,r2:f32,r3:f32}>>>)51  %out = fir.call @test_t3() : () -> !fir.type<t3<{r1:f32,r2:f32,r3:f32}>>52  fir.store %out to %arg0 : !fir.ref<!fir.type<t3<{r1:f32,r2:f32,r3:f32}>>>53  return54  //CHECK: %[[STCK:.*]] = llvm.intr.stacksave : !llvm.ptr55  //CHECK: %[[ARG:.*]] = fir.alloca !fir.type<t3<{r1:f32,r2:f32,r3:f32}>>56  //CHECK: fir.call @test_t3(%[[ARG]]) : (!fir.ref<!fir.type<t3<{r1:f32,r2:f32,r3:f32}>>> {llvm.align = 8 : i32, llvm.sret = !fir.type<t3<{r1:f32,r2:f32,r3:f32}>>}) -> ()57  //CHECK: %[[CVT:.*]] = fir.convert %[[ARG]] : (!fir.ref<!fir.type<t3<{r1:f32,r2:f32,r3:f32}>>>) -> !fir.ref<!fir.type<t3<{r1:f32,r2:f32,r3:f32}>>>58  //CHECK: %[[LD:.*]] = fir.load %[[CVT]] : !fir.ref<!fir.type<t3<{r1:f32,r2:f32,r3:f32}>>>59  //CHECK: llvm.intr.stackrestore %[[STCK]] : !llvm.ptr60  //CHECK: fir.store %[[LD]] to %[[ARG0]] : !fir.ref<!fir.type<t3<{r1:f32,r2:f32,r3:f32}>>>61  //CHECK: return62}63 64// real type (array)65func.func private @test_t4() -> !fir.type<t4<{r:!fir.array<8xf32>}>>66//CHECK-LABEL: func.func private @test_t4(!fir.ref<!fir.type<t4<{r:!fir.array<8xf32>}>>> {llvm.align = 8 : i32, llvm.sret = !fir.type<t4<{r:!fir.array<8xf32>}>>})67func.func @test_call_t4(%arg0 : !fir.ref<!fir.type<t4<{r:!fir.array<8xf32>}>>>) {68//CHECK-LABEL: func.func @test_call_t4(69//CHECK-SAME:    %[[ARG0:.*]]: !fir.ref<!fir.type<t4<{r:!fir.array<8xf32>}>>>)70  %out = fir.call @test_t4() : () -> !fir.type<t4<{r:!fir.array<8xf32>}>>71  fir.store %out to %arg0 : !fir.ref<!fir.type<t4<{r:!fir.array<8xf32>}>>>72  return73  //CHECK: %[[STCK:.*]] = llvm.intr.stacksave : !llvm.ptr74  //CHECK: %[[ARG:.*]] = fir.alloca !fir.type<t4<{r:!fir.array<8xf32>}>>75  //CHECK: fir.call @test_t4(%[[ARG]]) : (!fir.ref<!fir.type<t4<{r:!fir.array<8xf32>}>>> {llvm.align = 8 : i32, llvm.sret = !fir.type<t4<{r:!fir.array<8xf32>}>>}) -> ()76  //CHECK: %[[CVT:.*]] = fir.convert %[[ARG]] : (!fir.ref<!fir.type<t4<{r:!fir.array<8xf32>}>>>) -> !fir.ref<!fir.type<t4<{r:!fir.array<8xf32>}>>>77  //CHECK: %[[LD:.*]] = fir.load %[[CVT]] : !fir.ref<!fir.type<t4<{r:!fir.array<8xf32>}>>>78  //CHECK: llvm.intr.stackrestore %[[STCK]] : !llvm.ptr79  //CHECK: fir.store %[[LD]] to %[[ARG0]] : !fir.ref<!fir.type<t4<{r:!fir.array<8xf32>}>>>80  //CHECK: return81}82 83// mixed types84func.func private @test_t5() -> !fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>85//CHECK-LABEL: func.func private @test_t5(!fir.ref<!fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>> {llvm.align = 8 : i32, llvm.sret = !fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>})86func.func @test_call_t5(%arg0 : !fir.ref<!fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>>) {87//CHECK-LABEL: func.func @test_call_t5(88//CHECK-SAME:    %[[ARG0:.*]]: !fir.ref<!fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>>)89  %out = fir.call @test_t5() : () -> !fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>90  fir.store %out to %arg0 : !fir.ref<!fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>>91  return92  //CHECK: %[[STCK:.*]] = llvm.intr.stacksave : !llvm.ptr93  //CHECK: %[[ARG:.*]] = fir.alloca !fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>94  //CHECK: fir.call @test_t5(%[[ARG]]) : (!fir.ref<!fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>> {llvm.align = 8 : i32, llvm.sret = !fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>}) -> ()95  //CHECK: %[[CVT:.*]] = fir.convert %[[ARG]] : (!fir.ref<!fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>>) -> !fir.ref<!fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>>96  //CHECK: %[[LD:.*]] = fir.load %[[CVT]] : !fir.ref<!fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>>97  //CHECK: llvm.intr.stackrestore %[[STCK]] : !llvm.ptr98  //CHECK: fir.store %[[LD]] to %[[ARG0]] : !fir.ref<!fir.type<t5<{c:!fir.char<1>,r:f32,i:i64}>>>99  //CHECK: return100}101 102}103