brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.4 KiB · a19f888 Raw
104 lines · plain
1// Test ppc64le ABI rewrite of struct returned by value (BIND(C), VALUE derived types).2//3// RUN: fir-opt --target-rewrite="target=ppc64le-ibm-linux" %s | FileCheck %s4 5module attributes {fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.data_layout = "e-m:e-Fn32-i64:64-i128:128-n32:64-S128-v256:256:256-v512:512:512", llvm.target_triple = "powerpc64le-unknown-linux-gnu"} {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.array<3xf32>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: %[[RET:.*]] = fir.call @test_t3() : () -> !fir.array<3xf32>55  //CHECK: %[[STCK:.*]] = llvm.intr.stacksave : !llvm.ptr56  //CHECK: %[[ARG:.*]] = fir.alloca !fir.array<3xf32>57  //CHECK: fir.store %[[RET]] to %[[ARG]] : !fir.ref<!fir.array<3xf32>>58  //CHECK: %[[CVT:.*]] = fir.convert %[[ARG]] : (!fir.ref<!fir.array<3xf32>>) -> !fir.ref<!fir.type<t3{r1:f32,r2:f32,r3:f32}>>59  //CHECK: %[[LD:.*]] = fir.load %[[CVT]] : !fir.ref<!fir.type<t3{r1:f32,r2:f32,r3:f32}>>60  //CHECK: llvm.intr.stackrestore %[[STCK]] : !llvm.ptr61  //CHECK: fir.store %[[LD]] to %[[ARG0]] : !fir.ref<!fir.type<t3{r1:f32,r2:f32,r3:f32}>>62  //CHECK: return63}64 65// real type (> 8 floats)66func.func private @test_t4() -> !fir.type<t4{r:!fir.array<9xf32>}>67//CHECK-LABEL: func.func private @test_t4(!fir.ref<!fir.type<t4{r:!fir.array<9xf32>}>> {llvm.align = 8 : i32, llvm.sret = !fir.type<t4{r:!fir.array<9xf32>}>})68func.func @test_call_t4(%arg0 : !fir.ref<!fir.type<t4{r:!fir.array<9xf32>}>>) {69//CHECK-LABEL: func.func @test_call_t4(70//CHECK-SAME:    %[[ARG0:.*]]: !fir.ref<!fir.type<t4{r:!fir.array<9xf32>}>>)71  %out = fir.call @test_t4() : () -> !fir.type<t4{r:!fir.array<9xf32>}>72  fir.store %out to %arg0 : !fir.ref<!fir.type<t4{r:!fir.array<9xf32>}>>73  return74  //CHECK: %[[STCK:.*]] = llvm.intr.stacksave : !llvm.ptr75  //CHECK: %[[ARG:.*]] = fir.alloca !fir.type<t4{r:!fir.array<9xf32>}>76  //CHECK: fir.call @test_t4(%[[ARG]]) : (!fir.ref<!fir.type<t4{r:!fir.array<9xf32>}>> {llvm.align = 8 : i32, llvm.sret = !fir.type<t4{r:!fir.array<9xf32>}>}) -> ()77  //CHECK: %[[CVT:.*]] = fir.convert %[[ARG]] : (!fir.ref<!fir.type<t4{r:!fir.array<9xf32>}>>) -> !fir.ref<!fir.type<t4{r:!fir.array<9xf32>}>>78  //CHECK: %[[LD:.*]] = fir.load %[[CVT]] : !fir.ref<!fir.type<t4{r:!fir.array<9xf32>}>>79  //CHECK: llvm.intr.stackrestore %[[STCK]] : !llvm.ptr80  //CHECK: fir.store %[[LD]] to %[[ARG0]] : !fir.ref<!fir.type<t4{r:!fir.array<9xf32>}>>81  //CHECK: return82}83 84// mixed types85func.func private @test_t5() -> !fir.type<t5{c:!fir.char<1>,r:f32,i:i64}>86//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}>})87func.func @test_call_t5(%arg0 : !fir.ref<!fir.type<t5{c:!fir.char<1>,r:f32,i:i64}>>) {88//CHECK-LABEL: func.func @test_call_t5(89//CHECK-SAME:    %[[ARG0:.*]]: !fir.ref<!fir.type<t5{c:!fir.char<1>,r:f32,i:i64}>>)90  %out = fir.call @test_t5() : () -> !fir.type<t5{c:!fir.char<1>,r:f32,i:i64}>91  fir.store %out to %arg0 : !fir.ref<!fir.type<t5{c:!fir.char<1>,r:f32,i:i64}>>92  return93  //CHECK: %[[STCK:.*]] = llvm.intr.stacksave : !llvm.ptr94  //CHECK: %[[ARG:.*]] = fir.alloca !fir.type<t5{c:!fir.char<1>,r:f32,i:i64}>95  //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}>}) -> ()96  //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}>>97  //CHECK: %[[LD:.*]] = fir.load %[[CVT]] : !fir.ref<!fir.type<t5{c:!fir.char<1>,r:f32,i:i64}>>98  //CHECK: llvm.intr.stackrestore %[[STCK]] : !llvm.ptr99  //CHECK: fir.store %[[LD]] to %[[ARG0]] : !fir.ref<!fir.type<t5{c:!fir.char<1>,r:f32,i:i64}>>100  //CHECK: return101}102 103}104