llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-backend-powerpc Author: Nikita Popov (nikic) <details> <summary>Changes</summary> Use the DataLayout-aware TargetFolder instead of ConstantFolder in Clang's CGBuilder. The primary impact of this change is that GEP constant expressions are now emitted in canonical `getelementptr i8` form. This is in preparation for the migration to ptradd, which requires this form. Part of the test updates were performed by Claude Code and reviewed by me. --- Patch is 736.37 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/184819.diff 129 Files Affected: - (modified) clang/lib/CodeGen/CGBuilder.h (+16-10) - (modified) clang/lib/CodeGen/CGException.cpp (+2-2) - (modified) clang/lib/CodeGen/CGObjCMac.cpp (+1-1) - (modified) clang/lib/CodeGen/CodeGenFunction.cpp (+6-7) - (modified) clang/test/CodeGen/2005-01-02-ConstantInits.c (+1-1) - (modified) clang/test/CodeGen/AArch64/varargs.c (+72-72) - (modified) clang/test/CodeGen/PowerPC/ppc-emmintrin.c (+2-2) - (modified) clang/test/CodeGen/PowerPC/ppc-xmmintrin.c (+2-2) - (modified) clang/test/CodeGen/PowerPC/ppc32-dwarf.c (+113-113) - (modified) clang/test/CodeGen/PowerPC/ppc64-dwarf.c (+116-116) - (modified) clang/test/CodeGen/RISCV/builtin-cpu-is.c (+6-6) - (modified) clang/test/CodeGen/Sparc/sparcv9-dwarf.c (+87-87) - (modified) clang/test/CodeGen/SystemZ/align-systemz-02.c (+2-2) - (modified) clang/test/CodeGen/X86/avx10_2bf16-builtins.c (+1-1) - (modified) clang/test/CodeGen/X86/va-arg-sse.c (+6-6) - (modified) clang/test/CodeGen/aix-builtin-cpu-is.c (+1-1) - (modified) clang/test/CodeGen/aix-builtin-cpu-supports.c (+16-16) - (modified) clang/test/CodeGen/attr-cpuspecific.c (+4-4) - (modified) clang/test/CodeGen/attr-target-clones-riscv.c (+15-15) - (modified) clang/test/CodeGen/attr-target-clones.c (+8-8) - (modified) clang/test/CodeGen/attr-target-version-riscv.c (+17-17) - (modified) clang/test/CodeGen/builtin-cpu-is.c (+4-4) - (modified) clang/test/CodeGen/builtin-cpu-supports.c (+13-13) - (modified) clang/test/CodeGen/catch-nullptr-and-nonzero-offset-in-offsetof-idiom.c (+1-1) - (modified) clang/test/CodeGen/catch-nullptr-and-nonzero-offset.c (+8-12) - (modified) clang/test/CodeGen/clear_cache.c (+2-2) - (modified) clang/test/CodeGen/complex-strictfp.c (+11-11) - (modified) clang/test/CodeGen/complex.c (+62-59) - (modified) clang/test/CodeGen/mips-inline-asm-modifiers.c (+2-2) - (modified) clang/test/CodeGen/multi-aix-builtin-cpu-supports.c (+1-1) - (modified) clang/test/CodeGen/object-size.c (+3-3) - (modified) clang/test/CodeGen/packed-nest-unpacked.c (+12-12) - (modified) clang/test/CodeGen/ptrauth-function-init.c (+2-2) - (modified) clang/test/CodeGen/ptrauth-restricted-intptr-qualifier.c (+6-6) - (modified) clang/test/CodeGen/unaligned-expr.c (+6-6) - (modified) clang/test/CodeGen/volatile-1.c (+14-14) - (modified) clang/test/CodeGen/volatile-2.c (+3-3) - (modified) clang/test/CodeGen/volatile-complex.c (+12-12) - (modified) clang/test/CodeGenCUDA/address-spaces.cu (+1-1) - (modified) clang/test/CodeGenCUDA/managed-var.cu (+9-11) - (modified) clang/test/CodeGenCXX/2011-12-19-init-list-ctor.cpp (+5-5) - (modified) clang/test/CodeGenCXX/apple-kext-indirect-call-2.cpp (+4-4) - (modified) clang/test/CodeGenCXX/apple-kext-indirect-call.cpp (+2-2) - (modified) clang/test/CodeGenCXX/apple-kext-indirect-virtual-dtor-call.cpp (+3-3) - (modified) clang/test/CodeGenCXX/attr-target-clones-riscv.cpp (+15-15) - (modified) clang/test/CodeGenCXX/attr-target-version-riscv.cpp (+17-17) - (modified) clang/test/CodeGenCXX/blocks-cxx11.cpp (+1-1) - (modified) clang/test/CodeGenCXX/builtin-invoke.cpp (+1-1) - (modified) clang/test/CodeGenCXX/catch-nullptr-and-nonzero-offset-in-offsetof-idiom.cpp (+8-8) - (modified) clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist-pr12086.cpp (+22-22) - (modified) clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp (+15-15) - (modified) clang/test/CodeGenCXX/cxx11-initializer-aggregate.cpp (+1-1) - (modified) clang/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp (+9-9) - (modified) clang/test/CodeGenCXX/cxx1z-decomposition.cpp (+3-3) - (modified) clang/test/CodeGenCXX/cxx1z-initializer-aggregate.cpp (+3-3) - (modified) clang/test/CodeGenCXX/cxx2a-consteval.cpp (+1-1) - (modified) clang/test/CodeGenCXX/finegrain-bitfield-access.cpp (+9-9) - (modified) clang/test/CodeGenCXX/for-range.cpp (+5-5) - (modified) clang/test/CodeGenCXX/forward-declare-as-array-elem.cpp (+3-3) - (modified) clang/test/CodeGenCXX/global-array-destruction.cpp (+3-3) - (modified) clang/test/CodeGenCXX/inheriting-constructor.cpp (+2-2) - (modified) clang/test/CodeGenCXX/labeled-break-continue.cpp (+2-2) - (modified) clang/test/CodeGenCXX/ms-inline-asm-fields.cpp (+1-1) - (modified) clang/test/CodeGenCXX/no-odr-use.cpp (+2-2) - (modified) clang/test/CodeGenCXX/ptrauth-apple-kext-indirect-call-2.cpp (+8-8) - (modified) clang/test/CodeGenCXX/ptrauth-apple-kext-indirect-call.cpp (+2-2) - (modified) clang/test/CodeGenCXX/ptrauth-apple-kext-indirect-virtual-dtor-call.cpp (+5-5) - (modified) clang/test/CodeGenCXX/temporaries.cpp (+4-4) - (modified) clang/test/CodeGenCXX/ubsan-nullability-arg.cpp (+1-2) - (modified) clang/test/CodeGenCXX/volatile-1.cpp (+19-19) - (modified) clang/test/CodeGenCXX/vtt-address-space.cpp (+6-6) - (modified) clang/test/CodeGenHIP/amdgpu-barrier-type.hip (+2-2) - (modified) clang/test/CodeGenHLSL/ArrayAssignable.hlsl (+8-8) - (modified) clang/test/CodeGenHLSL/resources/cbuffer_geps.hlsl (+18-18) - (modified) clang/test/CodeGenObjC/super-message-fragileabi.m (+1-1) - (modified) clang/test/DebugInfo/KeyInstructions/complex.c (+8-8) - (modified) clang/test/Modules/templates.mm (+2-2) - (modified) clang/test/OpenMP/atomic_capture_codegen.cpp (+21-21) - (modified) clang/test/OpenMP/atomic_read_codegen.c (+6-6) - (modified) clang/test/OpenMP/atomic_update_codegen.cpp (+16-16) - (modified) clang/test/OpenMP/atomic_write_codegen.c (+17-17) - (modified) clang/test/OpenMP/for_firstprivate_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/for_linear_codegen.cpp (+1-1) - (modified) clang/test/OpenMP/for_private_codegen.cpp (+1-1) - (modified) clang/test/OpenMP/for_reduction_codegen.cpp (+106-109) - (modified) clang/test/OpenMP/parallel_copyin_codegen.cpp (+22-22) - (modified) clang/test/OpenMP/parallel_for_linear_codegen.cpp (+1-1) - (modified) clang/test/OpenMP/parallel_master_taskloop_firstprivate_codegen.cpp (+2-2) - (modified) clang/test/OpenMP/parallel_master_taskloop_lastprivate_codegen.cpp (+1-1) - (modified) clang/test/OpenMP/parallel_master_taskloop_simd_firstprivate_codegen.cpp (+2-2) - (modified) clang/test/OpenMP/parallel_master_taskloop_simd_lastprivate_codegen.cpp (+2-2) - (modified) clang/test/OpenMP/parallel_private_codegen.cpp (+1-1) - (modified) clang/test/OpenMP/parallel_reduction_codegen.cpp (+1-1) - (modified) clang/test/OpenMP/scope_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/sections_firstprivate_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/sections_private_codegen.cpp (+1-1) - (modified) clang/test/OpenMP/sections_reduction_codegen.cpp (+1-1) - (modified) clang/test/OpenMP/single_codegen.cpp (+12-12) - (modified) clang/test/OpenMP/single_firstprivate_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/single_private_codegen.cpp (+1-1) - (modified) clang/test/OpenMP/target_data_codegen.cpp (+3-3) - (modified) clang/test/OpenMP/target_enter_data_codegen.cpp (+3-3) - (modified) clang/test/OpenMP/target_enter_data_depend_codegen.cpp (+3-3) - (modified) clang/test/OpenMP/target_exit_data_codegen.cpp (+2-2) - (modified) clang/test/OpenMP/target_exit_data_depend_codegen.cpp (+2-2) - (modified) clang/test/OpenMP/target_has_device_addr_codegen.cpp (+4-4) - (modified) clang/test/OpenMP/target_map_codegen_21.cpp (+3-3) - (modified) clang/test/OpenMP/target_teams_distribute_firstprivate_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/target_teams_distribute_parallel_for_firstprivate_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/target_teams_distribute_parallel_for_private_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/target_teams_distribute_parallel_for_simd_firstprivate_codegen.cpp (+18-18) - (modified) clang/test/OpenMP/target_teams_distribute_parallel_for_simd_private_codegen.cpp (+18-18) - (modified) clang/test/OpenMP/target_teams_distribute_private_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/target_teams_distribute_simd_firstprivate_codegen.cpp (+18-18) - (modified) clang/test/OpenMP/target_teams_distribute_simd_private_codegen.cpp (+18-18) - (modified) clang/test/OpenMP/target_teams_generic_loop_private_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/target_update_codegen.cpp (+2-2) - (modified) clang/test/OpenMP/target_update_depend_codegen.cpp (+2-2) - (modified) clang/test/OpenMP/teams_distribute_firstprivate_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/teams_distribute_parallel_for_firstprivate_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/teams_distribute_parallel_for_private_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/teams_distribute_parallel_for_simd_firstprivate_codegen.cpp (+18-18) - (modified) clang/test/OpenMP/teams_distribute_parallel_for_simd_private_codegen.cpp (+18-18) - (modified) clang/test/OpenMP/teams_distribute_private_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/teams_distribute_simd_firstprivate_codegen.cpp (+18-18) - (modified) clang/test/OpenMP/teams_distribute_simd_private_codegen.cpp (+18-18) - (modified) clang/test/OpenMP/teams_generic_loop_private_codegen.cpp (+9-9) - (modified) clang/test/OpenMP/threadprivate_codegen.cpp (+200-200) - (modified) clang/test/SemaHLSL/Resources/static_resources.hlsl (+5-5) ``````````diff diff --git a/clang/lib/CodeGen/CGBuilder.h b/clang/lib/CodeGen/CGBuilder.h index a8d71b6f393b4..6d2a01ae33bd7 100644 --- a/clang/lib/CodeGen/CGBuilder.h +++ b/clang/lib/CodeGen/CGBuilder.h @@ -11,7 +11,9 @@ #include "Address.h" #include "CGValue.h" +#include "CodeGenModule.h" #include "CodeGenTypeCache.h" +#include "llvm/Analysis/TargetFolder.h" #include "llvm/Analysis/Utils/Local.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/GEPNoWrapFlags.h" @@ -44,7 +46,7 @@ class CGBuilderInserter final : public llvm::IRBuilderDefaultInserter { typedef CGBuilderInserter CGBuilderInserterTy; -typedef llvm::IRBuilder<llvm::ConstantFolder, CGBuilderInserterTy> +typedef llvm::IRBuilder<llvm::TargetFolder, CGBuilderInserterTy> CGBuilderBaseTy; class CGBuilderTy : public CGBuilderBaseTy { @@ -89,16 +91,20 @@ class CGBuilderTy : public CGBuilderBaseTy { } public: - CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::LLVMContext &C) - : CGBuilderBaseTy(C), TypeCache(TypeCache) {} - CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::LLVMContext &C, - const llvm::ConstantFolder &F, + CGBuilderTy(const CodeGenModule &CGM, llvm::LLVMContext &C) + : CGBuilderBaseTy(C, llvm::TargetFolder(CGM.getDataLayout())), + TypeCache(CGM) {} + CGBuilderTy(const CodeGenModule &CGM, llvm::LLVMContext &C, const CGBuilderInserterTy &Inserter) - : CGBuilderBaseTy(C, F, Inserter), TypeCache(TypeCache) {} - CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::Instruction *I) - : CGBuilderBaseTy(I), TypeCache(TypeCache) {} - CGBuilderTy(const CodeGenTypeCache &TypeCache, llvm::BasicBlock *BB) - : CGBuilderBaseTy(BB), TypeCache(TypeCache) {} + : CGBuilderBaseTy(C, llvm::TargetFolder(CGM.getDataLayout()), Inserter), + TypeCache(CGM) {} + CGBuilderTy(const CodeGenModule &CGM, llvm::Instruction *I) + : CGBuilderBaseTy(I->getParent(), I->getIterator(), + llvm::TargetFolder(CGM.getDataLayout())), + TypeCache(CGM) {} + CGBuilderTy(const CodeGenModule &CGM, llvm::BasicBlock *BB) + : CGBuilderBaseTy(BB, llvm::TargetFolder(CGM.getDataLayout())), + TypeCache(CGM) {} llvm::ConstantInt *getSize(CharUnits N) { return llvm::ConstantInt::getSigned(TypeCache.SizeTy, N.getQuantity()); diff --git a/clang/lib/CodeGen/CGException.cpp b/clang/lib/CodeGen/CGException.cpp index 2f1df6e9a8a5c..98bc6ea34b0bc 100644 --- a/clang/lib/CodeGen/CGException.cpp +++ b/clang/lib/CodeGen/CGException.cpp @@ -737,7 +737,7 @@ CodeGenFunction::getFuncletEHDispatchBlock(EHScopeStack::stable_iterator SI) { DispatchBlock = getTerminateFunclet(); else DispatchBlock = createBasicBlock(); - CGBuilderTy Builder(*this, DispatchBlock); + CGBuilderTy Builder(CGM, DispatchBlock); switch (EHS.getKind()) { case EHScope::Catch: @@ -1835,7 +1835,7 @@ Address CodeGenFunction::recoverAddrOfEscapedLocal(CodeGenFunction &ParentCGF, Address ParentVar, llvm::Value *ParentFP) { llvm::CallInst *RecoverCall = nullptr; - CGBuilderTy Builder(*this, AllocaInsertPt); + CGBuilderTy Builder(CGM, AllocaInsertPt); if (auto *ParentAlloca = dyn_cast_or_null<llvm::AllocaInst>(ParentVar.getBasePointer())) { // Mark the variable escaped if nobody else referenced it and compute the diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index e6c244547cefd..735a79b33f157 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -4353,7 +4353,7 @@ void FragileHazards::emitHazardsInNewBlocks() { if (Locals.empty()) return; - CGBuilderTy Builder(CGF, CGF.getLLVMContext()); + CGBuilderTy Builder(CGF.CGM, CGF.getLLVMContext()); // Iterate through all blocks, skipping those prior to the try. for (llvm::BasicBlock &BB : *CGF.CurFn) { diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 788599bc8746f..870840783c0c8 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -76,8 +76,7 @@ static bool shouldEmitLifetimeMarkers(const CodeGenOptions &CGOpts, CodeGenFunction::CodeGenFunction(CodeGenModule &cgm, bool suppressNewContext) : CodeGenTypeCache(cgm), CGM(cgm), Target(cgm.getTarget()), - Builder(cgm, cgm.getModule().getContext(), llvm::ConstantFolder(), - CGBuilderInserterTy(this)), + Builder(cgm, cgm.getModule().getContext(), CGBuilderInserterTy(this)), SanOpts(CGM.getLangOpts().Sanitize), CurFPFeatures(CGM.getLangOpts()), DebugInfo(CGM.getModuleDebugInfo()), PGO(std::make_unique<CodeGenPGO>(cgm)), @@ -464,7 +463,7 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) { EscapeArgs[Pair.second] = Pair.first; llvm::Function *FrameEscapeFn = llvm::Intrinsic::getOrInsertDeclaration( &CGM.getModule(), llvm::Intrinsic::localescape); - CGBuilderTy(*this, AllocaInsertPt).CreateCall(FrameEscapeFn, EscapeArgs); + CGBuilderTy(CGM, AllocaInsertPt).CreateCall(FrameEscapeFn, EscapeArgs); } // Remove the AllocaInsertPt instruction, which is just a convenience for us. @@ -2373,7 +2372,7 @@ llvm::BasicBlock *CodeGenFunction::GetIndirectGotoBlock() { // If we already made the indirect branch for indirect goto, return its block. if (IndirectBranch) return IndirectBranch->getParent(); - CGBuilderTy TmpBuilder(*this, createBasicBlock("indirectgoto")); + CGBuilderTy TmpBuilder(CGM, createBasicBlock("indirectgoto")); // Create the PHI node that indirect gotos will add entries to. llvm::Value *DestVal = TmpBuilder.CreatePHI(Int8PtrTy, 0, @@ -3147,7 +3146,7 @@ void CodeGenFunction::EmitRISCVMultiVersionResolver( llvm::Value *FeatsCondition = EmitRISCVCpuSupports(CurrTargetAttrFeats); llvm::BasicBlock *RetBlock = createBasicBlock("resolver_return", Resolver); - CGBuilderTy RetBuilder(*this, RetBlock); + CGBuilderTy RetBuilder(CGM, RetBlock); CreateMultiVersionResolverReturn(CGM, Resolver, RetBuilder, Options[Index].Function, SupportsIFunc); llvm::BasicBlock *ElseBlock = createBasicBlock("resolver_else", Resolver); @@ -3208,7 +3207,7 @@ void CodeGenFunction::EmitAArch64MultiVersionResolver( continue; llvm::BasicBlock *RetBlock = createBasicBlock("resolver_return", Resolver); - CGBuilderTy RetBuilder(*this, RetBlock); + CGBuilderTy RetBuilder(CGM, RetBlock); CreateMultiVersionResolverReturn(CGM, Resolver, RetBuilder, RO.Function, SupportsIFunc); CurBlock = createBasicBlock("resolver_else", Resolver); @@ -3248,7 +3247,7 @@ void CodeGenFunction::EmitX86MultiVersionResolver( } llvm::BasicBlock *RetBlock = createBasicBlock("resolver_return", Resolver); - CGBuilderTy RetBuilder(*this, RetBlock); + CGBuilderTy RetBuilder(CGM, RetBlock); CreateMultiVersionResolverReturn(CGM, Resolver, RetBuilder, RO.Function, SupportsIFunc); CurBlock = createBasicBlock("resolver_else", Resolver); diff --git a/clang/test/CodeGen/2005-01-02-ConstantInits.c b/clang/test/CodeGen/2005-01-02-ConstantInits.c index d90c2ea42da61..12a51cdf72d05 100644 --- a/clang/test/CodeGen/2005-01-02-ConstantInits.c +++ b/clang/test/CodeGen/2005-01-02-ConstantInits.c @@ -34,7 +34,7 @@ int Arr[100]; // CHECK-NEXT: entry: // CHECK-NEXT: [[I_ADDR:%.*]] = alloca i32, align 4 // CHECK-NEXT: store i32 [[I]], ptr [[I_ADDR]], align 4 -// CHECK-NEXT: [[CALL:%.*]] = call i32 (ptr, ...) @bar(ptr noundef getelementptr inbounds ([100 x i32], ptr @Arr, i64 0, i64 49)) +// CHECK-NEXT: [[CALL:%.*]] = call i32 (ptr, ...) @bar(ptr noundef getelementptr inbounds nuw (i8, ptr @Arr, i64 196)) // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I_ADDR]], align 4 // CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP0]] to i64 // CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [100 x i32], ptr @Arr, i64 0, i64 [[IDXPROM]] diff --git a/clang/test/CodeGen/AArch64/varargs.c b/clang/test/CodeGen/AArch64/varargs.c index 86fba012f7025..10d445c13ef96 100644 --- a/clang/test/CodeGen/AArch64/varargs.c +++ b/clang/test/CodeGen/AArch64/varargs.c @@ -11,18 +11,18 @@ va_list the_list; int simple_int(void) { // CHECK-LABEL: define{{.*}} i32 @simple_int return va_arg(the_list, int); -// CHECK: [[GR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 3) +// CHECK: [[GR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 24) // CHECK: [[EARLY_ONSTACK:%[a-z_0-9]+]] = icmp sge i32 [[GR_OFFS]], 0 // CHECK: br i1 [[EARLY_ONSTACK]], label %[[VAARG_ON_STACK:[a-z_.0-9]+]], label %[[VAARG_MAYBE_REG:[a-z_.0-9]+]] // CHECK: [[VAARG_MAYBE_REG]] // CHECK: [[NEW_REG_OFFS:%[a-z_0-9]+]] = add i32 [[GR_OFFS]], 8 -// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 3) +// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 24) // CHECK: [[INREG:%[a-z_0-9]+]] = icmp sle i32 [[NEW_REG_OFFS]], 0 // CHECK: br i1 [[INREG]], label %[[VAARG_IN_REG:[a-z_.0-9]+]], label %[[VAARG_ON_STACK]] // CHECK: [[VAARG_IN_REG]] -// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 1) +// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 8) // CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[REG_TOP]], i32 [[GR_OFFS]] // CHECK-BE: [[REG_ADDR_ALIGNED:%[0-9]+]] = getelementptr inbounds i8, ptr [[REG_ADDR]], i64 4 // CHECK: br label %[[VAARG_END:[a-z._0-9]+]] @@ -44,7 +44,7 @@ int simple_int(void) { __int128 aligned_int(void) { // CHECK-LABEL: define{{.*}} i128 @aligned_int return va_arg(the_list, __int128); -// CHECK: [[GR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 3) +// CHECK: [[GR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 24) // CHECK: [[EARLY_ONSTACK:%[a-z_0-9]+]] = icmp sge i32 [[GR_OFFS]], 0 // CHECK: br i1 [[EARLY_ONSTACK]], label %[[VAARG_ON_STACK:[a-z_.0-9]+]], label %[[VAARG_MAYBE_REG:[a-z_.0-9]+]] @@ -52,12 +52,12 @@ __int128 aligned_int(void) { // CHECK: [[ALIGN_REGOFFS:%[a-z_0-9]+]] = add i32 [[GR_OFFS]], 15 // CHECK: [[ALIGNED_REGOFFS:%[a-z_0-9]+]] = and i32 [[ALIGN_REGOFFS]], -16 // CHECK: [[NEW_REG_OFFS:%[a-z_0-9]+]] = add i32 [[ALIGNED_REGOFFS]], 16 -// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 3) +// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 24) // CHECK: [[INREG:%[a-z_0-9]+]] = icmp sle i32 [[NEW_REG_OFFS]], 0 // CHECK: br i1 [[INREG]], label %[[VAARG_IN_REG:[a-z_.0-9]+]], label %[[VAARG_ON_STACK]] // CHECK: [[VAARG_IN_REG]] -// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 1) +// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 8) // CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[REG_TOP]], i32 [[ALIGNED_REGOFFS]] // CHECK: br label %[[VAARG_END:[a-z._0-9]+]] @@ -82,19 +82,19 @@ struct bigstruct { struct bigstruct simple_indirect(void) { // CHECK-LABEL: define{{.*}} void @simple_indirect return va_arg(the_list, struct bigstruct); -// CHECK: [[GR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 3) +// CHECK: [[GR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 24) // CHECK: [[EARLY_ONSTACK:%[a-z_0-9]+]] = icmp sge i32 [[GR_OFFS]], 0 // CHECK: br i1 [[EARLY_ONSTACK]], label %[[VAARG_ON_STACK:[a-z_.0-9]+]], label %[[VAARG_MAYBE_REG:[a-z_.0-9]+]] // CHECK: [[VAARG_MAYBE_REG]] // CHECK-NOT: and i32 // CHECK: [[NEW_REG_OFFS:%[a-z_0-9]+]] = add i32 [[GR_OFFS]], 8 -// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 3) +// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 24) // CHECK: [[INREG:%[a-z_0-9]+]] = icmp sle i32 [[NEW_REG_OFFS]], 0 // CHECK: br i1 [[INREG]], label %[[VAARG_IN_REG:[a-z_.0-9]+]], label %[[VAARG_ON_STACK]] // CHECK: [[VAARG_IN_REG]] -// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 1) +// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 8) // CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[REG_TOP]], i32 [[GR_OFFS]] // CHECK: br label %[[VAARG_END:[a-z._0-9]+]] @@ -118,18 +118,18 @@ struct aligned_bigstruct { struct aligned_bigstruct simple_aligned_indirect(void) { // CHECK-LABEL: define{{.*}} void @simple_aligned_indirect return va_arg(the_list, struct aligned_bigstruct); -// CHECK: [[GR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 3) +// CHECK: [[GR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 24) // CHECK: [[EARLY_ONSTACK:%[a-z_0-9]+]] = icmp sge i32 [[GR_OFFS]], 0 // CHECK: br i1 [[EARLY_ONSTACK]], label %[[VAARG_ON_STACK:[a-z_.0-9]+]], label %[[VAARG_MAYBE_REG:[a-z_.0-9]+]] // CHECK: [[VAARG_MAYBE_REG]] // CHECK: [[NEW_REG_OFFS:%[a-z_0-9]+]] = add i32 [[GR_OFFS]], 8 -// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 3) +// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 24) // CHECK: [[INREG:%[a-z_0-9]+]] = icmp sle i32 [[NEW_REG_OFFS]], 0 // CHECK: br i1 [[INREG]], label %[[VAARG_IN_REG:[a-z_.0-9]+]], label %[[VAARG_ON_STACK]] // CHECK: [[VAARG_IN_REG]] -// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 1) +// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 8) // CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[REG_TOP]], i32 [[GR_OFFS]] // CHECK: br label %[[VAARG_END:[a-z._0-9]+]] @@ -147,18 +147,18 @@ struct aligned_bigstruct simple_aligned_indirect(void) { double simple_double(void) { // CHECK-LABEL: define{{.*}} double @simple_double return va_arg(the_list, double); -// CHECK: [[VR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 4) +// CHECK: [[VR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 28) // CHECK: [[EARLY_ONSTACK:%[a-z_0-9]+]] = icmp sge i32 [[VR_OFFS]], 0 // CHECK: br i1 [[EARLY_ONSTACK]], label %[[VAARG_ON_STACK:[a-z_.0-9]+]], label %[[VAARG_MAYBE_REG]] // CHECK: [[VAARG_MAYBE_REG]] // CHECK: [[NEW_REG_OFFS:%[a-z_0-9]+]] = add i32 [[VR_OFFS]], 16 -// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 4) +// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 28) // CHECK: [[INREG:%[a-z_0-9]+]] = icmp sle i32 [[NEW_REG_OFFS]], 0 // CHECK: br i1 [[INREG]], label %[[VAARG_IN_REG:[a-z_.0-9]+]], label %[[VAARG_ON_STACK]] // CHECK: [[VAARG_IN_REG]] -// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 2) +// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 16) // CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[REG_TOP]], i32 [[VR_OFFS]] // CHECK-BE: [[REG_ADDR_ALIGNED:%[a-z_0-9]*]] = getelementptr inbounds i8, ptr [[REG_ADDR]], i64 8 // CHECK: br label %[[VAARG_END:[a-z._0-9]+]] @@ -183,18 +183,18 @@ struct hfa { struct hfa simple_hfa(void) { // CHECK-LABEL: define{{.*}} %struct.hfa @simple_hfa return va_arg(the_list, struct hfa); -// CHECK: [[VR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 4) +// CHECK: [[VR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 28) // CHECK: [[EARLY_ONSTACK:%[a-z_0-9]+]] = icmp sge i32 [[VR_OFFS]], 0 // CHECK: br i1 [[EARLY_ONSTACK]], label %[[VAARG_ON_STACK:[a-z_.0-9]+]], label %[[VAARG_MAYBE_REG:[a-z_.0-9]+]] // CHECK: [[VAARG_MAYBE_REG]] // CHECK: [[NEW_REG_OFFS:%[a-z_0-9]+]] = add i32 [[VR_OFFS]], 32 -// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 4) +// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 28) // CHECK: [[INREG:%[a-z_0-9]+]] = icmp sle i32 [[NEW_REG_OFFS]], 0 // CHECK: br i1 [[INREG]], label %[[VAARG_IN_REG:[a-z_.0-9]+]], label %[[VAARG_ON_STACK]] // CHECK: [[VAARG_IN_REG]] -// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 2) +// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 16) // CHECK: [[FIRST_REG:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[REG_TOP]], i32 [[VR_OFFS]] // CHECK-LE: [[EL_ADDR:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[FIRST_REG]], i64 0 // CHECK-BE: [[EL_ADDR:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[FIRST_REG]], i64 12 @@ -226,18 +226,18 @@ typedef int underaligned_int __attribute__((packed,aligned(2))); underaligned_int underaligned_int_test(void) { // CHECK-LABEL: define{{.*}} i32 @underaligned_int_test() return va_arg(the_list, underaligned_int); -// CHECK: [[GR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 3) +// CHECK: [[GR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 24) // CHECK: [[EARLY_ONSTACK:%[a-z_0-9]+]] = icmp sge i32 [[GR_OFFS]], 0 // CHECK: br i1 [[EARLY_ONSTACK]], label %[[VAARG_ON_STACK:[a-z_.0-9]+]], label %[[VAARG_MAYBE_REG:[a-z_.0-9]+]] // CHECK: [[VAARG_MAYBE_REG]] // CHECK: [[NEW_REG_OFFS:%[a-z_0-9]+]] = add i32 [[GR_OFFS]], 8 -// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 3) +// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 24) // CHECK: [[INREG:%[a-z_0-9]+]] = icmp sle i32 [[NEW_REG_OFFS]], 0 // CHECK: br i1 [[INREG]], label %[[VAARG_IN_REG:[a-z_.0-9]+]], label %[[VAARG_ON_STACK]] // CHECK: [[VAARG_IN_REG]] -// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 1) +// CHECK: [[REG_TOP:%[a-z_0-9]+]] = load ptr, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 8) // CHECK: [[REG_ADDR:%[a-z_0-9]+]] = getelementptr inbounds i8, ptr [[REG_TOP]], i32 [[GR_OFFS]] // CHECK-BE: [[REG_ADDR_ALIGNED:%[0-9]+]] = getelementptr inbounds i8, ptr [[REG_ADDR]], i64 4 // CHECK: br label %[[VAARG_END:[a-z._0-9]+]] @@ -260,18 +260,18 @@ typedef int overaligned_int __attribute__((aligned(32))); overaligned_int overaligned_int_test(void) { // CHECK-LABEL: define{{.*}} i32 @overaligned_int_test() return va_arg(the_list, overaligned_int); -// CHECK: [[GR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 3) +// CHECK: [[GR_OFFS:%[a-z_0-9]+]] = load i32, ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 24) // CHECK: [[EARLY_ONSTACK:%[a-z_0-9]+]] = icmp sge i32 [[GR_OFFS]], 0 // CHECK: br i1 [[EARLY_ONSTACK]], label %[[VAARG_ON_STACK:[a-z_.0-9]+]], label %[[VAARG_MAYBE_REG:[a-z_.0-9]+]] // CHECK: [[VAARG_MAYBE_REG]] // CHECK: [[NEW_REG_OFFS:%[a-z_0-9]+]] = add i32 [[GR_OFFS]], 8 -// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (%struct.__va_list, ptr @the_list, i32 0, i32 3) +// CHECK: store i32 [[NEW_REG_OFFS]], ptr getelementptr inbounds nuw (i8, ptr @the_list, i64 24) // CHECK: [[INREG:%[a-z_0-9]+]] = icmp sle i32 [[NEW_REG_OFFS]], 0 // CHECK: br i1 [[INREG]], label %[[VAARG_IN_REG:[a-z_.0-9]+... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/184819 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
