123 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 52// RUN: %clang_cc1 -triple loongarch32 -fexperimental-max-bitint-width=1024 -emit-llvm %s -o - | FileCheck %s --check-prefix=LA323// RUN: %clang_cc1 -triple loongarch64 -fexperimental-max-bitint-width=1024 -emit-llvm %s -o - | FileCheck %s --check-prefix=LA644 5/// Testing the alignment and size of _BitInt(N) for different values of N.6 7void pass_BitInt7(_BitInt(7));8void pass_BitInt65(_BitInt(65));9void pass_BitInt129(_BitInt(129));10 11// LA32-LABEL: define dso_local void @example_BitInt(12// LA32-SAME: ) #[[ATTR0:[0-9]+]] {13// LA32-NEXT: [[ENTRY:.*:]]14// LA32-NEXT: [[L7:%.*]] = alloca i8, align 115// LA32-NEXT: [[L65:%.*]] = alloca i128, align 1616// LA32-NEXT: [[L129:%.*]] = alloca [32 x i8], align 1617// LA32-NEXT: [[BYVAL_TEMP:%.*]] = alloca i128, align 1618// LA32-NEXT: [[BYVAL_TEMP3:%.*]] = alloca [32 x i8], align 1619// LA32-NEXT: store i8 0, ptr [[L7]], align 120// LA32-NEXT: store i128 0, ptr [[L65]], align 1621// LA32-NEXT: store i256 0, ptr [[L129]], align 1622// LA32-NEXT: [[TMP0:%.*]] = load i8, ptr [[L7]], align 123// LA32-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i724// LA32-NEXT: call void @pass_BitInt7(i7 noundef signext [[LOADEDV]])25// LA32-NEXT: [[TMP1:%.*]] = load i128, ptr [[L65]], align 1626// LA32-NEXT: [[LOADEDV1:%.*]] = trunc i128 [[TMP1]] to i6527// LA32-NEXT: [[STOREDV:%.*]] = sext i65 [[LOADEDV1]] to i12828// LA32-NEXT: store i128 [[STOREDV]], ptr [[BYVAL_TEMP]], align 1629// LA32-NEXT: call void @pass_BitInt65(ptr dead_on_return noundef [[BYVAL_TEMP]])30// LA32-NEXT: [[TMP2:%.*]] = load i256, ptr [[L129]], align 1631// LA32-NEXT: [[LOADEDV2:%.*]] = trunc i256 [[TMP2]] to i12932// LA32-NEXT: [[STOREDV4:%.*]] = sext i129 [[LOADEDV2]] to i25633// LA32-NEXT: store i256 [[STOREDV4]], ptr [[BYVAL_TEMP3]], align 1634// LA32-NEXT: call void @pass_BitInt129(ptr dead_on_return noundef [[BYVAL_TEMP3]])35// LA32-NEXT: ret void36//37// LA64-LABEL: define dso_local void @example_BitInt(38// LA64-SAME: ) #[[ATTR0:[0-9]+]] {39// LA64-NEXT: [[ENTRY:.*:]]40// LA64-NEXT: [[L7:%.*]] = alloca i8, align 141// LA64-NEXT: [[L65:%.*]] = alloca i128, align 1642// LA64-NEXT: [[L129:%.*]] = alloca i256, align 1643// LA64-NEXT: [[BYVAL_TEMP:%.*]] = alloca i256, align 1644// LA64-NEXT: store i8 0, ptr [[L7]], align 145// LA64-NEXT: store i128 0, ptr [[L65]], align 1646// LA64-NEXT: store i256 0, ptr [[L129]], align 1647// LA64-NEXT: [[TMP0:%.*]] = load i8, ptr [[L7]], align 148// LA64-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i749// LA64-NEXT: call void @pass_BitInt7(i7 noundef signext [[LOADEDV]])50// LA64-NEXT: [[TMP1:%.*]] = load i128, ptr [[L65]], align 1651// LA64-NEXT: [[LOADEDV1:%.*]] = trunc i128 [[TMP1]] to i6552// LA64-NEXT: call void @pass_BitInt65(i65 noundef [[LOADEDV1]])53// LA64-NEXT: [[TMP2:%.*]] = load i256, ptr [[L129]], align 1654// LA64-NEXT: [[LOADEDV2:%.*]] = trunc i256 [[TMP2]] to i12955// LA64-NEXT: [[STOREDV:%.*]] = sext i129 [[LOADEDV2]] to i25656// LA64-NEXT: store i256 [[STOREDV]], ptr [[BYVAL_TEMP]], align 1657// LA64-NEXT: call void @pass_BitInt129(ptr dead_on_return noundef [[BYVAL_TEMP]])58// LA64-NEXT: ret void59//60void example_BitInt(void) {61 _BitInt(7) l7 = {0};62 _BitInt(65) l65 = {0};63 _BitInt(129) l129 = {0};64 pass_BitInt7(l7);65 pass_BitInt65(l65);66 pass_BitInt129(l129);67}68 69// LA32-LABEL: define dso_local signext i7 @return_large_BitInt7(70// LA32-SAME: ) #[[ATTR0]] {71// LA32-NEXT: [[ENTRY:.*:]]72// LA32-NEXT: ret i7 073//74// LA64-LABEL: define dso_local signext i7 @return_large_BitInt7(75// LA64-SAME: ) #[[ATTR0]] {76// LA64-NEXT: [[ENTRY:.*:]]77// LA64-NEXT: ret i7 078//79_BitInt(7) return_large_BitInt7(void) { return 0; }80// LA32-LABEL: define dso_local void @return_large_BitInt65(81// LA32-SAME: ptr dead_on_unwind noalias writable sret(i128) align 16 [[AGG_RESULT:%.*]]) #[[ATTR0]] {82// LA32-NEXT: [[ENTRY:.*:]]83// LA32-NEXT: [[RESULT_PTR:%.*]] = alloca ptr, align 484// LA32-NEXT: store ptr [[AGG_RESULT]], ptr [[RESULT_PTR]], align 485// LA32-NEXT: store i128 0, ptr [[AGG_RESULT]], align 1686// LA32-NEXT: [[TMP0:%.*]] = load i128, ptr [[AGG_RESULT]], align 1687// LA32-NEXT: [[LOADEDV:%.*]] = trunc i128 [[TMP0]] to i6588// LA32-NEXT: [[STOREDV:%.*]] = sext i65 [[LOADEDV]] to i12889// LA32-NEXT: store i128 [[STOREDV]], ptr [[AGG_RESULT]], align 1690// LA32-NEXT: ret void91//92// LA64-LABEL: define dso_local i65 @return_large_BitInt65(93// LA64-SAME: ) #[[ATTR0]] {94// LA64-NEXT: [[ENTRY:.*:]]95// LA64-NEXT: ret i65 096//97_BitInt(65) return_large_BitInt65(void) { return 0; }98// LA32-LABEL: define dso_local void @return_large_BitInt129(99// LA32-SAME: ptr dead_on_unwind noalias writable sret([32 x i8]) align 16 [[AGG_RESULT:%.*]]) #[[ATTR0]] {100// LA32-NEXT: [[ENTRY:.*:]]101// LA32-NEXT: [[RESULT_PTR:%.*]] = alloca ptr, align 4102// LA32-NEXT: store ptr [[AGG_RESULT]], ptr [[RESULT_PTR]], align 4103// LA32-NEXT: store i256 0, ptr [[AGG_RESULT]], align 16104// LA32-NEXT: [[TMP0:%.*]] = load i256, ptr [[AGG_RESULT]], align 16105// LA32-NEXT: [[LOADEDV:%.*]] = trunc i256 [[TMP0]] to i129106// LA32-NEXT: [[STOREDV:%.*]] = sext i129 [[LOADEDV]] to i256107// LA32-NEXT: store i256 [[STOREDV]], ptr [[AGG_RESULT]], align 16108// LA32-NEXT: ret void109//110// LA64-LABEL: define dso_local void @return_large_BitInt129(111// LA64-SAME: ptr dead_on_unwind noalias writable sret(i256) align 16 [[AGG_RESULT:%.*]]) #[[ATTR0]] {112// LA64-NEXT: [[ENTRY:.*:]]113// LA64-NEXT: [[RESULT_PTR:%.*]] = alloca ptr, align 8114// LA64-NEXT: store ptr [[AGG_RESULT]], ptr [[RESULT_PTR]], align 8115// LA64-NEXT: store i256 0, ptr [[AGG_RESULT]], align 16116// LA64-NEXT: [[TMP0:%.*]] = load i256, ptr [[AGG_RESULT]], align 16117// LA64-NEXT: [[LOADEDV:%.*]] = trunc i256 [[TMP0]] to i129118// LA64-NEXT: [[STOREDV:%.*]] = sext i129 [[LOADEDV]] to i256119// LA64-NEXT: store i256 [[STOREDV]], ptr [[AGG_RESULT]], align 16120// LA64-NEXT: ret void121//122_BitInt(129) return_large_BitInt129(void) { return 0; }123