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

Reply via email to