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

Reply via email to