https://github.com/nikic updated https://github.com/llvm/llvm-project/pull/232729
>From 2b18b770fe53b374a2a7a66bfb84574247c20e18 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Wed, 14 Oct 2026 14:39:53 +0200 Subject: [PATCH 1/2] [Clang][ABI][X86] Do not emit zeroext/signext for return values This stops emitting the zeroext/signext attributes for return values on X86, except for `bool` (which stays zeroext) and Darwin. The `getTypeForExtReturn()` in the X86 backend already ignores zeroext/signext for i8 and i16 types on non-Darwin platforms. For these cases, this change has no impact on codegen: The intent is merely to clarify the used psABI. Using zeroext/signext when no actual extension takes place is highly confusing, esp. when the behavior is different between return values and arguments. However, this *does* change behavior for non-i8/i16 types. Specifically, it changes `_BitInt` types to have unspecified high bits, instead of performing a partial sign/zero extension to 8, 16 or 32 bits. This makes `_BitInt` comply with the Linux psABI, the previous behavior was incorrect. MSVC does not support `_BitInt`, so there is no correct ABI there. Because the only case with actual behavior change is `_BitInt`, I'm not bothering with `-fclang-abi-compat` for this change. We explicitly document `_BitInt` as not ABI stable at this point. This change does not affect handling of arguments. --- clang/lib/CodeGen/Targets/X86.cpp | 24 +++++++-- clang/test/C/C2y/n3254.c | 4 +- clang/test/CodeGen/X86/ms-x86-intrinsics.c | 4 +- clang/test/CodeGen/X86/x86_64-arguments.c | 6 +-- clang/test/CodeGen/attr-noundef.cpp | 2 +- .../test/CodeGen/attr-sized-by-for-pointers.c | 24 ++++----- .../attr-sized-by-or-null-for-pointers.c | 24 ++++----- clang/test/CodeGen/function-attributes.c | 8 +-- .../test/CodeGen/overflow-behavior-types.cpp | 2 +- .../test/CodeGenCXX/cxx20-consteval-crash.cpp | 6 +-- clang/test/CodeGenCXX/ext-int.cpp | 4 +- .../test/CodeGenCXX/ms-inline-asm-return.cpp | 4 +- clang/test/CodeGenCXX/pr12251.cpp | 2 +- clang/test/CodeGenObjC/property.m | 6 +-- clang/test/DebugInfo/CXX/ptr-to-ptr.cpp | 4 +- ...ibute_parallel_for_num_threads_codegen.cpp | 8 +-- ..._parallel_for_simd_num_threads_codegen.cpp | 10 ++-- llvm/lib/ABI/Targets/X86.cpp | 23 +++++++-- llvm/unittests/ABI/X86TargetInfoTest.cpp | 49 +++++++++++++++++++ 19 files changed, 146 insertions(+), 68 deletions(-) diff --git a/clang/lib/CodeGen/Targets/X86.cpp b/clang/lib/CodeGen/Targets/X86.cpp index c5c8bd4c0b27d2..b2ffd1f2f84204 100644 --- a/clang/lib/CodeGen/Targets/X86.cpp +++ b/clang/lib/CodeGen/Targets/X86.cpp @@ -459,6 +459,18 @@ bool X86_32ABIInfo::canExpandIndirectArgument(QualType Ty) const { return Size == getContext().getTypeSize(Ty); } +static bool shouldExtendReturnType(const ABIInfo &Info, QualType RetTy) { + // Bools need to be zero-extended to 8 bits for all ABIs. + if (RetTy->isBooleanType()) + return true; + + // Promotable integer types get extended only for Darwin. + if (!Info.getTarget().getTriple().isOSDarwin()) + return false; + + return Info.isPromotableIntegerTypeForABI(RetTy); +} + ABIArgInfo X86_32ABIInfo::getIndirectReturnResult(QualType RetTy, CCState &State) const { // If the return value is indirect, then the hidden argument is consuming one // integer register. @@ -565,8 +577,8 @@ ABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy, if (EIT->getNumBits() > 64) return getIndirectReturnResult(RetTy, State); - return (isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy) - : ABIArgInfo::getDirect()); + return shouldExtendReturnType(*this, RetTy) ? ABIArgInfo::getExtend(RetTy) + : ABIArgInfo::getDirect(); } unsigned X86_32ABIInfo::getTypeStackAlignInBytes(QualType Ty, @@ -2385,8 +2397,8 @@ ABIArgInfo X86_64ABIInfo::getIndirectReturnResult(QualType Ty) const { return getNaturalAlignIndirect(Ty, getDataLayout().getAllocaAddrSpace()); llvm::Type *IRTy = CGT.ConvertType(Ty); - return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty, IRTy) - : ABIArgInfo::getDirect(IRTy)); + return shouldExtendReturnType(*this, Ty) ? ABIArgInfo::getExtend(Ty, IRTy) + : ABIArgInfo::getDirect(IRTy); } return getNaturalAlignIndirect(Ty, getDataLayout().getAllocaAddrSpace()); @@ -2838,7 +2850,9 @@ ABIArgInfo X86_64ABIInfo::classifyReturnType(QualType RetTy) const { if (RetTy->isIntegralOrEnumerationType() && isPromotableIntegerTypeForABI(RetTy)) - return ABIArgInfo::getExtend(RetTy); + return shouldExtendReturnType(*this, RetTy) + ? ABIArgInfo::getExtend(RetTy) + : ABIArgInfo::getDirect(); } if (ResType->isIntegerTy(128)) { diff --git a/clang/test/C/C2y/n3254.c b/clang/test/C/C2y/n3254.c index 9f8c47756df328..c83217559a704c 100644 --- a/clang/test/C/C2y/n3254.c +++ b/clang/test/C/C2y/n3254.c @@ -37,7 +37,7 @@ int foo() { return s_ptr->x; } -// CHECK-LABEL: define dso_local signext i8 @bar( +// CHECK-LABEL: define dso_local i8 @bar( // CHECK-SAME: ) #[[ATTR0]] { // CHECK-NEXT: [[ENTRY:.*:]] // CHECK-NEXT: [[BUFFER:%.*]] = alloca [12 x i8], align 4 @@ -77,7 +77,7 @@ struct T { DECL_BUFFER(struct S, buffer); }; -// CHECK-LABEL: define dso_local signext i8 @quux( +// CHECK-LABEL: define dso_local i8 @quux( // CHECK-SAME: ) #[[ATTR0]] { // CHECK-NEXT: [[ENTRY:.*:]] // CHECK-NEXT: [[T:%.*]] = alloca [[STRUCT_T:%.*]], align 4 diff --git a/clang/test/CodeGen/X86/ms-x86-intrinsics.c b/clang/test/CodeGen/X86/ms-x86-intrinsics.c index 9099b56e50d45e..803444df852278 100644 --- a/clang/test/CodeGen/X86/ms-x86-intrinsics.c +++ b/clang/test/CodeGen/X86/ms-x86-intrinsics.c @@ -11,7 +11,7 @@ char test__readfsbyte(unsigned long Offset) { return __readfsbyte(++Offset); } -// CHECK-I386-LABEL: define dso_local signext i8 @test__readfsbyte(i32 noundef %Offset) +// CHECK-I386-LABEL: define dso_local i8 @test__readfsbyte(i32 noundef %Offset) // CHECK-I386: %inc = add i32 %Offset, 1 // CHECK-I386: [[PTR:%[0-9]+]] = inttoptr i32 %inc to ptr addrspace(257) // CHECK-I386: [[VALUE:%[0-9]+]] = load volatile i8, ptr addrspace(257) [[PTR]], align 1 @@ -20,7 +20,7 @@ char test__readfsbyte(unsigned long Offset) { short test__readfsword(unsigned long Offset) { return __readfsword(++Offset); } -// CHECK-I386-LABEL: define dso_local signext i16 @test__readfsword(i32 noundef %Offset) +// CHECK-I386-LABEL: define dso_local i16 @test__readfsword(i32 noundef %Offset) // CHECK-I386: %inc = add i32 %Offset, 1 // CHECK-I386: [[PTR:%[0-9]+]] = inttoptr i32 %inc to ptr addrspace(257) // CHECK-I386: [[VALUE:%[0-9]+]] = load volatile i16, ptr addrspace(257) [[PTR]], align 2 diff --git a/clang/test/CodeGen/X86/x86_64-arguments.c b/clang/test/CodeGen/X86/x86_64-arguments.c index b56792dd50cddd..73f99b9a814b4e 100644 --- a/clang/test/CodeGen/X86/x86_64-arguments.c +++ b/clang/test/CodeGen/X86/x86_64-arguments.c @@ -6,17 +6,17 @@ // RUN: FileCheck %s -check-prefix=CHECK -check-prefix=AVX -check-prefix=AVX512 #include <stdarg.h> -// CHECK-LABEL: define{{.*}} signext i8 @f0() +// CHECK-LABEL: define dso_local i8 @f0() char f0(void) { return 0; } -// CHECK-LABEL: define{{.*}} signext i16 @f1() +// CHECK-LABEL: define dso_local i16 @f1() short f1(void) { return 0; } -// CHECK-LABEL: define{{.*}} i32 @f2() +// CHECK-LABEL: define dso_local i32 @f2() int f2(void) { return 0; } diff --git a/clang/test/CodeGen/attr-noundef.cpp b/clang/test/CodeGen/attr-noundef.cpp index 582743a5be5fa6..9b14381d004b84 100644 --- a/clang/test/CodeGen/attr-noundef.cpp +++ b/clang/test/CodeGen/attr-noundef.cpp @@ -158,7 +158,7 @@ void pass_large_BitInt(_BitInt(127) e) { // CHECK: [[DEF]] ptr @{{.*}}ret_npt{{.*}}() // CHECK: [[DEF]] void @{{.*}}pass_npt{{.*}}(ptr % -// CHECK-INTEL: [[DEF]] noundef signext i3 @{{.*}}ret_BitInt{{.*}}() +// CHECK-INTEL: [[DEF]] noundef i3 @{{.*}}ret_BitInt{{.*}}() // CHECK-AARCH: [[DEF]] noundef i3 @{{.*}}ret_BitInt{{.*}}() // CHECK-INTEL: [[DEF]] void @{{.*}}pass_BitInt{{.*}}(i3 noundef signext % // CHECK-AARCH: [[DEF]] void @{{.*}}pass_BitInt{{.*}}(i3 noundef % diff --git a/clang/test/CodeGen/attr-sized-by-for-pointers.c b/clang/test/CodeGen/attr-sized-by-for-pointers.c index b7eb0d1f244e06..7b6948a5e37553 100644 --- a/clang/test/CodeGen/attr-sized-by-for-pointers.c +++ b/clang/test/CodeGen/attr-sized-by-for-pointers.c @@ -210,7 +210,7 @@ struct annotated_sized_ptr_odd_pointee { unsigned byte_count; }; -// SANITIZE-WITH-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_odd_pointee( +// SANITIZE-WITH-ATTR-LABEL: define dso_local i8 @test_load_subscript_odd_pointee( // SANITIZE-WITH-ATTR-SAME: ptr noundef [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] { // SANITIZE-WITH-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITH-ATTR-NEXT: [[DOTCOUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 16 @@ -230,7 +230,7 @@ struct annotated_sized_ptr_odd_pointee { // SANITIZE-WITH-ATTR-NEXT: [[TMP4:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA19:![0-9]+]] // SANITIZE-WITH-ATTR-NEXT: ret i8 [[TMP4]] // -// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_odd_pointee( +// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i8 @test_load_subscript_odd_pointee( // NO-SANITIZE-WITH-ATTR-SAME: ptr nofree noundef readonly captures(none) [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] { // NO-SANITIZE-WITH-ATTR-NEXT: [[ENTRY:.*:]] // NO-SANITIZE-WITH-ATTR-NEXT: [[BUF:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8 @@ -240,7 +240,7 @@ struct annotated_sized_ptr_odd_pointee { // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA17:![0-9]+]] // NO-SANITIZE-WITH-ATTR-NEXT: ret i8 [[TMP1]] // -// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_odd_pointee( +// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i8 @test_load_subscript_odd_pointee( // SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] { // SANITIZE-WITHOUT-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITHOUT-ATTR-NEXT: [[BUF:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8 @@ -250,7 +250,7 @@ struct annotated_sized_ptr_odd_pointee { // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA17:![0-9]+]] // SANITIZE-WITHOUT-ATTR-NEXT: ret i8 [[TMP1]] // -// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_odd_pointee( +// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i8 @test_load_subscript_odd_pointee( // NO-SANITIZE-WITHOUT-ATTR-SAME: ptr nofree noundef readonly captures(none) [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] { // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[ENTRY:.*:]] // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[BUF:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8 @@ -341,14 +341,14 @@ struct annotated_sized_ptr_narrow_unsigned_count { unsigned char byte_count; }; -// SANITIZE-WITH-ATTR-LABEL: define dso_local noundef signext i8 @test_load_subscript_narrow_unsigned_count( +// SANITIZE-WITH-ATTR-LABEL: define dso_local noundef i8 @test_load_subscript_narrow_unsigned_count( // SANITIZE-WITH-ATTR-SAME: ptr noundef [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] { // SANITIZE-WITH-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = zext i32 [[INDEX]] to i64, !nosanitize [[META6]] // SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB11:[0-9]+]], i64 [[TMP0]]) #[[ATTR6]], !nosanitize [[META6]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META6]] // -// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_narrow_unsigned_count( +// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i8 @test_load_subscript_narrow_unsigned_count( // NO-SANITIZE-WITH-ATTR-SAME: ptr nofree noundef readonly captures(none) [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR1]] { // NO-SANITIZE-WITH-ATTR-NEXT: [[ENTRY:.*:]] // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P]], align 8, !tbaa [[_ZTS13LARGE_POINTEEPTR_TBAA20:![0-9]+]] @@ -357,7 +357,7 @@ struct annotated_sized_ptr_narrow_unsigned_count { // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA17]] // NO-SANITIZE-WITH-ATTR-NEXT: ret i8 [[TMP1]] // -// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_narrow_unsigned_count( +// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i8 @test_load_subscript_narrow_unsigned_count( // SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] { // SANITIZE-WITHOUT-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P]], align 8, !tbaa [[_ZTS13LARGE_POINTEEPTR_TBAA20:![0-9]+]] @@ -366,7 +366,7 @@ struct annotated_sized_ptr_narrow_unsigned_count { // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA17]] // SANITIZE-WITHOUT-ATTR-NEXT: ret i8 [[TMP1]] // -// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_narrow_unsigned_count( +// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i8 @test_load_subscript_narrow_unsigned_count( // NO-SANITIZE-WITHOUT-ATTR-SAME: ptr nofree noundef readonly captures(none) [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR1]] { // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[ENTRY:.*:]] // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P]], align 8, !tbaa [[_ZTS13LARGE_POINTEEPTR_TBAA20:![0-9]+]] @@ -388,14 +388,14 @@ struct annotated_sized_ptr_narrow_signed_count { signed char byte_count; }; -// SANITIZE-WITH-ATTR-LABEL: define dso_local noundef signext i8 @test_load_subscript_narrow_signed_count( +// SANITIZE-WITH-ATTR-LABEL: define dso_local noundef i8 @test_load_subscript_narrow_signed_count( // SANITIZE-WITH-ATTR-SAME: ptr noundef [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR2]] { // SANITIZE-WITH-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = zext i32 [[INDEX]] to i64, !nosanitize [[META6]] // SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB13:[0-9]+]], i64 [[TMP0]]) #[[ATTR6]], !nosanitize [[META6]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META6]] // -// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_narrow_signed_count( +// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i8 @test_load_subscript_narrow_signed_count( // NO-SANITIZE-WITH-ATTR-SAME: ptr nofree noundef readonly captures(none) [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR1]] { // NO-SANITIZE-WITH-ATTR-NEXT: [[ENTRY:.*:]] // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P]], align 8, !tbaa [[_ZTS15MIDSIZE_POINTEEPTR_TBAA23:![0-9]+]] @@ -404,7 +404,7 @@ struct annotated_sized_ptr_narrow_signed_count { // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA17]] // NO-SANITIZE-WITH-ATTR-NEXT: ret i8 [[TMP1]] // -// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_narrow_signed_count( +// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i8 @test_load_subscript_narrow_signed_count( // SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] { // SANITIZE-WITHOUT-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P]], align 8, !tbaa [[_ZTS15MIDSIZE_POINTEEPTR_TBAA23:![0-9]+]] @@ -413,7 +413,7 @@ struct annotated_sized_ptr_narrow_signed_count { // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA17]] // SANITIZE-WITHOUT-ATTR-NEXT: ret i8 [[TMP1]] // -// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_narrow_signed_count( +// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i8 @test_load_subscript_narrow_signed_count( // NO-SANITIZE-WITHOUT-ATTR-SAME: ptr nofree noundef readonly captures(none) [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR1]] { // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[ENTRY:.*:]] // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P]], align 8, !tbaa [[_ZTS15MIDSIZE_POINTEEPTR_TBAA23:![0-9]+]] diff --git a/clang/test/CodeGen/attr-sized-by-or-null-for-pointers.c b/clang/test/CodeGen/attr-sized-by-or-null-for-pointers.c index 06452acfc03fbc..d1f0fca9174165 100644 --- a/clang/test/CodeGen/attr-sized-by-or-null-for-pointers.c +++ b/clang/test/CodeGen/attr-sized-by-or-null-for-pointers.c @@ -222,7 +222,7 @@ struct annotated_sized_ptr_odd_pointee { unsigned byte_count; }; -// SANITIZE-WITH-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_odd_pointee( +// SANITIZE-WITH-ATTR-LABEL: define dso_local i8 @test_load_subscript_odd_pointee( // SANITIZE-WITH-ATTR-SAME: ptr noundef [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] { // SANITIZE-WITH-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITH-ATTR-NEXT: [[BUF:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8 @@ -244,7 +244,7 @@ struct annotated_sized_ptr_odd_pointee { // SANITIZE-WITH-ATTR-NEXT: [[TMP6:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA19:![0-9]+]] // SANITIZE-WITH-ATTR-NEXT: ret i8 [[TMP6]] // -// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_odd_pointee( +// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i8 @test_load_subscript_odd_pointee( // NO-SANITIZE-WITH-ATTR-SAME: ptr nofree noundef readonly captures(none) [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] { // NO-SANITIZE-WITH-ATTR-NEXT: [[ENTRY:.*:]] // NO-SANITIZE-WITH-ATTR-NEXT: [[BUF:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8 @@ -254,7 +254,7 @@ struct annotated_sized_ptr_odd_pointee { // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA17:![0-9]+]] // NO-SANITIZE-WITH-ATTR-NEXT: ret i8 [[TMP1]] // -// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_odd_pointee( +// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i8 @test_load_subscript_odd_pointee( // SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] { // SANITIZE-WITHOUT-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITHOUT-ATTR-NEXT: [[BUF:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8 @@ -264,7 +264,7 @@ struct annotated_sized_ptr_odd_pointee { // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA17:![0-9]+]] // SANITIZE-WITHOUT-ATTR-NEXT: ret i8 [[TMP1]] // -// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_odd_pointee( +// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i8 @test_load_subscript_odd_pointee( // NO-SANITIZE-WITHOUT-ATTR-SAME: ptr nofree noundef readonly captures(none) [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] { // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[ENTRY:.*:]] // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[BUF:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8 @@ -357,14 +357,14 @@ struct annotated_sized_ptr_narrow_unsigned_count { unsigned char byte_count; }; -// SANITIZE-WITH-ATTR-LABEL: define dso_local noundef signext i8 @test_load_subscript_narrow_unsigned_count( +// SANITIZE-WITH-ATTR-LABEL: define dso_local noundef i8 @test_load_subscript_narrow_unsigned_count( // SANITIZE-WITH-ATTR-SAME: ptr noundef [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] { // SANITIZE-WITH-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = zext i32 [[INDEX]] to i64, !nosanitize [[META12]] // SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB11:[0-9]+]], i64 [[TMP0]]) #[[ATTR6]], !nosanitize [[META12]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META12]] // -// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_narrow_unsigned_count( +// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i8 @test_load_subscript_narrow_unsigned_count( // NO-SANITIZE-WITH-ATTR-SAME: ptr nofree noundef readonly captures(none) [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR1]] { // NO-SANITIZE-WITH-ATTR-NEXT: [[ENTRY:.*:]] // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P]], align 8, !tbaa [[_ZTS13LARGE_POINTEEPTR_TBAA20:![0-9]+]] @@ -373,7 +373,7 @@ struct annotated_sized_ptr_narrow_unsigned_count { // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA17]] // NO-SANITIZE-WITH-ATTR-NEXT: ret i8 [[TMP1]] // -// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_narrow_unsigned_count( +// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i8 @test_load_subscript_narrow_unsigned_count( // SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] { // SANITIZE-WITHOUT-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P]], align 8, !tbaa [[_ZTS13LARGE_POINTEEPTR_TBAA20:![0-9]+]] @@ -382,7 +382,7 @@ struct annotated_sized_ptr_narrow_unsigned_count { // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA17]] // SANITIZE-WITHOUT-ATTR-NEXT: ret i8 [[TMP1]] // -// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_narrow_unsigned_count( +// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i8 @test_load_subscript_narrow_unsigned_count( // NO-SANITIZE-WITHOUT-ATTR-SAME: ptr nofree noundef readonly captures(none) [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR1]] { // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[ENTRY:.*:]] // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P]], align 8, !tbaa [[_ZTS13LARGE_POINTEEPTR_TBAA20:![0-9]+]] @@ -404,14 +404,14 @@ struct annotated_sized_ptr_narrow_signed_count { signed char byte_count; }; -// SANITIZE-WITH-ATTR-LABEL: define dso_local noundef signext i8 @test_load_subscript_narrow_signed_count( +// SANITIZE-WITH-ATTR-LABEL: define dso_local noundef i8 @test_load_subscript_narrow_signed_count( // SANITIZE-WITH-ATTR-SAME: ptr noundef [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR2]] { // SANITIZE-WITH-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = zext i32 [[INDEX]] to i64, !nosanitize [[META12]] // SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB13:[0-9]+]], i64 [[TMP0]]) #[[ATTR6]], !nosanitize [[META12]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META12]] // -// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_narrow_signed_count( +// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i8 @test_load_subscript_narrow_signed_count( // NO-SANITIZE-WITH-ATTR-SAME: ptr nofree noundef readonly captures(none) [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR1]] { // NO-SANITIZE-WITH-ATTR-NEXT: [[ENTRY:.*:]] // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P]], align 8, !tbaa [[_ZTS15MIDSIZE_POINTEEPTR_TBAA23:![0-9]+]] @@ -420,7 +420,7 @@ struct annotated_sized_ptr_narrow_signed_count { // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA17]] // NO-SANITIZE-WITH-ATTR-NEXT: ret i8 [[TMP1]] // -// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_narrow_signed_count( +// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i8 @test_load_subscript_narrow_signed_count( // SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] { // SANITIZE-WITHOUT-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P]], align 8, !tbaa [[_ZTS15MIDSIZE_POINTEEPTR_TBAA23:![0-9]+]] @@ -429,7 +429,7 @@ struct annotated_sized_ptr_narrow_signed_count { // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1, !tbaa [[CHAR_TBAA17]] // SANITIZE-WITHOUT-ATTR-NEXT: ret i8 [[TMP1]] // -// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local signext i8 @test_load_subscript_narrow_signed_count( +// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i8 @test_load_subscript_narrow_signed_count( // NO-SANITIZE-WITHOUT-ATTR-SAME: ptr nofree noundef readonly captures(none) [[P:%.*]], i32 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR1]] { // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[ENTRY:.*:]] // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P]], align 8, !tbaa [[_ZTS15MIDSIZE_POINTEEPTR_TBAA23:![0-9]+]] diff --git a/clang/test/CodeGen/function-attributes.c b/clang/test/CodeGen/function-attributes.c index bb8670a8530e09..b55cdb1606e441 100644 --- a/clang/test/CodeGen/function-attributes.c +++ b/clang/test/CodeGen/function-attributes.c @@ -1,12 +1,12 @@ // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -disable-llvm-passes -Os -o - %s | FileCheck %s // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -disable-llvm-passes -Os -std=c99 -o - %s | FileCheck %s // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -disable-llvm-passes -Os -std=c99 -o - %s | FileCheck %s -// CHECK: define{{.*}} signext i8 @f0(i32 noundef %x) [[NUW:#[0-9]+]] -// CHECK: define{{.*}} zeroext i8 @f1(i32 noundef %x) [[NUW]] +// CHECK: define{{.*}} i8 @f0(i32 noundef %x) [[NUW:#[0-9]+]] +// CHECK: define{{.*}} i8 @f1(i32 noundef %x) [[NUW]] // CHECK: define{{.*}} void @f2(i8 noundef signext %x) [[NUW]] // CHECK: define{{.*}} void @f3(i8 noundef zeroext %x) [[NUW]] -// CHECK: define{{.*}} signext i16 @f4(i32 noundef %x) [[NUW]] -// CHECK: define{{.*}} zeroext i16 @f5(i32 noundef %x) [[NUW]] +// CHECK: define{{.*}} i16 @f4(i32 noundef %x) [[NUW]] +// CHECK: define{{.*}} i16 @f5(i32 noundef %x) [[NUW]] // CHECK: define{{.*}} void @f6(i16 noundef signext %x) [[NUW]] // CHECK: define{{.*}} void @f7(i16 noundef zeroext %x) [[NUW]] diff --git a/clang/test/CodeGen/overflow-behavior-types.cpp b/clang/test/CodeGen/overflow-behavior-types.cpp index 89d9d5b24cf09e..2ab535e82b2e00 100644 --- a/clang/test/CodeGen/overflow-behavior-types.cpp +++ b/clang/test/CodeGen/overflow-behavior-types.cpp @@ -26,7 +26,7 @@ void test_members(char some) { // DEFAULT-NEXT: %inc{{\d*}} = add i32 %[[CONV]], 1 (++foo.a); - // DEFAULT: %[[CALL:.*]] = call noundef signext i8 @_ZNK3Foo4getAEv + // DEFAULT: %[[CALL:.*]] = call noundef i8 @_ZNK3Foo4getAEv // DEFAULT-NEXT: sext i8 %[[CALL]] to i32 // DEFAULT-NEXT: add i32 {{.*}}, 1 (void)(foo.getA() + 1); diff --git a/clang/test/CodeGenCXX/cxx20-consteval-crash.cpp b/clang/test/CodeGenCXX/cxx20-consteval-crash.cpp index 9c9324f428bec5..d06ed9a649cc8c 100644 --- a/clang/test/CodeGenCXX/cxx20-consteval-crash.cpp +++ b/clang/test/CodeGenCXX/cxx20-consteval-crash.cpp @@ -50,11 +50,11 @@ int foo() { // UDL function, and that the constexpr f1 and f2 functions both return a // constant value. -// CHECK-NOT: define{{.*}} zeroext i8 @_ZN10Issue54578li3_UCEy +// CHECK-NOT: define{{.*}} i8 @_ZN10Issue54578li3_UCEy // CHECK: define{{.*}} i32 @_ZN10Issue545783fooEv( -// CHECK: define{{.*}} signext i8 @_ZN10Issue545782f1IcEEcT_( +// CHECK: define{{.*}} i8 @_ZN10Issue545782f1IcEEcT_( // CHECK: ret i8 4 -// CHECK: define{{.*}} signext i8 @_ZN10Issue545782f2IcEEcT_( +// CHECK: define{{.*}} i8 @_ZN10Issue545782f2IcEEcT_( // CHECK: ret i8 4 } diff --git a/clang/test/CodeGenCXX/ext-int.cpp b/clang/test/CodeGenCXX/ext-int.cpp index a45720c53e8772..6ea5d2e7dcd8eb 100644 --- a/clang/test/CodeGenCXX/ext-int.cpp +++ b/clang/test/CodeGenCXX/ext-int.cpp @@ -150,9 +150,9 @@ void ManglingInstantiator() { // LIN: call void @_Z16ManglingTestNTTPILDB99_993EEvv() // WIN: call void @"??$ManglingTestNTTP@$0DOB@@@YAXXZ"() ManglingDependent<4>(); - // LIN: call signext i4 @_Z17ManglingDependentILi4EEDTtlDBT__EEv() + // LIN: call i4 @_Z17ManglingDependentILi4EEDTtlDBT__EEv() // WIN64: call i4 @"??$ManglingDependent@$03@@YAU?$_BitInt@$03@__clang@@XZ"() - // WIN32: call signext i4 @"??$ManglingDependent@$03@@YAU?$_BitInt@$03@__clang@@XZ"() + // WIN32: call i4 @"??$ManglingDependent@$03@@YAU?$_BitInt@$03@__clang@@XZ"() uint16_t4 V; ManglingTestTemplateParam(V); // LIN: call void @_Z25ManglingTestTemplateParamIDv4_DU16_EvRT_(ptr diff --git a/clang/test/CodeGenCXX/ms-inline-asm-return.cpp b/clang/test/CodeGenCXX/ms-inline-asm-return.cpp index 30167b000abe71..afcd32a4659cad 100644 --- a/clang/test/CodeGenCXX/ms-inline-asm-return.cpp +++ b/clang/test/CodeGenCXX/ms-inline-asm-return.cpp @@ -61,7 +61,7 @@ short f_i16() { mov edx, 1 } } -// CHECK-LABEL: define dso_local signext i16 @f_i16() +// CHECK-LABEL: define dso_local i16 @f_i16() // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "=&{eax},~{edx},{{.*}}" // CHECK: %[[r_i16:[^ ]*]] = trunc i32 %[[r]] to i16 // CHECK: ret i16 %[[r_i16]] @@ -72,7 +72,7 @@ char f_i8() { mov edx, 1 } } -// CHECK-LABEL: define dso_local signext i8 @f_i8() +// CHECK-LABEL: define dso_local i8 @f_i8() // CHECK: %[[r:[^ ]*]] = call i32 asm sideeffect inteldialect "mov eax, $$1\0A\09mov edx, $$1", "=&{eax},~{edx},{{.*}}" // CHECK: %[[r_i8:[^ ]*]] = trunc i32 %[[r]] to i8 // CHECK: ret i8 %[[r_i8]] diff --git a/clang/test/CodeGenCXX/pr12251.cpp b/clang/test/CodeGenCXX/pr12251.cpp index bd5c85b83f2caf..b9c66f7c0094bb 100644 --- a/clang/test/CodeGenCXX/pr12251.cpp +++ b/clang/test/CodeGenCXX/pr12251.cpp @@ -103,7 +103,7 @@ enum e13 : char {e13_a = -1 }; e13 g13(e13 *x) { return *x; } -// CHECK-LABEL: define{{.*}} signext i8 @_Z3g13P3e13 +// CHECK-LABEL: define{{.*}} i8 @_Z3g13P3e13 // CHECK: load i8, ptr %x, align 1 // CHECK-NOT: range // CHECK: ret diff --git a/clang/test/CodeGenObjC/property.m b/clang/test/CodeGenObjC/property.m index 0c604bfc13532e..057470d9422dfc 100644 --- a/clang/test/CodeGenObjC/property.m +++ b/clang/test/CodeGenObjC/property.m @@ -131,7 +131,7 @@ void test7(Test7 *t) { // CHECK-NEXT: store // CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[T]], align // CHECK-NEXT: load ptr, ptr @OBJC_SELECTOR_REFERENCES -// CHECK-NEXT: [[T2:%.*]] = call zeroext i8 +// CHECK-NEXT: [[T2:%.*]] = call i8 // CHECK-NEXT: [[T3:%.*]] = zext i8 [[T2]] to i32 // CHECK-NEXT: [[T4:%.*]] = and i32 [[T3]], 2 // CHECK-NEXT: [[T5:%.*]] = trunc i32 [[T4]] to i8 @@ -139,7 +139,7 @@ void test7(Test7 *t) { // CHECK-NEXT: call void // CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[T]], align // CHECK-NEXT: load ptr, ptr @OBJC_SELECTOR_REFERENCES -// CHECK-NEXT: [[T2:%.*]] = call zeroext i8 +// CHECK-NEXT: [[T2:%.*]] = call i8 // CHECK-NEXT: [[T3:%.*]] = zext i8 [[T2]] to i32 // CHECK-NEXT: [[T4:%.*]] = or i32 [[T3]], 5 // CHECK-NEXT: [[T5:%.*]] = trunc i32 [[T4]] to i8 @@ -147,7 +147,7 @@ void test7(Test7 *t) { // CHECK-NEXT: call void // CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[T]], align // CHECK-NEXT: load ptr, ptr @OBJC_SELECTOR_REFERENCES -// CHECK-NEXT: [[T2:%.*]] = call zeroext i8 +// CHECK-NEXT: [[T2:%.*]] = call i8 // CHECK-NEXT: [[T3:%.*]] = zext i8 [[T2]] to i32 // CHECK-NEXT: [[T4:%.*]] = xor i32 [[T3]], 8 // CHECK-NEXT: [[T5:%.*]] = trunc i32 [[T4]] to i8 diff --git a/clang/test/DebugInfo/CXX/ptr-to-ptr.cpp b/clang/test/DebugInfo/CXX/ptr-to-ptr.cpp index 12e50a59fab4dc..45f2aa5ee56c36 100644 --- a/clang/test/DebugInfo/CXX/ptr-to-ptr.cpp +++ b/clang/test/DebugInfo/CXX/ptr-to-ptr.cpp @@ -51,7 +51,7 @@ int func3(B *b) { return local1->i; } -// CHECK-LABEL: define dso_local noundef signext i8 @{{.*}}func4{{.*}}( +// CHECK-LABEL: define dso_local noundef i8 @{{.*}}func4{{.*}}( // CHECK: [[A_ADDR:%.*]] = getelementptr inbounds nuw %class.C, ptr {{%.*}}, i32 0, i32 1 // CHECK-NEXT: [[A:%.*]] = load ptr, ptr [[A_ADDR]], // CHECK-NEXT: #dbg_value(ptr [[A]], [[META6:![0-9]+]], !DIExpression(), @@ -64,7 +64,7 @@ char func4(C *c) { return foo(c->a->i)->c; } -// CHECK-LABEL: define dso_local noundef signext i8 @{{.*}}func5{{.*}}( +// CHECK-LABEL: define dso_local noundef i8 @{{.*}}func5{{.*}}( // CHECK: #dbg_declare(ptr {{%.*}}, [[META7:![0-9]+]], !DIExpression(), // CHECK: #dbg_declare(ptr {{%.*}}, [[META8:![0-9]+]], !DIExpression(), // CHECK: [[A_ADDR:%.*]] = getelementptr inbounds %class.A, ptr {{%.*}}, i64 {{%.*}}, diff --git a/clang/test/OpenMP/distribute_parallel_for_num_threads_codegen.cpp b/clang/test/OpenMP/distribute_parallel_for_num_threads_codegen.cpp index 9e450c0c067eba..e4458dc74211da 100644 --- a/clang/test/OpenMP/distribute_parallel_for_num_threads_codegen.cpp +++ b/clang/test/OpenMP/distribute_parallel_for_num_threads_codegen.cpp @@ -2510,7 +2510,7 @@ int main() { // CHECK1-NEXT: [[KERNEL_ARGS5:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8 // CHECK1-NEXT: store i32 0, ptr [[RETVAL]], align 4 // CHECK1-NEXT: call void @_ZN1SC1El(ptr noundef nonnull align 8 dereferenceable(24) [[S]], i64 noundef 0) -// CHECK1-NEXT: [[CALL:%.*]] = invoke noundef signext i8 @_ZN1ScvcEv(ptr noundef nonnull align 8 dereferenceable(24) [[S]]) +// CHECK1-NEXT: [[CALL:%.*]] = invoke noundef i8 @_ZN1ScvcEv(ptr noundef nonnull align 8 dereferenceable(24) [[S]]) // CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]] // CHECK1: invoke.cont: // CHECK1-NEXT: store i8 [[CALL]], ptr [[A]], align 1 @@ -3695,7 +3695,7 @@ int main() { // CHECK1-NEXT: invoke void @_ZN1SC1El(ptr noundef nonnull align 8 dereferenceable(24) [[REF_TMP]], i64 noundef 23) // CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] // CHECK1: invoke.cont: -// CHECK1-NEXT: [[CALL:%.*]] = invoke noundef signext i8 @_ZN1ScvcEv(ptr noundef nonnull align 8 dereferenceable(24) [[REF_TMP]]) +// CHECK1-NEXT: [[CALL:%.*]] = invoke noundef i8 @_ZN1ScvcEv(ptr noundef nonnull align 8 dereferenceable(24) [[REF_TMP]]) // CHECK1-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[TERMINATE_LPAD]] // CHECK1: invoke.cont2: // CHECK1-NEXT: [[TMP7:%.*]] = sext i8 [[CALL]] to i32 @@ -3835,7 +3835,7 @@ int main() { // CHECK5-NEXT: [[KERNEL_ARGS5:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8 // CHECK5-NEXT: store i32 0, ptr [[RETVAL]], align 4 // CHECK5-NEXT: call void @_ZN1SC1El(ptr noundef nonnull align 8 dereferenceable(24) [[S]], i64 noundef 0) -// CHECK5-NEXT: [[CALL:%.*]] = invoke noundef signext i8 @_ZN1ScvcEv(ptr noundef nonnull align 8 dereferenceable(24) [[S]]) +// CHECK5-NEXT: [[CALL:%.*]] = invoke noundef i8 @_ZN1ScvcEv(ptr noundef nonnull align 8 dereferenceable(24) [[S]]) // CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]] // CHECK5: invoke.cont: // CHECK5-NEXT: store i8 [[CALL]], ptr [[A]], align 1 @@ -5020,7 +5020,7 @@ int main() { // CHECK5-NEXT: invoke void @_ZN1SC1El(ptr noundef nonnull align 8 dereferenceable(24) [[REF_TMP]], i64 noundef 23) // CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]] // CHECK5: invoke.cont: -// CHECK5-NEXT: [[CALL:%.*]] = invoke noundef signext i8 @_ZN1ScvcEv(ptr noundef nonnull align 8 dereferenceable(24) [[REF_TMP]]) +// CHECK5-NEXT: [[CALL:%.*]] = invoke noundef i8 @_ZN1ScvcEv(ptr noundef nonnull align 8 dereferenceable(24) [[REF_TMP]]) // CHECK5-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[TERMINATE_LPAD]] // CHECK5: invoke.cont2: // CHECK5-NEXT: [[TMP7:%.*]] = sext i8 [[CALL]] to i32 diff --git a/clang/test/OpenMP/distribute_parallel_for_simd_num_threads_codegen.cpp b/clang/test/OpenMP/distribute_parallel_for_simd_num_threads_codegen.cpp index 5ee7b48321d29f..5a79e5c82f94d3 100644 --- a/clang/test/OpenMP/distribute_parallel_for_simd_num_threads_codegen.cpp +++ b/clang/test/OpenMP/distribute_parallel_for_simd_num_threads_codegen.cpp @@ -114,7 +114,7 @@ int main() { // CHECK1-NEXT: [[KERNEL_ARGS5:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8 // CHECK1-NEXT: store i32 0, ptr [[RETVAL]], align 4 // CHECK1-NEXT: call void @_ZN1SC1El(ptr nonnull align 8 dereferenceable(24) [[S]], i64 0) -// CHECK1-NEXT: [[CALL:%.*]] = invoke signext i8 @_ZN1ScvcEv(ptr nonnull align 8 dereferenceable(24) [[S]]) +// CHECK1-NEXT: [[CALL:%.*]] = invoke i8 @_ZN1ScvcEv(ptr nonnull align 8 dereferenceable(24) [[S]]) // CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]] // CHECK1: invoke.cont: // CHECK1-NEXT: store i8 [[CALL]], ptr [[A]], align 1 @@ -1369,7 +1369,7 @@ int main() { // CHECK1-NEXT: invoke void @_ZN1SC1El(ptr nonnull align 8 dereferenceable(24) [[REF_TMP]], i64 23) // CHECK1-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !llvm.access.group [[ACC_GRP48]] // CHECK1: invoke.cont: -// CHECK1-NEXT: [[CALL:%.*]] = invoke signext i8 @_ZN1ScvcEv(ptr nonnull align 8 dereferenceable(24) [[REF_TMP]]) +// CHECK1-NEXT: [[CALL:%.*]] = invoke i8 @_ZN1ScvcEv(ptr nonnull align 8 dereferenceable(24) [[REF_TMP]]) // CHECK1-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[TERMINATE_LPAD]], !llvm.access.group [[ACC_GRP48]] // CHECK1: invoke.cont2: // CHECK1-NEXT: [[TMP7:%.*]] = sext i8 [[CALL]] to i32 @@ -1522,7 +1522,7 @@ int main() { // CHECK3-NEXT: [[I7:%.*]] = alloca i32, align 4 // CHECK3-NEXT: store i32 0, ptr [[RETVAL]], align 4 // CHECK3-NEXT: call void @_ZN1SC1El(ptr nonnull align 8 dereferenceable(24) [[S]], i64 0) -// CHECK3-NEXT: [[CALL:%.*]] = invoke signext i8 @_ZN1ScvcEv(ptr nonnull align 8 dereferenceable(24) [[S]]) +// CHECK3-NEXT: [[CALL:%.*]] = invoke i8 @_ZN1ScvcEv(ptr nonnull align 8 dereferenceable(24) [[S]]) // CHECK3-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]] // CHECK3: invoke.cont: // CHECK3-NEXT: store i8 [[CALL]], ptr [[A]], align 1 @@ -1862,7 +1862,7 @@ int main() { // CHECK5-NEXT: [[KERNEL_ARGS5:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8 // CHECK5-NEXT: store i32 0, ptr [[RETVAL]], align 4 // CHECK5-NEXT: call void @_ZN1SC1El(ptr nonnull align 8 dereferenceable(24) [[S]], i64 0) -// CHECK5-NEXT: [[CALL:%.*]] = invoke signext i8 @_ZN1ScvcEv(ptr nonnull align 8 dereferenceable(24) [[S]]) +// CHECK5-NEXT: [[CALL:%.*]] = invoke i8 @_ZN1ScvcEv(ptr nonnull align 8 dereferenceable(24) [[S]]) // CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]] // CHECK5: invoke.cont: // CHECK5-NEXT: store i8 [[CALL]], ptr [[A]], align 1 @@ -3117,7 +3117,7 @@ int main() { // CHECK5-NEXT: invoke void @_ZN1SC1El(ptr nonnull align 8 dereferenceable(24) [[REF_TMP]], i64 23) // CHECK5-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[TERMINATE_LPAD:%.*]], !llvm.access.group [[ACC_GRP48]] // CHECK5: invoke.cont: -// CHECK5-NEXT: [[CALL:%.*]] = invoke signext i8 @_ZN1ScvcEv(ptr nonnull align 8 dereferenceable(24) [[REF_TMP]]) +// CHECK5-NEXT: [[CALL:%.*]] = invoke i8 @_ZN1ScvcEv(ptr nonnull align 8 dereferenceable(24) [[REF_TMP]]) // CHECK5-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[TERMINATE_LPAD]], !llvm.access.group [[ACC_GRP48]] // CHECK5: invoke.cont2: // CHECK5-NEXT: [[TMP7:%.*]] = sext i8 [[CALL]] to i32 diff --git a/llvm/lib/ABI/Targets/X86.cpp b/llvm/lib/ABI/Targets/X86.cpp index d57c5a0cf516f4..26f2d682ad5d31 100644 --- a/llvm/lib/ABI/Targets/X86.cpp +++ b/llvm/lib/ABI/Targets/X86.cpp @@ -75,6 +75,8 @@ class X86_64TargetInfo : public TargetInfo { unsigned &NeededInt, unsigned &NeededSse, bool IsNamedArg, bool IsRegCall = false) const; + bool shouldExtendReturnType(const IntegerType *RetTy) const; + public: X86_64TargetInfo(TypeBuilder &TypeBuilder, X86AVXABILevel AVXABILevel, bool Has64BitPtrs, const X86ABICompatInfo &Compat) @@ -138,6 +140,19 @@ static const Type *reduceUnionForX8664(const RecordType *UnionType, return StorageType; } +bool X86_64TargetInfo::shouldExtendReturnType(const IntegerType *RetTy) const { + // Bools need to be zero-extended to 8 bits for all ABIs. + if (RetTy->isBool()) + return true; + + // Promotable integer types get extended only for Darwin. + bool IsDarwin = false; // TODO: Currently not supported by ABI library. + if (!IsDarwin) + return false; + + return isPromotableInteger(RetTy); +} + void X86_64TargetInfo::postMerge(unsigned AggregateSize, Class &Lo, Class &Hi) const { // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done: @@ -743,10 +758,10 @@ ArgInfo X86_64TargetInfo::classifyReturnType(const Type *RetTy) const { // If we have a sign or zero extended integer, make sure to return Extend // so that the parameter gets the right LLVM IR attributes. if (Hi == NoClass && ResType->isInteger()) { - if (const IntegerType *IntTy = dyn_cast<IntegerType>(RetTy)) { + if (const IntegerType *IntTy = dyn_cast<IntegerType>(RetTy)) if (isPromotableInteger(IntTy)) - return ArgInfo::getExtend(RetTy); - } + return shouldExtendReturnType(IntTy) ? ArgInfo::getExtend(RetTy) + : ArgInfo::getDirect(RetTy); } if (ResType->isInteger() && ResType->getSizeInBits() == 128) { assert(Hi == Integer); @@ -1315,7 +1330,7 @@ ArgInfo X86_64TargetInfo::getIndirectReturnResult(const Type *Ty) const { if (const auto *IntTy = dyn_cast<IntegerType>(Ty)) { if (IntTy->isBitInt()) return getNaturalAlignIndirect(IntTy, getAllocaAddrSpace()); - if (isPromotableInteger(IntTy)) + if (shouldExtendReturnType(IntTy)) return ArgInfo::getExtend(Ty); } return ArgInfo::getDirect(); diff --git a/llvm/unittests/ABI/X86TargetInfoTest.cpp b/llvm/unittests/ABI/X86TargetInfoTest.cpp index 2d971f74c2ee3b..29dfb4ce1de362 100644 --- a/llvm/unittests/ABI/X86TargetInfoTest.cpp +++ b/llvm/unittests/ABI/X86TargetInfoTest.cpp @@ -39,6 +39,7 @@ class X86TargetInfoTest : public ::testing::Test { llvm::BumpPtrAllocator Alloc; TypeBuilder TB; const ABIType *I8; + const ABIType *I16; const ABIType *I32; const ABIType *I64; const ABIType *F32; @@ -56,6 +57,7 @@ class X86TargetInfoTest : public ::testing::Test { X86TargetInfoTest() : TB(Alloc), I8(TB.getIntegerType(8, llvm::Align(1), /*Signed=*/true)), + I16(TB.getIntegerType(16, llvm::Align(2), /*Signed=*/true)), I32(TB.getIntegerType(32, llvm::Align(4), /*Signed=*/true)), I64(TB.getIntegerType(64, llvm::Align(8), /*Signed=*/true)), F32(TB.getFloatType(llvm::APFloat::IEEEsingle(), llvm::Align(4))), @@ -112,6 +114,16 @@ class X86TargetInfoTest : public ::testing::Test { TI->computeInfo(*FI); return FI->getArgInfo(0).Info; } + + const ArgInfo &classifyRet(const ABIType *RetTy, + std::unique_ptr<FunctionInfo> &FI, + std::unique_ptr<TargetInfo> &TI, + X86AVXABILevel AVXLevel = X86AVXABILevel::None) { + TI = target(AVXLevel); + FI = FunctionInfo::create(llvm::CallingConv::C, RetTy, {}); + TI->computeInfo(*FI); + return FI->getReturnInfo(); + } }; static void expectDirectInteger(const ArgInfo &Info, unsigned Bits) { @@ -123,6 +135,13 @@ static void expectDirectInteger(const ArgInfo &Info, unsigned Bits) { EXPECT_EQ(IT->getSizeInBits().getFixedValue(), Bits); } +static void expectExtendInteger(const ArgInfo &Info, const ABIType *Ty, + bool IsSigned) { + EXPECT_TRUE(Info.isExtend()); + EXPECT_EQ(Info.isSignExt(), IsSigned); + EXPECT_EQ(Info.getCoerceToType(), Ty); +} + static void expectInteger(const ABIType *Ty, unsigned Bits) { const auto *IT = llvm::dyn_cast<llvm::abi::IntegerType>(Ty); ASSERT_NE(IT, nullptr); @@ -907,4 +926,34 @@ TEST_F(X86TargetInfoTest, BitIntVectorInMemoryIsNotNarrowed) { expectInteger(Pair[1].FieldType, 64); } +TEST_F(X86TargetInfoTest, IntReturnExtension) { + std::unique_ptr<FunctionInfo> FI; + std::unique_ptr<TargetInfo> TI; + + // bool must be zero-extended. + expectExtendInteger(classifyRet(Bool, FI, TI), Bool, /*IsSigned=*/false); + + // _BitInt(1) types must not be extended. + const ABIType *BitInt1 = + TB.getIntegerType(1, llvm::Align(1), /*IsSigned=*/false, + /*IsBitInt=*/true); + expectDirectInteger(classifyRet(BitInt1, FI, TI), 1); + const ABIType *BitInt13 = + TB.getIntegerType(13, llvm::Align(2), /*IsSigned=*/true, + /*IsBitInt=*/true); + expectDirectInteger(classifyRet(BitInt13, FI, TI), 13); + + // _BitInt > 32-bit gets passed as 64-bit, to match Clang ABI behavior. + // Returning this as i40 would be equivalent. + const ABIType *BitInt40 = + TB.getIntegerType(40, llvm::Align(8), /*IsSigned=*/false, + /*IsBitInt=*/true); + expectDirectInteger(classifyRet(BitInt40, FI, TI), 64); + + // char, short and int must not be extended. + expectDirectInteger(classifyRet(I8, FI, TI), 8); + expectDirectInteger(classifyRet(I16, FI, TI), 16); + expectDirectInteger(classifyRet(I32, FI, TI), 32); +} + } // namespace >From b8d4003adf1de4382f48061b841477c027a36169 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Thu, 22 Oct 2026 15:52:55 +0200 Subject: [PATCH 2/2] Update CIR tests --- clang/test/CIR/CodeGen/attr-noundef.cpp | 2 +- .../CodeGen/call-conv-lowering-x86_64-empty.cpp | 6 +++--- .../call-conv-lowering-x86_64-union-copy.c | 12 ++++++------ .../call-conv-lowering-x86_64-x87-union.cpp | 16 ++++++++-------- .../test/CIR/CodeGen/call-conv-lowering-x86_64.c | 8 ++++---- clang/test/CIR/CodeGen/var_arg.c | 2 +- .../Transforms/abi-lowering/indirect-call.cir | 2 +- .../Transforms/abi-lowering/x86_64-bitint.cir | 11 ++++++----- .../Transforms/abi-lowering/x86_64-scalars.cir | 10 +++++----- 9 files changed, 35 insertions(+), 34 deletions(-) diff --git a/clang/test/CIR/CodeGen/attr-noundef.cpp b/clang/test/CIR/CodeGen/attr-noundef.cpp index 3600d0105c19eb..e5a6eef27e5e9d 100644 --- a/clang/test/CIR/CodeGen/attr-noundef.cpp +++ b/clang/test/CIR/CodeGen/attr-noundef.cpp @@ -242,7 +242,7 @@ void pass_large_BitInt(_BitInt(127) e) { // CIR-LABEL: cir.func {{.*}} @_ZN12check_exotic11pass_BitIntEDB3_ // CIR-LABEL: cir.func {{.*}} @_ZN12check_exotic17pass_large_BitIntEDB127_(%arg0: !u64i {llvm.noundef} loc({{.+}}), %arg1: !u64i {llvm.noundef} loc( -// LLVM: define dso_local noundef signext i3 @_ZN12check_exotic10ret_BitIntEv() +// LLVM: define dso_local noundef i3 @_ZN12check_exotic10ret_BitIntEv() // LLVM: define dso_local void @_ZN12check_exotic11pass_BitIntEDB3_(i3 noundef signext % // LLVM: define dso_local void @_ZN12check_exotic17pass_large_BitIntEDB127_(i64 noundef %{{.+}}, i64 noundef % } // namespace check_exotic diff --git a/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-empty.cpp b/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-empty.cpp index e2716dea58655c..e8ed80181c81e4 100644 --- a/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-empty.cpp +++ b/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-empty.cpp @@ -479,7 +479,7 @@ int takeUNuaEmptyAlignedBits(UNuaEmptyAlignedBits v) { return v.b; } short takeUNuaEmptyNarrow(UNuaEmptyNarrow v) { return v.s; } // CIR: cir.func {{.*}}@_Z19takeUNuaEmptyNarrow15UNuaEmptyNarrow(%arg0: !s16i {{.*}}) -> (!s16i -// LLVM: define dso_local noundef signext i16 @_Z19takeUNuaEmptyNarrow15UNuaEmptyNarrow(i16 %{{[^,]+}}) +// LLVM: define dso_local noundef i16 @_Z19takeUNuaEmptyNarrow15UNuaEmptyNarrow(i16 %{{[^,]+}}) // A pair of floats in one eightbyte still coerces to a vector, not an integer. float takeUNuaEmptyFloats(UNuaEmptyFloats v) { return v.f.a; } @@ -491,14 +491,14 @@ float takeUNuaEmptyFloats(UNuaEmptyFloats v) { return v.f.a; } char takeUNuaEmptyBytes16(UNuaEmptyBytes16 v) { return v.c[0]; } // CIR: cir.func {{.*}}@_Z20takeUNuaEmptyBytes1616UNuaEmptyBytes16(%arg0: !u64i {{.*}}, %arg1: !u64i {{.*}}) -> (!s8i -// LLVM: define dso_local noundef signext i8 @_Z20takeUNuaEmptyBytes1616UNuaEmptyBytes16(i64 %{{[^,]+}}, i64 %{{[^,]+}}) +// LLVM: define dso_local noundef i8 @_Z20takeUNuaEmptyBytes1616UNuaEmptyBytes16(i64 %{{[^,]+}}, i64 %{{[^,]+}}) // Here the empty variant is what reaches the second eightbyte, which the // data variant covers only one byte of, so the high half narrows to i8. char takeUNuaEmptyNarrowHi(UNuaEmptyNarrowHi v) { return v.c[0]; } // CIR: cir.func {{.*}}@_Z21takeUNuaEmptyNarrowHi17UNuaEmptyNarrowHi(%arg0: !u64i {{.*}}, %arg1: !s8i {{.*}}) -> (!s8i -// LLVM: define dso_local noundef signext i8 @_Z21takeUNuaEmptyNarrowHi17UNuaEmptyNarrowHi(i64 %{{[^,]+}}, i8 %{{[^,]+}}) +// LLVM: define dso_local noundef i8 @_Z21takeUNuaEmptyNarrowHi17UNuaEmptyNarrowHi(i64 %{{[^,]+}}, i8 %{{[^,]+}}) // An all-empty union owns eightbyte 0, so as with takeHiWord the coercion has // to start at byte 8 rather than dropping the NoClass half. diff --git a/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-union-copy.c b/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-union-copy.c index 4375be0a3e1cd6..2e46f38a82ffa8 100644 --- a/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-union-copy.c +++ b/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-union-copy.c @@ -528,11 +528,11 @@ union M retM(const union M *p) { return *p; } char takeM(union M m) { return m.buf[31]; } -// CIR-LABEL: cir.func {{.*}} @takeM(%arg0: !cir.ptr<!rec_M> {llvm.align = 16 : i64, llvm.byval = !rec_M, llvm.noundef} loc({{[^)]+}})) -> (!s8i {llvm.signext}) +// CIR-LABEL: cir.func {{.*}} @takeM(%arg0: !cir.ptr<!rec_M> {llvm.align = 16 : i64, llvm.byval = !rec_M, llvm.noundef} loc({{[^)]+}})) -> !s8i // CIR: %[[M:.+]] = cir.alloca "m" align(16) init : !cir.ptr<!rec_M> // CIR: cir.copy %arg0 align(16) to %[[M]] align(16) : !cir.ptr<!rec_M> -// LLVM-LABEL: define dso_local signext i8 @takeM(ptr noundef byval(%union.M) align 16 %{{[^,)]+}}) +// LLVM-LABEL: define dso_local i8 @takeM(ptr noundef byval(%union.M) align 16 %{{[^,)]+}}) // NOMOVE-LABEL: define {{.*}}@takeM( // NOMOVE-NOT: {{(load|store)( volatile| atomic)* (x86_fp80|<[0-9]+ x x86_fp80>|<?\{ ?x86_fp80|%struct\.|%union\.)}} @@ -550,13 +550,13 @@ void storeM(union M *q, const union M *p) { *q = retM(p); } char passM(const union M *p) { return takeM(*p); } -// CIR-LABEL: cir.func {{.*}} @passM(%arg0: !cir.ptr<!rec_M> {llvm.noundef} loc({{[^)]+}})) -> (!s8i {llvm.signext}) +// CIR-LABEL: cir.func {{.*}} @passM(%arg0: !cir.ptr<!rec_M> {llvm.noundef} loc({{[^)]+}})) -> !s8i // CIR: %[[BYVAL:.+]] = cir.alloca "byval" align(16) : !cir.ptr<!rec_M> // CIR: cir.copy %{{[^ ]+}} align(16) to %[[BYVAL]] align(16) : !cir.ptr<!rec_M> -// CIR: cir.call @takeM(%[[BYVAL]]) : (!cir.ptr<!rec_M> {llvm.align = 16 : i64, llvm.byval = !rec_M, llvm.noundef}) -> (!s8i {llvm.signext}) +// CIR: cir.call @takeM(%[[BYVAL]]) : (!cir.ptr<!rec_M> {llvm.align = 16 : i64, llvm.byval = !rec_M, llvm.noundef}) -> !s8i -// LLVM-LABEL: define dso_local signext i8 @passM(ptr noundef %{{[^,)]+}}) -// LLVM: call signext i8 @takeM(ptr noundef byval(%union.M) align 16 %{{[^,)]+}}) +// LLVM-LABEL: define dso_local i8 @passM(ptr noundef %{{[^,)]+}}) +// LLVM: call i8 @takeM(ptr noundef byval(%union.M) align 16 %{{[^,)]+}}) // NOMOVE-LABEL: define {{.*}}@passM( // NOMOVE-NOT: {{(load|store)( volatile| atomic)* (x86_fp80|<[0-9]+ x x86_fp80>|<?\{ ?x86_fp80|%struct\.|%union\.)}} diff --git a/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-x87-union.cpp b/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-x87-union.cpp index 304bc29d53d92b..f3673a25da2325 100644 --- a/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-x87-union.cpp +++ b/clang/test/CIR/CodeGen/call-conv-lowering-x86_64-x87-union.cpp @@ -50,10 +50,10 @@ Arg ret_arg(const Arg *p) { return *p; } unsigned char take_arg(Arg a) { return a.type; } -// CIR-LABEL: cir.func {{.*}} @_Z8take_arg3Arg(%arg0: !cir.ptr<!rec_Arg> {llvm.align = 16 : i64, llvm.byval = !rec_Arg, llvm.noundef} loc({{[^)]+}})) -> (!u8i {llvm.noundef, llvm.zeroext}) +// CIR-LABEL: cir.func {{.*}} @_Z8take_arg3Arg(%arg0: !cir.ptr<!rec_Arg> {llvm.align = 16 : i64, llvm.byval = !rec_Arg, llvm.noundef} loc({{[^)]+}})) -> (!u8i {llvm.noundef}) // CIR: cir.copy %arg0 align(16) to %{{[^ ]+}} align(16) : !cir.ptr<!rec_Arg> -// LLVM-LABEL: define dso_local noundef zeroext i8 @_Z8take_arg3Arg(ptr noundef byval(%struct.Arg) align 16 %{{[^,)]+}}) +// LLVM-LABEL: define dso_local noundef i8 @_Z8take_arg3Arg(ptr noundef byval(%struct.Arg) align 16 %{{[^,)]+}}) // LLVMCIR: call void @llvm.memcpy.p0.p0.i64(ptr align 16 %{{[^,)]+}}, ptr align 16 %{{[^,)]+}}, i64 32, i1 false) // OGCG-NOT: call void @llvm.memcpy @@ -63,11 +63,11 @@ unsigned char take_arg(Arg a) { return a.type; } unsigned char call_take_arg(const Arg *p) { return take_arg(*p); } // CIR-LABEL: cir.func {{.*}} @_Z13call_take_argPK3Arg( -// CIR: cir.call @_Z8take_arg3Arg(%{{[^,)]+}}) : (!cir.ptr<!rec_Arg> {llvm.align = 16 : i64, llvm.byval = !rec_Arg, llvm.noundef}) -> (!u8i {llvm.noundef, llvm.zeroext}) +// CIR: cir.call @_Z8take_arg3Arg(%{{[^,)]+}}) : (!cir.ptr<!rec_Arg> {llvm.align = 16 : i64, llvm.byval = !rec_Arg, llvm.noundef}) -> (!u8i {llvm.noundef}) -// LLVM-LABEL: define dso_local noundef zeroext i8 @_Z13call_take_argPK3Arg(ptr noundef %{{[^,)]+}}) +// LLVM-LABEL: define dso_local noundef i8 @_Z13call_take_argPK3Arg(ptr noundef %{{[^,)]+}}) // LLVM: call void @llvm.memcpy.p0.p0.i64(ptr align 16 %[[TMP:[^,)]+]], ptr align 16 %{{[^,)]+}}, i64 32, i1 false) -// LLVM: call noundef zeroext i8 @_Z8take_arg3Arg(ptr noundef byval(%struct.Arg) align 16 %[[TMP]]) +// LLVM: call noundef i8 @_Z8take_arg3Arg(ptr noundef byval(%struct.Arg) align 16 %[[TMP]]) // NOMOVE-LABEL: define {{.*}}@_Z13call_take_argPK3Arg( // NOMOVE-NOT: {{(load|store)( volatile| atomic)* (x86_fp80|<[0-9]+ x x86_fp80>|<?\{ ?x86_fp80|%struct\.|%union\.)}} @@ -77,11 +77,11 @@ unsigned char call_arg_ptr(unsigned char (*f)(Arg), const Arg *p) { } // CIR-LABEL: cir.func {{.*}} @_Z12call_arg_ptrPFh3ArgEPKS_( -// CIR: cir.call %{{[^(]+}}(%{{[^,)]+}}) : (!cir.ptr<!cir.func<(!cir.ptr<!rec_Arg>) -> !u8i>>, !cir.ptr<!rec_Arg> {llvm.align = 16 : i64, llvm.byval = !rec_Arg, llvm.noundef}) -> (!u8i {llvm.noundef, llvm.zeroext}) +// CIR: cir.call %{{[^(]+}}(%{{[^,)]+}}) : (!cir.ptr<!cir.func<(!cir.ptr<!rec_Arg>) -> !u8i>>, !cir.ptr<!rec_Arg> {llvm.align = 16 : i64, llvm.byval = !rec_Arg, llvm.noundef}) -> (!u8i {llvm.noundef}) -// LLVM-LABEL: define dso_local noundef zeroext i8 @_Z12call_arg_ptrPFh3ArgEPKS_(ptr noundef %{{[^,)]+}}, ptr noundef %{{[^,)]+}}) +// LLVM-LABEL: define dso_local noundef i8 @_Z12call_arg_ptrPFh3ArgEPKS_(ptr noundef %{{[^,)]+}}, ptr noundef %{{[^,)]+}}) // LLVM: call void @llvm.memcpy.p0.p0.i64(ptr align 16 %[[PTMP:[^,)]+]], ptr align 16 %{{[^,)]+}}, i64 32, i1 false) -// LLVM: call noundef zeroext i8 %{{[^(]+}}(ptr noundef byval(%struct.Arg) align 16 %[[PTMP]]) +// LLVM: call noundef i8 %{{[^(]+}}(ptr noundef byval(%struct.Arg) align 16 %[[PTMP]]) // NOMOVE-LABEL: define {{.*}}@_Z12call_arg_ptrPFh3ArgEPKS_( // NOMOVE-NOT: {{(load|store)( volatile| atomic)* (x86_fp80|<[0-9]+ x x86_fp80>|<?\{ ?x86_fp80|%struct\.|%union\.)}} diff --git a/clang/test/CIR/CodeGen/call-conv-lowering-x86_64.c b/clang/test/CIR/CodeGen/call-conv-lowering-x86_64.c index 02a91e06030a38..511c677147a4b0 100644 --- a/clang/test/CIR/CodeGen/call-conv-lowering-x86_64.c +++ b/clang/test/CIR/CodeGen/call-conv-lowering-x86_64.c @@ -29,14 +29,14 @@ typedef union { char c[32]; } __attribute__((aligned(32))) UBigOverAligned; // Narrow signed integer sign-extended in a register. signed char ext_schar(signed char c) { return c; } -// CIR: cir.func {{.*}}@ext_schar(%arg0: !s8i {{.*}}llvm.signext{{.*}}) -> (!s8i {{.*}}llvm.signext -// LLVM: define dso_local signext i8 @ext_schar(i8 noundef signext %{{.+}}) +// CIR: cir.func {{.*}}@ext_schar(%arg0: !s8i {{.*}}llvm.signext{{.*}}) -> !s8i +// LLVM: define dso_local i8 @ext_schar(i8 noundef signext %{{.+}}) // Narrow unsigned integer zero-extended in a register. unsigned char ext_uchar(unsigned char c) { return c; } -// CIR: cir.func {{.*}}@ext_uchar(%arg0: !u8i {{.*}}llvm.zeroext{{.*}}) -> (!u8i {{.*}}llvm.zeroext -// LLVM: define dso_local zeroext i8 @ext_uchar(i8 noundef zeroext %{{.+}}) +// CIR: cir.func {{.*}}@ext_uchar(%arg0: !u8i {{.*}}llvm.zeroext{{.*}}) -> !u8i +// LLVM: define dso_local i8 @ext_uchar(i8 noundef zeroext %{{.+}}) // Floating-point scalar passed/returned in an SSE register. double sse_double(double d) { return d; } diff --git a/clang/test/CIR/CodeGen/var_arg.c b/clang/test/CIR/CodeGen/var_arg.c index a54cf025b9158b..1721c2d758c5c6 100644 --- a/clang/test/CIR/CodeGen/var_arg.c +++ b/clang/test/CIR/CodeGen/var_arg.c @@ -321,7 +321,7 @@ short varargs_short(int count, ...) { // CIR: %[[RESULT_P:.+]] = cir.cast bitcast %[[ADDR]] : !cir.ptr<!u8i> -> !cir.ptr<!s16i> // CIR: cir.load align(2) %[[RESULT_P]] : !cir.ptr<!s16i>, !s16i -// LLVM-LABEL: define dso_local signext i16 @varargs_short(i32 noundef %{{.*}}, ...) +// LLVM-LABEL: define dso_local i16 @varargs_short(i32 noundef %{{.*}}, ...) // LLVM: %[[GP_OFFSET_P:.+]] = getelementptr inbounds nuw %struct.__va_list_tag, ptr %{{.+}}, i32 0, i32 0 // LLVMCIR: %[[GP_OFFSET:.+]] = load i32, ptr %[[GP_OFFSET_P]], align 4 // OGCG: %[[GP_OFFSET:.+]] = load i32, ptr %[[GP_OFFSET_P]], align 16 diff --git a/clang/test/CIR/Transforms/abi-lowering/indirect-call.cir b/clang/test/CIR/Transforms/abi-lowering/indirect-call.cir index 21e8e18a534acf..debac21e0eab2c 100644 --- a/clang/test/CIR/Transforms/abi-lowering/indirect-call.cir +++ b/clang/test/CIR/Transforms/abi-lowering/indirect-call.cir @@ -38,7 +38,7 @@ module attributes { // CHECK: cir.func{{.*}} @call_ext // CHECK-NOT: cir.cast bitcast - // CHECK: cir.call %{{.+}}(%{{.+}}) : (!cir.ptr<!cir.func<(!s16i) -> !s16i>>, !s16i {llvm.signext}) -> (!s16i {llvm.signext}) + // CHECK: cir.call %{{.+}}(%{{.+}}) : (!cir.ptr<!cir.func<(!s16i) -> !s16i>>, !s16i {llvm.signext}) -> !s16i // Indirect call whose small-struct argument and return are Direct with a // coerce type: the callee pointer is bitcast so its pointee tracks both the diff --git a/clang/test/CIR/Transforms/abi-lowering/x86_64-bitint.cir b/clang/test/CIR/Transforms/abi-lowering/x86_64-bitint.cir index 95cd6005962d4f..a37021076d63e0 100644 --- a/clang/test/CIR/Transforms/abi-lowering/x86_64-bitint.cir +++ b/clang/test/CIR/Transforms/abi-lowering/x86_64-bitint.cir @@ -36,17 +36,18 @@ module attributes { #dlti.dl_entry<i128, dense<128>: vector<2xi64>>> } { - // A sub-register width is Extend: signext, and no coercion in the body. + // A sub-register width is Extend: signext for arguments, and no coercion in + // the body. cir.func @ret_b17(%arg0: !b17i) -> !b17i { cir.return %arg0 : !b17i } // CHECK-LABEL: cir.func{{.*}} @ret_b17( // CHECK-SAME: %arg0: !cir.int<s, 17, bitint> {llvm.signext}) - // CHECK-SAME: -> (!cir.int<s, 17, bitint> {llvm.signext}) + // CHECK-SAME: -> !cir.int<s, 17, bitint> // CHECK-NEXT: cir.return %arg0 : !cir.int<s, 17, bitint> - // LLVM-LABEL: define signext i17 @ret_b17( + // LLVM-LABEL: define i17 @ret_b17( // LLVM-SAME: i17 signext %[[ARG:[0-9]+]]) // LLVM-NEXT: ret i17 %[[ARG]] @@ -57,10 +58,10 @@ module attributes { // CHECK-LABEL: cir.func{{.*}} @ret_ub17( // CHECK-SAME: %arg0: !cir.int<u, 17, bitint> {llvm.zeroext}) - // CHECK-SAME: -> (!cir.int<u, 17, bitint> {llvm.zeroext}) + // CHECK-SAME: -> !cir.int<u, 17, bitint> // CHECK-NEXT: cir.return %arg0 : !cir.int<u, 17, bitint> - // LLVM-LABEL: define zeroext i17 @ret_ub17( + // LLVM-LABEL: define i17 @ret_ub17( // LLVM-SAME: i17 zeroext %[[ARG:[0-9]+]]) // LLVM-NEXT: ret i17 %[[ARG]] diff --git a/clang/test/CIR/Transforms/abi-lowering/x86_64-scalars.cir b/clang/test/CIR/Transforms/abi-lowering/x86_64-scalars.cir index 04f11abc7b5d53..515507ef6aa7f2 100644 --- a/clang/test/CIR/Transforms/abi-lowering/x86_64-scalars.cir +++ b/clang/test/CIR/Transforms/abi-lowering/x86_64-scalars.cir @@ -71,20 +71,20 @@ module attributes { // CHECK: cir.call @take_s8(%arg0) : (!s8i {llvm.signext}) -> () - // A sub-register integer return is also extended, not just arguments. + // A sub-register integer return is not extended. cir.func @ret_s8() -> !s8i { %0 = cir.const #cir.int<0> : !s8i cir.return %0 : !s8i } - // CHECK: cir.func{{.*}} @ret_s8() -> (!s8i {llvm.signext}) + // CHECK: cir.func{{.*}} @ret_s8() -> !s8i cir.func @ret_u16() -> !u16i { %0 = cir.const #cir.int<0> : !u16i cir.return %0 : !u16i } - // CHECK: cir.func{{.*}} @ret_u16() -> (!u16i {llvm.zeroext}) + // CHECK: cir.func{{.*}} @ret_u16() -> !u16i // A signed __int128 is Direct, so the signature is unchanged. cir.func @ret_i128(%arg0: !s128i) -> !s128i { @@ -113,7 +113,7 @@ module attributes { // LLVM: define void @take_s8(i8 signext %{{.+}}) // LLVM: define void @take_u16(i16 zeroext %{{.+}}) // LLVM: define void @take_bool(i1 zeroext %{{.+}}) -// LLVM: define signext i8 @ret_s8() -// LLVM: define zeroext i16 @ret_u16() +// LLVM: define i8 @ret_s8() +// LLVM: define i16 @ret_u16() // LLVM: define i128 @ret_i128(i128 %{{.+}}) // LLVM: define i128 @ret_u128(i128 %{{.+}}) _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
