https://github.com/nikic updated https://github.com/llvm/llvm-project/pull/171456
>From 0fa9770eee2ab28471bf12361b1a528360f025dc Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Tue, 9 Dec 2025 12:04:38 +0100 Subject: [PATCH 01/26] [IR] Disable implicit truncation in ConstantInt::get() by default --- llvm/include/llvm/IR/Constants.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/llvm/include/llvm/IR/Constants.h b/llvm/include/llvm/IR/Constants.h index 39a556abe935b..6aa79846f10f5 100644 --- a/llvm/include/llvm/IR/Constants.h +++ b/llvm/include/llvm/IR/Constants.h @@ -113,9 +113,8 @@ class ConstantInt final : public ConstantData { /// If Ty is a vector type, return a Constant with a splat of the given /// value. Otherwise return a ConstantInt for the given value. /// \param ImplicitTrunc Whether to allow implicit truncation of the value. - // TODO: Make ImplicitTrunc default to false. LLVM_ABI static Constant *get(Type *Ty, uint64_t V, bool IsSigned = false, - bool ImplicitTrunc = true); + bool ImplicitTrunc = false); /// Return a ConstantInt with the specified integer value for the specified /// type. If the type is wider than 64 bits, the value will be zero-extended @@ -123,10 +122,9 @@ class ConstantInt final : public ConstantData { /// be interpreted as a 64-bit signed integer and sign-extended to fit /// the type. /// \param ImplicitTrunc Whether to allow implicit truncation of the value. - // TODO: Make ImplicitTrunc default to false. LLVM_ABI static ConstantInt *get(IntegerType *Ty, uint64_t V, bool IsSigned = false, - bool ImplicitTrunc = true); + bool ImplicitTrunc = false); /// Return a ConstantInt with the specified value for the specified type. The /// value V will be canonicalized to an unsigned APInt. Accessing it with >From f1d774b65cfaeb2d4b636f4d1df2a6a7a3628151 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Tue, 9 Dec 2025 12:18:21 +0100 Subject: [PATCH 02/26] [SDAG] Allow implicit trunc in BUILD_VECTOR legalization --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 1630dd783e821..fc3e9ff0d6238 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -2051,7 +2051,8 @@ SDValue SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) { // we don't want a v16i8 to become a v16i32 for example. const ConstantInt *CI = V->getConstantIntValue(); CV.push_back(ConstantInt::get(EltVT.getTypeForEVT(*DAG.getContext()), - CI->getZExtValue())); + CI->getZExtValue(), /*IsSigned=*/false, + /*ImplicitTrunc=*/true)); } } else { assert(Node->getOperand(i).isUndef()); >From b94c8cb630eb5da3d1107d41a08806aab3318dce Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Tue, 9 Dec 2025 12:22:32 +0100 Subject: [PATCH 03/26] [SCEV] Allow implicit truncation for now, to reduce scope --- llvm/lib/Analysis/ScalarEvolution.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index e1f90264be7a2..770de89eccfb9 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -485,7 +485,10 @@ const SCEV *ScalarEvolution::getConstant(const APInt &Val) { const SCEV * ScalarEvolution::getConstant(Type *Ty, uint64_t V, bool isSigned) { IntegerType *ITy = cast<IntegerType>(getEffectiveSCEVType(Ty)); - return getConstant(ConstantInt::get(ITy, V, isSigned)); + // TODO: Avoid implicit trunc? + // See https://github.com/llvm/llvm-project/issues/112510. + return getConstant( + ConstantInt::get(ITy, V, isSigned, /*ImplicitTrunc=*/true)); } const SCEV *ScalarEvolution::getVScale(Type *Ty) { >From 3d2d98ed9a95930a755f250d4d8247796173c644 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Tue, 9 Dec 2025 12:43:29 +0100 Subject: [PATCH 04/26] [MachineIRBuilder] Allow implicit trunc for now To limit scope. --- llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp index 3906b311addf0..f4779d9a122f0 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -363,7 +363,10 @@ MachineInstrBuilder MachineIRBuilder::buildConstant(const DstOp &Res, int64_t Val) { auto IntN = IntegerType::get(getMF().getFunction().getContext(), Res.getLLTTy(*getMRI()).getScalarSizeInBits()); - ConstantInt *CI = ConstantInt::get(IntN, Val, true); + // TODO: Avoid implicit trunc? + // See https://github.com/llvm/llvm-project/issues/112510. + ConstantInt *CI = + ConstantInt::get(IntN, Val, /*isSigned=*/true, /*implicitTrunc=*/true); return buildConstant(Res, *CI); } >From 51a80781eda0d6ac0b8a7b644747795f590beff5 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Tue, 9 Dec 2025 14:51:18 +0100 Subject: [PATCH 05/26] [FastISel] Allow implicit trunc in FastISel for now To reduce scope. --- llvm/lib/CodeGen/SelectionDAG/FastISel.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp index 51391f1aeecde..03727b77b3e1a 100644 --- a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -1943,7 +1943,10 @@ Register FastISel::fastEmit_ri_(MVT VT, unsigned Opcode, Register Op0, // fast-isel, which would be very slow. IntegerType *ITy = IntegerType::get(FuncInfo.Fn->getContext(), VT.getSizeInBits()); - MaterialReg = getRegForValue(ConstantInt::get(ITy, Imm)); + // TODO: Avoid implicit trunc? + // See https://github.com/llvm/llvm-project/issues/112510. + MaterialReg = getRegForValue( + ConstantInt::get(ITy, Imm, /*IsSigned=*/false, /*ImplicitTrunc=*/true)); if (!MaterialReg) return Register(); } >From e04b7fd77c3af113ad2d8a1d2146cc7a1f5d7a32 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Tue, 9 Dec 2025 15:11:05 +0100 Subject: [PATCH 06/26] [SLSR] Allow implicit truncation for element size For now, we should implicitly truncate overflowing allocation sizes when expanding GEPs, like we do in other places. --- llvm/lib/Transforms/Scalar/StraightLineStrengthReduce.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Scalar/StraightLineStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/StraightLineStrengthReduce.cpp index 2ad6f7e2e27cd..9591cd983df15 100644 --- a/llvm/lib/Transforms/Scalar/StraightLineStrengthReduce.cpp +++ b/llvm/lib/Transforms/Scalar/StraightLineStrengthReduce.cpp @@ -1104,7 +1104,9 @@ void StraightLineStrengthReduce::allocateCandidatesAndFindBasisForGEP( Value *ArrayIdx = GEP->getOperand(I); uint64_t ElementSize = GTI.getSequentialElementStride(*DL); IntegerType *PtrIdxTy = cast<IntegerType>(DL->getIndexType(GEP->getType())); - ConstantInt *ElementSizeIdx = ConstantInt::get(PtrIdxTy, ElementSize, true); + // If the element size overflow the type, truncate. + ConstantInt *ElementSizeIdx = + ConstantInt::get(PtrIdxTy, ElementSize, true, /*ImplicitTrunc=*/true); if (ArrayIdx->getType()->getIntegerBitWidth() <= DL->getIndexSizeInBits(GEP->getAddressSpace())) { // Skip factoring if ArrayIdx is wider than the index size, because >From 438b1ba421efc842e184ef69a1e7e4b3988006cd Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 12:19:31 +0100 Subject: [PATCH 07/26] [MemorySanitizer] Allow implicit truncation for now --- llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index 32ee16c89b4fe..9909037ba8ec5 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -1791,7 +1791,10 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { constToIntPtr(VectTy->getElementType(), C)); } assert(IntPtrTy == MS.IntptrTy); - return ConstantInt::get(MS.IntptrTy, C); + // TODO: Avoid implicit trunc? + // See https://github.com/llvm/llvm-project/issues/112510. + return ConstantInt::get(MS.IntptrTy, C, /*IsSigned=*/false, + /*ImplicitTrunc=*/true); } /// Returns the integer shadow offset that corresponds to a given >From f53166e3a5205ec9d7943f97572f87f27b3782d3 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 12:21:37 +0100 Subject: [PATCH 08/26] [SPIRV] Allow implicit truncation for now --- llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp index 5d96a67500dff..7325dee73d8f2 100644 --- a/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp @@ -436,7 +436,10 @@ Register SPIRVGlobalRegistry::buildConstantInt(uint64_t Val, assert(SpvType); auto &MF = MIRBuilder.getMF(); const IntegerType *Ty = cast<IntegerType>(getTypeForSPIRVType(SpvType)); - auto *const CI = ConstantInt::get(const_cast<IntegerType *>(Ty), Val); + // TODO: Avoid implicit trunc? + // See https://github.com/llvm/llvm-project/issues/112510. + auto *const CI = ConstantInt::get(const_cast<IntegerType *>(Ty), Val, + /*IsSigned=*/false, /*ImplicitTrunc=*/true); Register Res = find(CI, &MF); if (Res.isValid()) return Res; >From 35b82e8141831932e433a225453bc5e075aeb660 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 12:22:59 +0100 Subject: [PATCH 09/26] [LSR] Allow implicit truncation for now --- llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp index e12caa2136962..7f28ea6f5c875 100644 --- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -331,7 +331,10 @@ class Immediate : public details::FixedOrScalableQuantity<Immediate, int64_t> { } const SCEV *getUnknownSCEV(ScalarEvolution &SE, Type *Ty) const { - const SCEV *SU = SE.getUnknown(ConstantInt::getSigned(Ty, Quantity)); + // TODO: Avoid implicit trunc? + // See https://github.com/llvm/llvm-project/issues/112510. + const SCEV *SU = SE.getUnknown(ConstantInt::get( + Ty, Quantity, /*IsSigned=*/true, /*ImplicitTrunc=*/true)); if (Scalable) SU = SE.getMulExpr(SU, SE.getVScale(SU->getType())); return SU; >From ffd9918012d0768d9efd9a6773c90b15cbfe53ea Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 12:31:55 +0100 Subject: [PATCH 10/26] [CGP] Allow implicit truncation for now --- llvm/lib/CodeGen/CodeGenPrepare.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index 587c1372b19cb..7ec6113aaeafc 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -6881,7 +6881,10 @@ bool CodeGenPrepare::splitLargeGEPOffsets() { } IRBuilder<> NewBaseBuilder(NewBaseInsertBB, NewBaseInsertPt); // Create a new base. - Value *BaseIndex = ConstantInt::get(PtrIdxTy, BaseOffset); + // TODO: Avoid implicit trunc? + // See https://github.com/llvm/llvm-project/issues/112510. + Value *BaseIndex = ConstantInt::get( + PtrIdxTy, BaseOffset, /*IsSigned=*/true, /*ImplicitTrunc=*/true); NewBaseGEP = OldBase; if (NewBaseGEP->getType() != I8PtrTy) NewBaseGEP = NewBaseBuilder.CreatePointerCast(NewBaseGEP, I8PtrTy); >From be5506921370d44afe25bd74012c2ce6cd694aa9 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 12:41:31 +0100 Subject: [PATCH 11/26] [CGBuilder] Use getSigned() for CharUnits --- clang/lib/CodeGen/CGBuilder.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/CGBuilder.h b/clang/lib/CodeGen/CGBuilder.h index 090f75d3b5d3c..a8d71b6f393b4 100644 --- a/clang/lib/CodeGen/CGBuilder.h +++ b/clang/lib/CodeGen/CGBuilder.h @@ -101,7 +101,7 @@ class CGBuilderTy : public CGBuilderBaseTy { : CGBuilderBaseTy(BB), TypeCache(TypeCache) {} llvm::ConstantInt *getSize(CharUnits N) { - return llvm::ConstantInt::get(TypeCache.SizeTy, N.getQuantity()); + return llvm::ConstantInt::getSigned(TypeCache.SizeTy, N.getQuantity()); } llvm::ConstantInt *getSize(uint64_t N) { return llvm::ConstantInt::get(TypeCache.SizeTy, N); >From ebdf884f239bbbfedbd5f2653339753e8c97a033 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 12:58:20 +0100 Subject: [PATCH 12/26] [CGOpenMP] Use getSigned() for NumTeams constant This value may be -1. --- clang/lib/CodeGen/CGOpenMPRuntime.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 43ec1572aaf90..39cf3052011e1 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -6477,7 +6477,7 @@ llvm::Value *CGOpenMPRuntime::emitNumTeamsForTargetDirective( } assert(MinNT == MaxNT && "Num threads ranges require handling here."); - return llvm::ConstantInt::get(CGF.Int32Ty, MinNT); + return llvm::ConstantInt::getSigned(CGF.Int32Ty, MinNT); } /// Check for a num threads constant value (stored in \p DefaultVal), or >From 0f2fe6b2c929963f4fc87fd2277e6adaa40551c8 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 13:01:35 +0100 Subject: [PATCH 13/26] [CodeGen] Use getSigned() for negative value --- clang/lib/CodeGen/ABIInfoImpl.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/ABIInfoImpl.cpp b/clang/lib/CodeGen/ABIInfoImpl.cpp index 1e3ac2e31870f..8ad77ee515d49 100644 --- a/clang/lib/CodeGen/ABIInfoImpl.cpp +++ b/clang/lib/CodeGen/ABIInfoImpl.cpp @@ -153,7 +153,8 @@ llvm::Value *CodeGen::emitRoundPointerUpToAlignment(CodeGenFunction &CGF, CGF.Builder.getInt8Ty(), Ptr, Align.getQuantity() - 1); return CGF.Builder.CreateIntrinsic( llvm::Intrinsic::ptrmask, {Ptr->getType(), CGF.IntPtrTy}, - {RoundUp, llvm::ConstantInt::get(CGF.IntPtrTy, -Align.getQuantity())}, + {RoundUp, + llvm::ConstantInt::getSigned(CGF.IntPtrTy, -Align.getQuantity())}, nullptr, Ptr->getName() + ".aligned"); } >From 88a3f0c4e56dccafa5f72a6db934bc6a18544221 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 13:02:52 +0100 Subject: [PATCH 14/26] [ItaniumCXXABI] Use getSigned() for negative constant --- clang/lib/CodeGen/ItaniumCXXABI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index c5db314575810..7b88d35fa09e0 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -1627,7 +1627,7 @@ llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF, // Load the type info. Value = CGF.Builder.CreateCall( CGM.getIntrinsic(llvm::Intrinsic::load_relative, {CGM.Int32Ty}), - {Value, llvm::ConstantInt::get(CGM.Int32Ty, -4)}); + {Value, llvm::ConstantInt::getSigned(CGM.Int32Ty, -4)}); } else { // Load the type info. Value = >From 0e4736e39d84f97518a65121ab96d4a6656f6af8 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 13:04:34 +0100 Subject: [PATCH 15/26] [ItaniumCXXABI] Use getSigned() for signed offset --- clang/lib/CodeGen/ItaniumCXXABI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index 7b88d35fa09e0..10cdf4e479ccf 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -4556,7 +4556,7 @@ void ItaniumRTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) { if (Base.getAccessSpecifier() == AS_public) OffsetFlags |= BCTI_Public; - Fields.push_back(llvm::ConstantInt::get(OffsetFlagsLTy, OffsetFlags)); + Fields.push_back(llvm::ConstantInt::getSigned(OffsetFlagsLTy, OffsetFlags)); } } >From d2741c34ae361bfd6342a58a11e7e776d2291a78 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 13:08:16 +0100 Subject: [PATCH 16/26] [CGVtables] Use getSigned() for signed offset --- clang/lib/CodeGen/CGVTables.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/CGVTables.cpp b/clang/lib/CodeGen/CGVTables.cpp index 040290cb345ef..f0d7e7003f2d9 100644 --- a/clang/lib/CodeGen/CGVTables.cpp +++ b/clang/lib/CodeGen/CGVTables.cpp @@ -732,14 +732,14 @@ static void AddPointerLayoutOffset(const CodeGenModule &CGM, ConstantArrayBuilder &builder, CharUnits offset) { builder.add(llvm::ConstantExpr::getIntToPtr( - llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity()), + llvm::ConstantInt::getSigned(CGM.PtrDiffTy, offset.getQuantity()), CGM.GlobalsInt8PtrTy)); } static void AddRelativeLayoutOffset(const CodeGenModule &CGM, ConstantArrayBuilder &builder, CharUnits offset) { - builder.add(llvm::ConstantInt::get(CGM.Int32Ty, offset.getQuantity())); + builder.add(llvm::ConstantInt::getSigned(CGM.Int32Ty, offset.getQuantity())); } void CodeGenVTables::addVTableComponent(ConstantArrayBuilder &builder, >From a8f57bd6420fa619d44b22099c4174e8dfeca99e Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 13:12:10 +0100 Subject: [PATCH 17/26] [PatternInit] Explicitly allow implicit truncation (NFC) It's okay if the pattern value gets truncated here, it's a splat. --- clang/lib/CodeGen/PatternInit.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/PatternInit.cpp b/clang/lib/CodeGen/PatternInit.cpp index 4400bc4436882..b5716e72d678d 100644 --- a/clang/lib/CodeGen/PatternInit.cpp +++ b/clang/lib/CodeGen/PatternInit.cpp @@ -37,7 +37,8 @@ llvm::Constant *clang::CodeGen::initializationPatternFor(CodeGenModule &CGM, unsigned BitWidth = cast<llvm::IntegerType>(Ty->getScalarType())->getBitWidth(); if (BitWidth <= 64) - return llvm::ConstantInt::get(Ty, IntValue); + return llvm::ConstantInt::get(Ty, IntValue, /*IsSigned=*/false, + /*ImplicitTrunc=*/true); return llvm::ConstantInt::get( Ty, llvm::APInt::getSplat(BitWidth, llvm::APInt(64, IntValue))); } @@ -48,7 +49,8 @@ llvm::Constant *clang::CodeGen::initializationPatternFor(CodeGenModule &CGM, if (PtrWidth > 64) llvm_unreachable("pattern initialization of unsupported pointer width"); llvm::Type *IntTy = llvm::IntegerType::get(CGM.getLLVMContext(), PtrWidth); - auto *Int = llvm::ConstantInt::get(IntTy, IntValue); + auto *Int = llvm::ConstantInt::get(IntTy, IntValue, /*IsSigned=*/false, + /*ImplicitTrunc=*/true); return llvm::ConstantExpr::getIntToPtr(Int, PtrTy); } if (Ty->isFPOrFPVectorTy()) { >From 82ee96c73fcf1dd9d6a4091586862cc3f92fe3d9 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 14:30:16 +0100 Subject: [PATCH 18/26] ms abi UNRELATED --- clang/lib/CodeGen/MicrosoftCXXABI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index 484890062efa8..7c0f40f861b2d 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -2641,7 +2641,7 @@ struct ResetGuardBit final : EHScopeStack::Cleanup { CGBuilderTy &Builder = CGF.Builder; llvm::LoadInst *LI = Builder.CreateLoad(Guard); llvm::ConstantInt *Mask = - llvm::ConstantInt::get(CGF.IntTy, ~(1ULL << GuardNum)); + llvm::ConstantInt::getSigned(CGF.IntTy, ~(1ULL << GuardNum)); Builder.CreateStore(Builder.CreateAnd(LI, Mask), Guard); } }; >From 6917ffda207f7bcb97d0c870d7329903f01079d0 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 14:32:05 +0100 Subject: [PATCH 19/26] [CGExpr] Use getSigned() for negative constant --- clang/lib/CodeGen/CGExpr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index e511c66835dd0..3f2789871cffc 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -6588,7 +6588,7 @@ RValue CodeGenFunction::EmitCall(QualType CalleeType, if (CGM.getTriple().isARM() || CGM.getTriple().isThumb()) { llvm::Value *CalleeAddress = Builder.CreatePtrToInt(CalleePtr, IntPtrTy); - llvm::Value *Mask = llvm::ConstantInt::get(IntPtrTy, ~1); + llvm::Value *Mask = llvm::ConstantInt::getSigned(IntPtrTy, ~1); llvm::Value *AlignedCalleeAddress = Builder.CreateAnd(CalleeAddress, Mask); AlignedCalleePtr = >From 679b8cbc98d8c27d65ae1bd5f1e08a52f50bf9cc Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 14:40:36 +0100 Subject: [PATCH 20/26] [CGObjCGNU] Set isSigned for negative value --- clang/lib/CodeGen/CGObjCGNU.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/clang/lib/CodeGen/CGObjCGNU.cpp b/clang/lib/CodeGen/CGObjCGNU.cpp index 06643d4bdc211..457e64429e370 100644 --- a/clang/lib/CodeGen/CGObjCGNU.cpp +++ b/clang/lib/CodeGen/CGObjCGNU.cpp @@ -1826,10 +1826,12 @@ class CGObjCGNUstep2 : public CGObjCGNUstep { // Instance size is negative for classes that have not yet had their ivar // layout calculated. classFields.addInt( - LongTy, 0 - (Context.getASTObjCInterfaceLayout(OID->getClassInterface()) - .getSize() - .getQuantity() - - superInstanceSize)); + LongTy, + 0 - (Context.getASTObjCInterfaceLayout(OID->getClassInterface()) + .getSize() + .getQuantity() - + superInstanceSize), + /*isSigned=*/true); if (classDecl->all_declared_ivar_begin() == nullptr) classFields.addNullPointer(PtrTy); >From 681a20584bb9ca99861a88a4436156b22ac0a0c2 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 14:44:25 +0100 Subject: [PATCH 21/26] [CGObjCGNU] Use getSigned() for instanceSize For non-fragile this is a negative value. --- clang/lib/CodeGen/CGObjCGNU.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/CGObjCGNU.cpp b/clang/lib/CodeGen/CGObjCGNU.cpp index 457e64429e370..a81c4217495c0 100644 --- a/clang/lib/CodeGen/CGObjCGNU.cpp +++ b/clang/lib/CodeGen/CGObjCGNU.cpp @@ -3885,7 +3885,7 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) { // Generate the class structure llvm::Constant *ClassStruct = GenerateClassStructure( MetaClassStruct, SuperClass, 0x11L, ClassName.c_str(), nullptr, - llvm::ConstantInt::get(LongTy, instanceSize), IvarList, MethodList, + llvm::ConstantInt::getSigned(LongTy, instanceSize), IvarList, MethodList, GenerateProtocolList(Protocols), IvarOffsetArray, Properties, StrongIvarBitmap, WeakIvarBitmap); CGM.setGVProperties(cast<llvm::GlobalValue>(ClassStruct), >From 6c32f22eb5cdc9d4a1facb9f6bf9224677aeae6f Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 14:46:24 +0100 Subject: [PATCH 22/26] [AArch64] Use getSigned() for negative value --- clang/lib/CodeGen/Targets/AArch64.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/Targets/AArch64.cpp b/clang/lib/CodeGen/Targets/AArch64.cpp index 77b947e81f5fc..963b74927036a 100644 --- a/clang/lib/CodeGen/Targets/AArch64.cpp +++ b/clang/lib/CodeGen/Targets/AArch64.cpp @@ -971,7 +971,7 @@ RValue AArch64ABIInfo::EmitAAPCSVAArg(Address VAListAddr, QualType Ty, reg_offs, llvm::ConstantInt::get(CGF.Int32Ty, Align - 1), "align_regoffs"); reg_offs = CGF.Builder.CreateAnd( - reg_offs, llvm::ConstantInt::get(CGF.Int32Ty, -Align), + reg_offs, llvm::ConstantInt::getSigned(CGF.Int32Ty, -Align), "aligned_regoffs"); } >From ea1d60a93256b546b53bff07d2a4523774c9bf6b Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 14:47:45 +0100 Subject: [PATCH 23/26] [CGHLSLRuntime] Use getSigned() for total array size This may be -1 for incompete array types. --- clang/lib/CodeGen/CGHLSLRuntime.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index f485fdd49e43f..2e9602d1b3793 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -1279,8 +1279,8 @@ std::optional<LValue> CGHLSLRuntime::emitResourceArraySubscriptExpr( AggValueSlot::DoesNotOverlap); // Calculate total array size (= range size). - llvm::Value *Range = - llvm::ConstantInt::get(CGM.IntTy, getTotalArraySize(AST, ResArrayTy)); + llvm::Value *Range = llvm::ConstantInt::getSigned( + CGM.IntTy, getTotalArraySize(AST, ResArrayTy)); // If the result of the subscript operation is a single resource, call the // constructor. >From 14643dd85efad8be696e3efa7c3919a4cc48b23d Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 14:51:01 +0100 Subject: [PATCH 24/26] [ARM] Use getSigned() for signed value --- clang/lib/CodeGen/TargetBuiltins/ARM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/TargetBuiltins/ARM.cpp b/clang/lib/CodeGen/TargetBuiltins/ARM.cpp index 7a8ea7ce0b563..05dff01a71b9a 100644 --- a/clang/lib/CodeGen/TargetBuiltins/ARM.cpp +++ b/clang/lib/CodeGen/TargetBuiltins/ARM.cpp @@ -489,7 +489,7 @@ llvm::Value *CodeGenFunction::EmitFP8NeonFMLACall( Value *CodeGenFunction::EmitNeonShiftVector(Value *V, llvm::Type *Ty, bool neg) { int SV = cast<ConstantInt>(V)->getSExtValue(); - return ConstantInt::get(Ty, neg ? -SV : SV); + return ConstantInt::getSigned(Ty, neg ? -SV : SV); } Value *CodeGenFunction::EmitFP8NeonCvtCall(unsigned IID, llvm::Type *Ty0, >From 9e2cacea71e412b42104b9698007d8eb1f8404d1 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Mon, 15 Dec 2025 14:52:19 +0100 Subject: [PATCH 25/26] [CGExprScalar] Use getSigned() for signed value --- clang/lib/CodeGen/CGExprScalar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 9b6497fca829a..96274cf7f8220 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -3435,7 +3435,7 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV, CharUnits size = CGF.getContext().getTypeSizeInChars(OPT->getObjectType()); if (!isInc) size = -size; llvm::Value *sizeValue = - llvm::ConstantInt::get(CGF.SizeTy, size.getQuantity()); + llvm::ConstantInt::getSigned(CGF.SizeTy, size.getQuantity()); if (CGF.getLangOpts().PointerOverflowDefined) value = Builder.CreateGEP(CGF.Int8Ty, value, sizeValue, "incdec.objptr"); >From 89747f0cb571373195e4420eaf57419e2807f4d8 Mon Sep 17 00:00:00 2001 From: Nikita Popov <[email protected]> Date: Tue, 16 Dec 2025 11:55:48 +0100 Subject: [PATCH 26/26] [CGExprScalar] Allow implicit truncation for CharacterLiteral The value is always stored as an unsigned number, even if the char type is signed, so we have to allow truncation here. --- clang/lib/CodeGen/CGExprScalar.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 96274cf7f8220..b4daaef95bb8d 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -510,7 +510,10 @@ class ScalarExprEmitter return llvm::ConstantFP::get(VMContext, E->getValue()); } Value *VisitCharacterLiteral(const CharacterLiteral *E) { - return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue()); + // Character literals are always stored in an unsigned (even for signed + // char), so allow implicit truncation here. + return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue(), + /*IsSigned=*/false, /*ImplicitTrunc=*/true); } Value *VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *E) { return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue()); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
