llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Erich Keane (erichkeane) <details> <summary>Changes</summary> Just a drive-by that I discovered while debugging something else, we end up not getting the 'alignment' of these aggregates set at all. This patch just wires through the alloca's alignment onto these constants, which matches classic codegen. --- Full diff: https://github.com/llvm/llvm-project/pull/216321.diff 3 Files Affected: - (modified) clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp (+8-8) - (modified) clang/test/CIR/CodeGen/local-const-aggregate-name-clash.cpp (+6-6) - (modified) clang/test/CIR/CodeGen/union-agg-init.c (+3-3) ``````````diff diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp index 28ba14962cc7b..3ee7c84781848 100644 --- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp +++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp @@ -112,11 +112,10 @@ struct LoweringPreparePass /// already has a matching type and initial value, that global is reused. /// Otherwise a new global is created with the next available `.<n>` suffix /// (matching CIRGenBuilder::createVersionedGlobal and OGCG behavior). - cir::GlobalOp getOrCreateConstAggregateGlobal(CIRBaseBuilderTy &builder, - mlir::Location loc, - llvm::StringRef baseName, - mlir::Type ty, - mlir::TypedAttr constant); + cir::GlobalOp + getOrCreateConstAggregateGlobal(CIRBaseBuilderTy &builder, mlir::Location loc, + llvm::StringRef baseName, mlir::Type ty, + mlir::TypedAttr constant, uint64_t alignment); /// Build the function that initializes the specified global cir::FuncOp buildCXXGlobalVarDeclInitFunc(cir::GlobalOp op); @@ -2147,7 +2146,7 @@ void LoweringPreparePass::lowerTrivialCopyCall(cir::CallOp op) { cir::GlobalOp LoweringPreparePass::getOrCreateConstAggregateGlobal( CIRBaseBuilderTy &builder, mlir::Location loc, llvm::StringRef baseName, - mlir::Type ty, mlir::TypedAttr constant) { + mlir::Type ty, mlir::TypedAttr constant, uint64_t alignment) { // Look up (and lazily populate) the per-base-name cache. llvm::SmallVector<cir::GlobalOp, 1> &versions = constAggregateGlobals[baseName]; @@ -2194,6 +2193,7 @@ cir::GlobalOp LoweringPreparePass::getOrCreateConstAggregateGlobal( mlir::SymbolTable::setSymbolVisibility( gv, mlir::SymbolTable::Visibility::Private); gv.setInitialValueAttr(constant); + gv.setAlignment(alignment); // Keep the cached symbol table in sync with the new global so subsequent // lookups for other base names find it. @@ -2245,8 +2245,8 @@ void LoweringPreparePass::lowerStoreOfConstAggregate(cir::StoreOp op) { // Check for existing globals and create a new global with a unique name // if no match is found. - cir::GlobalOp gv = getOrCreateConstAggregateGlobal(builder, op.getLoc(), - baseName, ty, constant); + cir::GlobalOp gv = getOrCreateConstAggregateGlobal( + builder, op.getLoc(), baseName, ty, constant, alloca.getAlignment()); // Now replace the store with get_global + copy. builder.setInsertionPoint(op); diff --git a/clang/test/CIR/CodeGen/local-const-aggregate-name-clash.cpp b/clang/test/CIR/CodeGen/local-const-aggregate-name-clash.cpp index 411c80ab1d016..f8ecb371c43a9 100644 --- a/clang/test/CIR/CodeGen/local-const-aggregate-name-clash.cpp +++ b/clang/test/CIR/CodeGen/local-const-aggregate-name-clash.cpp @@ -23,22 +23,22 @@ void f(bool which) { } } -// CIR-DAG: cir.global "private" constant cir_private @[[GV0:.*]] = #cir.const_array<[#cir.int<10> : !s32i, #cir.int<20> : !s32i, #cir.int<30> : !s32i, #cir.int<40> : !s32i]> : !cir.array<!s32i x 4> -// CIR-DAG: cir.global "private" constant cir_private @[[GV1:.*]] = #cir.const_array<[#cir.int<50> : !s32i, #cir.int<60> : !s32i]> : !cir.array<!s32i x 2> +// CIR-DAG: cir.global "private" constant cir_private @[[GV0:.*]] = #cir.const_array<[#cir.int<10> : !s32i, #cir.int<20> : !s32i, #cir.int<30> : !s32i, #cir.int<40> : !s32i]> : !cir.array<!s32i x 4> {alignment = 16 : i64} +// CIR-DAG: cir.global "private" constant cir_private @[[GV1:.*]] = #cir.const_array<[#cir.int<50> : !s32i, #cir.int<60> : !s32i]> : !cir.array<!s32i x 2> {alignment = 4 : i64} // CIR: cir.func{{.*}} @_Z1fb // CIR: cir.get_global @[[GV0]] : !cir.ptr<!cir.array<!s32i x 4>> // CIR: cir.get_global @[[GV1]] : !cir.ptr<!cir.array<!s32i x 2>> -// LLVM-DAG: @[[GV0:.*]] = private constant [4 x i32] [i32 10, i32 20, i32 30, i32 40] -// LLVM-DAG: @[[GV1:.*]] = private constant [2 x i32] [i32 50, i32 60] +// LLVM-DAG: @[[GV0:.*]] = private constant [4 x i32] [i32 10, i32 20, i32 30, i32 40], align 16 +// LLVM-DAG: @[[GV1:.*]] = private constant [2 x i32] [i32 50, i32 60], align 4 // LLVM: define{{.*}} @_Z1fb // LLVM: call void @llvm.memcpy.p0.p0.i64(ptr {{[^,]+}}, ptr align 4 @[[GV0]], i64 16, i1 false) // LLVM: call void @llvm.memcpy.p0.p0.i64(ptr {{[^,]+}}, ptr align 4 @[[GV1]], i64 8, i1 false) -// OGCG-DAG: @[[GV0:.*]] = private unnamed_addr constant [4 x i32] [i32 10, i32 20, i32 30, i32 40] -// OGCG-DAG: @[[GV1:.*]] = private unnamed_addr constant [2 x i32] [i32 50, i32 60] +// OGCG-DAG: @[[GV0:.*]] = private unnamed_addr constant [4 x i32] [i32 10, i32 20, i32 30, i32 40], align 16 +// OGCG-DAG: @[[GV1:.*]] = private unnamed_addr constant [2 x i32] [i32 50, i32 60], align 4 // OGCG: define{{.*}} @_Z1fb // OGCG: call void @llvm.memcpy.p0.p0.i64(ptr {{[^,]+}}, ptr {{[^,]+}}@[[GV0]], i64 16, i1 false) diff --git a/clang/test/CIR/CodeGen/union-agg-init.c b/clang/test/CIR/CodeGen/union-agg-init.c index ab603d24d8712..af966b499b994 100644 --- a/clang/test/CIR/CodeGen/union-agg-init.c +++ b/clang/test/CIR/CodeGen/union-agg-init.c @@ -10,10 +10,10 @@ typedef union vec3 { double component[3]; } vec3; -// LLVMCIR: @__const.ret_outer.__retval = {{.*}}%struct.outer { %union.needs_padding zeroinitializer, i32 1 } -// OGCG: @__const.ret_outer.o = {{.*}}{ { i32, [4 x i8] }, i32, [4 x i8] } { { i32, [4 x i8] } zeroinitializer, i32 1, [4 x i8] zeroinitializer } +// LLVMCIR: @__const.ret_outer.__retval = {{.*}}%struct.outer { %union.needs_padding zeroinitializer, i32 1 }, align 8 +// OGCG: @__const.ret_outer.o = {{.*}}{ { i32, [4 x i8] }, i32, [4 x i8] } { { i32, [4 x i8] } zeroinitializer, i32 1, [4 x i8] zeroinitializer }, align 8 -// CIR: cir.global "private" constant cir_private @__const.ret_outer.__retval = #cir.const_record<{#cir.zero : !rec_needs_padding, #cir.int<1> : !s32i}> : !rec_outer +// CIR: cir.global "private" constant cir_private @__const.ret_outer.__retval = #cir.const_record<{#cir.zero : !rec_needs_padding, #cir.int<1> : !s32i}> : !rec_outer {alignment = 8 : i64} // In C mode, this does do zero padding. vec3 ret_vec3() { `````````` </details> https://github.com/llvm/llvm-project/pull/216321 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
