diff --git a/src/Sema.zig b/src/Sema.zig index 2f861a87e660fc8f4783b136de0855311e2e3ab0..3e8eeeb88681e7fa0ba62600ccb5f6a4ce8b5349 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -3657,9 +3657,10 @@ fn zirMakePtrConst(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro const elem_ty = ptr_info.child.toType(); if (try sema.resolveComptimeKnownAllocValue(block, alloc, null)) |val| { - var anon_decl = try block.startAnonDecl(); - defer anon_decl.deinit(); - const new_mut_ptr = try sema.analyzeDeclRef(try anon_decl.finish(elem_ty, val.toValue(), ptr_info.flags.alignment)); + const new_mut_ptr = Air.internedToRef((try mod.intern(.{ .ptr = .{ + .ty = alloc_ty.toIntern(), + .addr = .{ .anon_decl = val }, + } }))); return sema.makePtrConst(block, new_mut_ptr); } diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index cddd4340d70643825b32fe8f818d38c5ae85edce..9bb012deb1ef8585127ca0e164827df3866b02e4 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -3049,6 +3049,7 @@ pub const Object = struct { o: *Object, decl_val: InternPool.Index, llvm_addr_space: Builder.AddrSpace, + alignment: InternPool.Alignment, ) Error!Builder.Variable.Index { // TODO: Add address space to the anon_decl_map const gop = try o.anon_decl_map.getOrPut(o.gpa, decl_val); @@ -3068,6 +3069,8 @@ pub const Object = struct { try variable_index.setInitializer(try o.lowerValue(decl_val), &o.builder); variable_index.setLinkage(.internal, &o.builder); variable_index.setUnnamedAddr(.unnamed_addr, &o.builder); + if (alignment != .none) + variable_index.setAlignment(alignment.toLlvm(), &o.builder); return variable_index; } @@ -4415,7 +4418,8 @@ pub const Object = struct { const addr_space = target_util.defaultAddressSpace(target, .global_constant); const llvm_addr_space = toLlvmAddressSpace(addr_space, target); - const llvm_global = (try o.resolveGlobalAnonDecl(decl_val, llvm_addr_space)).ptrConst(&o.builder).global; + const alignment = ptr_ty.ptrAlignment(mod); + const llvm_global = (try o.resolveGlobalAnonDecl(decl_val, llvm_addr_space, alignment)).ptrConst(&o.builder).global; const llvm_val = try o.builder.convConst( .unneeded, diff --git a/test/behavior.zig b/test/behavior.zig index 7523c60ae8a731e382a18b23106aa917c077312a..9e03a8f000d13c9996d67ddeb316ad1922fd9804 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -37,7 +37,6 @@ test { _ = @import("behavior/bugs/1500.zig"); _ = @import("behavior/bugs/1607.zig"); _ = @import("behavior/bugs/1735.zig"); - _ = @import("behavior/bugs/1741.zig"); _ = @import("behavior/bugs/1851.zig"); _ = @import("behavior/bugs/1914.zig"); _ = @import("behavior/bugs/2006.zig"); diff --git a/test/behavior/align.zig b/test/behavior/align.zig index 00fbfc2cb5b6057f2862716d24da0011b999b4c8..217d0b7c15287eab5146fd344fa6518eb1aff609 100644 --- a/test/behavior/align.zig +++ b/test/behavior/align.zig @@ -15,6 +15,15 @@ test "global variable alignment" { } } +test "large alignment of local constant" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // flaky + + const x: f32 align(128) = 12.34; + try std.testing.expect(@intFromPtr(&x) % 128 == 0); +} + test "slicing array of length 1 can not assume runtime index is always zero" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO diff --git a/test/behavior/bugs/1741.zig b/test/behavior/bugs/1741.zig deleted file mode 100644 index f4da8e5c2e495c5f61655f5914283d226ca89913..0000000000000000000000000000000000000000 --- a/test/behavior/bugs/1741.zig +++ /dev/null @@ -1,11 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -test "fixed" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // flaky - - const x: f32 align(128) = 12.34; - try std.testing.expect(@intFromPtr(&x) % 128 == 0); -}