Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions clang/include/clang/Basic/BuiltinsPPC.def
Original file line number Diff line number Diff line change
Expand Up @@ -1105,6 +1105,13 @@ UNALIASED_CUSTOM_BUILTIN(mma_disassemble_dmr, "vv*W1024*", false,
UNALIASED_CUSTOM_BUILTIN(mma_build_dmr, "vW1024*VVVVVVVV", false,
"mma,isa-future-instructions")

UNALIASED_CUSTOM_BUILTIN(mma_dmsha2hash, "vW1024*W1024*Ii", true,
"mma,isa-future-instructions")
UNALIASED_CUSTOM_BUILTIN(mma_dmsha3hash, "vW2048*Ii", true,
"mma,isa-future-instructions")
UNALIASED_CUSTOM_BUILTIN(mma_dmxxshapad, "vW1024*VIiIiIi", true,
"mma,isa-future-instructions")

// MMA builtins with positive/negative multiply/accumulate.
UNALIASED_CUSTOM_MMA_BUILTIN(mma_xvf16ger2, "vW512*VV",
"mma,paired-vector-memops")
Expand Down
1 change: 1 addition & 0 deletions clang/include/clang/Basic/PPCTypes.def
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#endif


PPC_VECTOR_MMA_TYPE(__dmr2048, DMR2048, 2048)
PPC_VECTOR_MMA_TYPE(__dmr1024, DMR1024, 1024)
PPC_VECTOR_MMA_TYPE(__vector_quad, VectorQuad, 512)
PPC_VECTOR_VSX_TYPE(__vector_pair, VectorPair, 256)
Expand Down
2 changes: 1 addition & 1 deletion clang/include/clang/Serialization/ASTBitCodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -1160,7 +1160,7 @@ enum PredefinedTypeIDs {
///
/// Type IDs for non-predefined types will start at
/// NUM_PREDEF_TYPE_IDs.
const unsigned NUM_PREDEF_TYPE_IDS = 513;
const unsigned NUM_PREDEF_TYPE_IDS = 514;

// Ensure we do not overrun the predefined types we reserved
// in the enum PredefinedTypeIDs above.
Expand Down
1 change: 1 addition & 0 deletions clang/lib/AST/ASTContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3501,6 +3501,7 @@ static void encodeTypeForFunctionPointerAuth(const ASTContext &Ctx,
case BuiltinType::VectorQuad:
case BuiltinType::VectorPair:
case BuiltinType::DMR1024:
case BuiltinType::DMR2048:
OS << "?";
return;

Expand Down
3 changes: 2 additions & 1 deletion clang/lib/CodeGen/TargetBuiltins/PPC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1153,7 +1153,8 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID,
}
if (BuiltinID == PPC::BI__builtin_mma_dmmr ||
BuiltinID == PPC::BI__builtin_mma_dmxor ||
BuiltinID == PPC::BI__builtin_mma_disassemble_dmr) {
BuiltinID == PPC::BI__builtin_mma_disassemble_dmr ||
BuiltinID == PPC::BI__builtin_mma_dmsha2hash) {
Address Addr = EmitPointerWithAlignment(E->getArg(1));
Ops[1] = Builder.CreateLoad(Addr);
}
Expand Down
2 changes: 2 additions & 0 deletions clang/test/AST/ast-dump-ppc-types.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
// are correctly defined. We also added checks on a couple of other targets to
// ensure the types are target-dependent.

// CHECK: TypedefDecl {{.*}} implicit __dmr2048 '__dmr2048'
// CHECK: `-BuiltinType {{.*}} '__dmr2048'
// CHECK: TypedefDecl {{.*}} implicit __dmr1024 '__dmr1024'
// CHECK: `-BuiltinType {{.*}} '__dmr1024'
// CHECK: TypedefDecl {{.*}} implicit __vector_quad '__vector_quad'
Expand Down
73 changes: 73 additions & 0 deletions clang/test/CodeGen/PowerPC/builtins-ppc-dmf.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,75 @@ void test_dmf_basic2(char *p1, char *res1, char *res2,
__builtin_mma_build_dmr((__dmr1024*)res2, vv, vv, vv, vv, vv, vv, vv, vv);
__builtin_mma_disassemble_dmr(res1, (__dmr1024*)p1);
}

// CHECK-LABEL: define dso_local void @test_dmsha2hash(
// CHECK-SAME: ptr noundef readonly captures(none) [[VDMRP1:%.*]], ptr noundef readonly captures(none) [[VDMRP2:%.*]], ptr noundef writeonly captures(none) initializes((0, 128)) [[RESP:%.*]]) local_unnamed_addr #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load <1024 x i1>, ptr [[VDMRP1]], align 128, !tbaa [[__DMR1024_TBAA6]]
// CHECK-NEXT: [[TMP1:%.*]] = load <1024 x i1>, ptr [[VDMRP2]], align 128, !tbaa [[__DMR1024_TBAA6]]
// CHECK-NEXT: [[TMP2:%.*]] = tail call <1024 x i1> @llvm.ppc.mma.dmsha2hash(<1024 x i1> [[TMP0]], <1024 x i1> [[TMP1]], i32 1)
// CHECK-NEXT: store <1024 x i1> [[TMP2]], ptr [[RESP]], align 128, !tbaa [[__DMR1024_TBAA6]]
// CHECK-NEXT: ret void
//
// AIX-LABEL: define void @test_dmsha2hash(
// AIX-SAME: ptr noundef readonly captures(none) [[VDMRP1:%.*]], ptr noundef readonly captures(none) [[VDMRP2:%.*]], ptr noundef writeonly captures(none) initializes((0, 128)) [[RESP:%.*]]) local_unnamed_addr #[[ATTR0]] {
// AIX-NEXT: [[ENTRY:.*:]]
// AIX-NEXT: [[TMP0:%.*]] = load <1024 x i1>, ptr [[VDMRP1]], align 128, !tbaa [[__DMR1024_TBAA6]]
// AIX-NEXT: [[TMP1:%.*]] = load <1024 x i1>, ptr [[VDMRP2]], align 128, !tbaa [[__DMR1024_TBAA6]]
// AIX-NEXT: [[TMP2:%.*]] = tail call <1024 x i1> @llvm.ppc.mma.dmsha2hash(<1024 x i1> [[TMP0]], <1024 x i1> [[TMP1]], i32 1)
// AIX-NEXT: store <1024 x i1> [[TMP2]], ptr [[RESP]], align 128, !tbaa [[__DMR1024_TBAA6]]
// AIX-NEXT: ret void
//
void test_dmsha2hash(unsigned char *vdmrp1, unsigned char *vdmrp2, unsigned char *resp) {
__dmr1024 vdmr1 = *((__dmr1024 *)vdmrp1);
__dmr1024 vdmr2 = *((__dmr1024 *)vdmrp2);
__builtin_mma_dmsha2hash(&vdmr1, &vdmr2, 1);
*((__dmr1024 *)resp) = vdmr1;
}

// CHECK-LABEL: define dso_local void @test_dmsha3hash(
// CHECK-SAME: ptr noundef readonly captures(none) [[VDMRPP:%.*]], ptr noundef writeonly captures(none) initializes((0, 256)) [[RESP:%.*]]) local_unnamed_addr #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load <2048 x i1>, ptr [[VDMRPP]], align 256, !tbaa [[__DMR2048_TBAA9:![0-9]+]]
// CHECK-NEXT: [[TMP1:%.*]] = tail call <2048 x i1> @llvm.ppc.mma.dmsha3hash(<2048 x i1> [[TMP0]], i32 4)
// CHECK-NEXT: store <2048 x i1> [[TMP1]], ptr [[RESP]], align 256, !tbaa [[__DMR2048_TBAA9]]
// CHECK-NEXT: ret void
//
// AIX-LABEL: define void @test_dmsha3hash(
// AIX-SAME: ptr noundef readonly captures(none) [[VDMRPP:%.*]], ptr noundef writeonly captures(none) initializes((0, 256)) [[RESP:%.*]]) local_unnamed_addr #[[ATTR0]] {
// AIX-NEXT: [[ENTRY:.*:]]
// AIX-NEXT: [[TMP0:%.*]] = load <2048 x i1>, ptr [[VDMRPP]], align 256, !tbaa [[__DMR2048_TBAA9:![0-9]+]]
// AIX-NEXT: [[TMP1:%.*]] = tail call <2048 x i1> @llvm.ppc.mma.dmsha3hash(<2048 x i1> [[TMP0]], i32 4)
// AIX-NEXT: store <2048 x i1> [[TMP1]], ptr [[RESP]], align 256, !tbaa [[__DMR2048_TBAA9]]
// AIX-NEXT: ret void
//
void test_dmsha3hash(unsigned char *vdmrpp, unsigned char *resp) {
__dmr2048 vdmrp = *((__dmr2048 *)vdmrpp);
__builtin_mma_dmsha3hash(&vdmrp, 4);
*((__dmr2048 *)resp) = vdmrp;
}

// CHECK-LABEL: define dso_local void @test_dmxxshapad(
// CHECK-SAME: ptr noundef readonly captures(none) [[VDMRP:%.*]], <16 x i8> noundef [[VC:%.*]], ptr noundef writeonly captures(none) initializes((0, 128)) [[RESP:%.*]]) local_unnamed_addr #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load <1024 x i1>, ptr [[VDMRP]], align 128, !tbaa [[__DMR1024_TBAA6]]
// CHECK-NEXT: [[TMP1:%.*]] = tail call <1024 x i1> @llvm.ppc.mma.dmxxshapad(<1024 x i1> [[TMP0]], <16 x i8> [[VC]], i32 2, i32 1, i32 5)
// CHECK-NEXT: store <1024 x i1> [[TMP1]], ptr [[RESP]], align 128, !tbaa [[__DMR1024_TBAA6]]
// CHECK-NEXT: ret void
//
// AIX-LABEL: define void @test_dmxxshapad(
// AIX-SAME: ptr noundef readonly captures(none) [[VDMRP:%.*]], <16 x i8> noundef [[VC:%.*]], ptr noundef writeonly captures(none) initializes((0, 128)) [[RESP:%.*]]) local_unnamed_addr #[[ATTR0]] {
// AIX-NEXT: [[ENTRY:.*:]]
// AIX-NEXT: [[TMP0:%.*]] = load <1024 x i1>, ptr [[VDMRP]], align 128, !tbaa [[__DMR1024_TBAA6]]
// AIX-NEXT: [[TMP1:%.*]] = tail call <1024 x i1> @llvm.ppc.mma.dmxxshapad(<1024 x i1> [[TMP0]], <16 x i8> [[VC]], i32 2, i32 1, i32 5)
// AIX-NEXT: store <1024 x i1> [[TMP1]], ptr [[RESP]], align 128, !tbaa [[__DMR1024_TBAA6]]
// AIX-NEXT: ret void
//
void test_dmxxshapad(unsigned char *vdmrp, vector unsigned char vc, unsigned char *resp) {
__dmr1024 vdmr = *((__dmr1024 *)vdmrp);
__builtin_mma_dmxxshapad(&vdmr, vc, 2, 1, 5);
*((__dmr1024 *)resp) = vdmr;
}
//.
// CHECK: [[__VECTOR_PAIR_TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}
// CHECK: [[META3]] = !{!"__vector_pair", [[META4:![0-9]+]], i64 0}
Expand All @@ -216,6 +285,8 @@ void test_dmf_basic2(char *p1, char *res1, char *res2,
// CHECK: [[__DMR1024_TBAA6]] = !{[[META7:![0-9]+]], [[META7]], i64 0}
// CHECK: [[META7]] = !{!"__dmr1024", [[META4]], i64 0}
// CHECK: [[CHAR_TBAA8]] = !{[[META4]], [[META4]], i64 0}
// CHECK: [[__DMR2048_TBAA9]] = !{[[META10:![0-9]+]], [[META10]], i64 0}
// CHECK: [[META10]] = !{!"__dmr2048", [[META4]], i64 0}
//.
// AIX: [[__VECTOR_PAIR_TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}
// AIX: [[META3]] = !{!"__vector_pair", [[META4:![0-9]+]], i64 0}
Expand All @@ -224,4 +295,6 @@ void test_dmf_basic2(char *p1, char *res1, char *res2,
// AIX: [[__DMR1024_TBAA6]] = !{[[META7:![0-9]+]], [[META7]], i64 0}
// AIX: [[META7]] = !{!"__dmr1024", [[META4]], i64 0}
// AIX: [[CHAR_TBAA8]] = !{[[META4]], [[META4]], i64 0}
// AIX: [[__DMR2048_TBAA9]] = !{[[META10:![0-9]+]], [[META10]], i64 0}
// AIX: [[META10]] = !{!"__dmr2048", [[META4]], i64 0}
//.
10 changes: 9 additions & 1 deletion clang/test/CodeGen/PowerPC/ppc-dmf-mma-builtin-err.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
// RUN: FileCheck --check-prefix=ISA_FUTURE %s

//__attribute__((target("no-mma")))
void test_mma(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc) {
__attribute__((target("no-mma")))
void test_mma(unsigned char *vdmrpp, unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc) {
__dmr2048 vdmrpair = *((__dmr2048 *)vdmrpp);
__dmr1024 vdmr = *((__dmr1024 *)vdmrp);
__vector_pair vp = *((__vector_pair *)vpp);
__builtin_mma_dmxvi8gerx4(&vdmr, vp, vc);
Expand All @@ -23,6 +25,9 @@ void test_mma(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc)
__builtin_mma_dmxor(&vdmr, (__dmr1024*)vpp);
__builtin_mma_build_dmr(&vdmr, vc, vc, vc, vc, vc, vc, vc, vc);
__builtin_mma_disassemble_dmr(vdmrp, &vdmr);
__builtin_mma_dmsha2hash(&vdmr, &vdmr, 0);
__builtin_mma_dmsha3hash(&vdmrpair, 0);
__builtin_mma_dmxxshapad(&vdmr, vc, 0, 0, 0);

// CHECK: error: '__builtin_mma_dmxvi8gerx4' needs target feature mma,paired-vector-memops
// CHECK: error: '__builtin_mma_pmdmxvi8gerx4' needs target feature mma,paired-vector-memops
Expand All @@ -35,6 +40,9 @@ void test_mma(unsigned char *vdmrp, unsigned char *vpp, vector unsigned char vc)
// ISA_FUTURE: error: '__builtin_mma_dmxor' needs target feature mma,isa-future-instructions
// ISA_FUTURE: error: '__builtin_mma_build_dmr' needs target feature mma,isa-future-instructions
// ISA_FUTURE: error: '__builtin_mma_disassemble_dmr' needs target feature mma,isa-future-instructions
// CHECK: error: '__builtin_mma_dmsha2hash' needs target feature mma,isa-future-instructions
// CHECK: error: '__builtin_mma_dmsha3hash' needs target feature mma,isa-future-instructions
// CHECK: error: '__builtin_mma_dmxxshapad' needs target feature mma,isa-future-instructions

// DMF VSX Vector bfloat16 GER 2x builtins.

Expand Down
156 changes: 156 additions & 0 deletions clang/test/CodeGen/PowerPC/ppc-dmf-types.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,162 @@
// RUN: %clang_cc1 -triple powerpc64le-linux-unknown -target-cpu future \
// RUN: -emit-llvm -o - %s | FileCheck %s

// CHECK-LABEL: @test_dmrp_copy(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[PTR1_ADDR:%.*]] = alloca ptr, align 8
// CHECK-NEXT: [[PTR2_ADDR:%.*]] = alloca ptr, align 8
// CHECK-NEXT: store ptr [[PTR1:%.*]], ptr [[PTR1_ADDR]], align 8
// CHECK-NEXT: store ptr [[PTR2:%.*]], ptr [[PTR2_ADDR]], align 8
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR1_ADDR]], align 8
// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds <2048 x i1>, ptr [[TMP0]], i64 2
// CHECK-NEXT: [[TMP1:%.*]] = load <2048 x i1>, ptr [[ADD_PTR]], align 256
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[PTR2_ADDR]], align 8
// CHECK-NEXT: [[ADD_PTR1:%.*]] = getelementptr inbounds <2048 x i1>, ptr [[TMP2]], i64 1
// CHECK-NEXT: store <2048 x i1> [[TMP1]], ptr [[ADD_PTR1]], align 256
// CHECK-NEXT: ret void
//
void test_dmrp_copy(__dmr2048 *ptr1, __dmr2048 *ptr2) {
*(ptr2 + 1) = *(ptr1 + 2);
}

// CHECK-LABEL: @test_dmrp_typedef(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[INP_ADDR:%.*]] = alloca ptr, align 8
// CHECK-NEXT: [[OUTP_ADDR:%.*]] = alloca ptr, align 8
// CHECK-NEXT: [[VDMRPIN:%.*]] = alloca ptr, align 8
// CHECK-NEXT: [[VDMRPOUT:%.*]] = alloca ptr, align 8
// CHECK-NEXT: store ptr [[INP:%.*]], ptr [[INP_ADDR]], align 8
// CHECK-NEXT: store ptr [[OUTP:%.*]], ptr [[OUTP_ADDR]], align 8
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[INP_ADDR]], align 8
// CHECK-NEXT: store ptr [[TMP0]], ptr [[VDMRPIN]], align 8
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[OUTP_ADDR]], align 8
// CHECK-NEXT: store ptr [[TMP1]], ptr [[VDMRPOUT]], align 8
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[VDMRPIN]], align 8
// CHECK-NEXT: [[TMP3:%.*]] = load <2048 x i1>, ptr [[TMP2]], align 256
// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[VDMRPOUT]], align 8
// CHECK-NEXT: store <2048 x i1> [[TMP3]], ptr [[TMP4]], align 256
// CHECK-NEXT: ret void
//
void test_dmrp_typedef(int *inp, int *outp) {
__dmr2048 *vdmrpin = (__dmr2048 *)inp;
__dmr2048 *vdmrpout = (__dmr2048 *)outp;
*vdmrpout = *vdmrpin;
}

// CHECK-LABEL: @test_dmrp_arg(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[VDMRP_ADDR:%.*]] = alloca ptr, align 8
// CHECK-NEXT: [[PTR_ADDR:%.*]] = alloca ptr, align 8
// CHECK-NEXT: [[VDMRPP:%.*]] = alloca ptr, align 8
// CHECK-NEXT: store ptr [[VDMRP:%.*]], ptr [[VDMRP_ADDR]], align 8
// CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[PTR_ADDR]], align 8
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR_ADDR]], align 8
// CHECK-NEXT: store ptr [[TMP0]], ptr [[VDMRPP]], align 8
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VDMRP_ADDR]], align 8
// CHECK-NEXT: [[TMP2:%.*]] = load <2048 x i1>, ptr [[TMP1]], align 256
// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VDMRPP]], align 8
// CHECK-NEXT: store <2048 x i1> [[TMP2]], ptr [[TMP3]], align 256
// CHECK-NEXT: ret void
//
void test_dmrp_arg(__dmr2048 *vdmrp, int *ptr) {
__dmr2048 *vdmrpp = (__dmr2048 *)ptr;
*vdmrpp = *vdmrp;
}

// CHECK-LABEL: @test_dmrp_const_arg(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[VDMRP_ADDR:%.*]] = alloca ptr, align 8
// CHECK-NEXT: [[PTR_ADDR:%.*]] = alloca ptr, align 8
// CHECK-NEXT: [[VDMRPP:%.*]] = alloca ptr, align 8
// CHECK-NEXT: store ptr [[VDMRP:%.*]], ptr [[VDMRP_ADDR]], align 8
// CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[PTR_ADDR]], align 8
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR_ADDR]], align 8
// CHECK-NEXT: store ptr [[TMP0]], ptr [[VDMRPP]], align 8
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VDMRP_ADDR]], align 8
// CHECK-NEXT: [[TMP2:%.*]] = load <2048 x i1>, ptr [[TMP1]], align 256
// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VDMRPP]], align 8
// CHECK-NEXT: store <2048 x i1> [[TMP2]], ptr [[TMP3]], align 256
// CHECK-NEXT: ret void
//
void test_dmrp_const_arg(const __dmr2048 *const vdmrp, int *ptr) {
__dmr2048 *vdmrpp = (__dmr2048 *)ptr;
*vdmrpp = *vdmrp;
}

// CHECK-LABEL: @test_dmrp_array_arg(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[VDMRPA_ADDR:%.*]] = alloca ptr, align 8
// CHECK-NEXT: [[PTR_ADDR:%.*]] = alloca ptr, align 8
// CHECK-NEXT: [[VDMRPP:%.*]] = alloca ptr, align 8
// CHECK-NEXT: store ptr [[VDMRPA:%.*]], ptr [[VDMRPA_ADDR]], align 8
// CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[PTR_ADDR]], align 8
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR_ADDR]], align 8
// CHECK-NEXT: store ptr [[TMP0]], ptr [[VDMRPP]], align 8
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VDMRPA_ADDR]], align 8
// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds <2048 x i1>, ptr [[TMP1]], i64 0
// CHECK-NEXT: [[TMP2:%.*]] = load <2048 x i1>, ptr [[ARRAYIDX]], align 256
// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[VDMRPP]], align 8
// CHECK-NEXT: store <2048 x i1> [[TMP2]], ptr [[TMP3]], align 256
// CHECK-NEXT: ret void
//
void test_dmrp_array_arg(__dmr2048 vdmrpa[], int *ptr) {
__dmr2048 *vdmrpp = (__dmr2048 *)ptr;
*vdmrpp = vdmrpa[0];
}

// CHECK-LABEL: @test_dmrp_ret_const(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[PTR_ADDR:%.*]] = alloca ptr, align 8
// CHECK-NEXT: [[VDMRPP:%.*]] = alloca ptr, align 8
// CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[PTR_ADDR]], align 8
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR_ADDR]], align 8
// CHECK-NEXT: store ptr [[TMP0]], ptr [[VDMRPP]], align 8
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VDMRPP]], align 8
// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds <2048 x i1>, ptr [[TMP1]], i64 2
// CHECK-NEXT: ret ptr [[ADD_PTR]]
//
const __dmr2048 *test_dmrp_ret_const(int *ptr) {
__dmr2048 *vdmrpp = (__dmr2048 *)ptr;
return vdmrpp + 2;
}

// CHECK-LABEL: @test_dmrp_sizeof_alignof(
// CHECK-NEXT: entry:
// CHECK-NEXT: [[PTR_ADDR:%.*]] = alloca ptr, align 8
// CHECK-NEXT: [[VDMRPP:%.*]] = alloca ptr, align 8
// CHECK-NEXT: [[VDMRP:%.*]] = alloca <2048 x i1>, align 256
// CHECK-NEXT: [[SIZET:%.*]] = alloca i32, align 4
// CHECK-NEXT: [[ALIGNT:%.*]] = alloca i32, align 4
// CHECK-NEXT: [[SIZEV:%.*]] = alloca i32, align 4
// CHECK-NEXT: [[ALIGNV:%.*]] = alloca i32, align 4
// CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[PTR_ADDR]], align 8
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[PTR_ADDR]], align 8
// CHECK-NEXT: store ptr [[TMP0]], ptr [[VDMRPP]], align 8
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[VDMRPP]], align 8
// CHECK-NEXT: [[TMP2:%.*]] = load <2048 x i1>, ptr [[TMP1]], align 256
// CHECK-NEXT: store <2048 x i1> [[TMP2]], ptr [[VDMRP]], align 256
// CHECK-NEXT: store i32 256, ptr [[SIZET]], align 4
// CHECK-NEXT: store i32 256, ptr [[ALIGNT]], align 4
// CHECK-NEXT: store i32 256, ptr [[SIZEV]], align 4
// CHECK-NEXT: store i32 256, ptr [[ALIGNV]], align 4
// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[SIZET]], align 4
// CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[ALIGNT]], align 4
// CHECK-NEXT: [[ADD:%.*]] = add i32 [[TMP3]], [[TMP4]]
// CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[SIZEV]], align 4
// CHECK-NEXT: [[ADD1:%.*]] = add i32 [[ADD]], [[TMP5]]
// CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[ALIGNV]], align 4
// CHECK-NEXT: [[ADD2:%.*]] = add i32 [[ADD1]], [[TMP6]]
// CHECK-NEXT: ret i32 [[ADD2]]
//
int test_dmrp_sizeof_alignof(int *ptr) {
__dmr2048 *vdmrpp = (__dmr2048 *)ptr;
__dmr2048 vdmrp = *vdmrpp;
unsigned sizet = sizeof(__dmr2048);
unsigned alignt = __alignof__(__dmr2048);
unsigned sizev = sizeof(vdmrp);
unsigned alignv = __alignof__(vdmrp);
return sizet + alignt + sizev + alignv;
}

// CHECK-LABEL: @test_dmr_copy(
// CHECK-NEXT: entry:
Expand Down
3 changes: 3 additions & 0 deletions clang/test/CodeGenCXX/ppc-mangle-mma-types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
// RUN: %clang_cc1 -triple powerpc64le-linux-unknown -target-cpu pwr8 %s \
// RUN: -emit-llvm -o - | FileCheck %s

// CHECK: _Z1fPu9__dmr2048
void f(__dmr2048 *vdmrp) {}

// CHECK: _Z2f0Pu9__dmr1024
void f0(__dmr1024 *vdmr) {}

Expand Down
Loading