Skip to content

Commit 9c6f491

Browse files
committed
MSVC: Re-enable alignment attribute for sret params
Seems to be working with recent LLVM - at least for x64.
1 parent 48c2d06 commit 9c6f491

File tree

2 files changed

+5
-10
lines changed

2 files changed

+5
-10
lines changed

gen/functions.cpp

+1-5
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,8 @@ llvm::FunctionType *DtoFunctionType(Type *type, IrFuncTy &irFty, Type *thistype,
7979
newIrFty.arg_sret = new IrFuncTyArg(
8080
rt, true,
8181
AttrBuilder().add(LLAttribute::StructRet).add(LLAttribute::NoAlias));
82-
const unsigned alignment = DtoAlignment(rt);
83-
if (alignment &&
84-
// FIXME: LLVM inliner issues for std.bitmanip and std.uni on Win64
85-
!global.params.targetTriple->isOSMSVCRT()) {
82+
if (unsigned alignment = DtoAlignment(rt))
8683
newIrFty.arg_sret->attrs.addAlignment(alignment);
87-
}
8884
rt = Type::tvoid;
8985
++nextLLArgIdx;
9086
} else {

tests/codegen/align.d

+4-5
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,13 @@ static Inner globalInner;
1010

1111
Outer passAndReturnOuterByVal(Outer arg) { return arg; }
1212
// CHECK: define{{.*}} void @{{.*}}_D5align23passAndReturnOuterByValFS5align5OuterZS5align5Outer
13-
/* no sret align attributes for MSVC targets at the moment */
14-
// C HECK-SAME: %align.Outer* noalias sret align 32 %.sret_arg
13+
// CHECK-SAME: %align.Outer* noalias sret align 32 %.sret_arg
1514
/* how the arg is passed by value is ABI-specific, but the pointer must be aligned */
1615
// CHECK-SAME: align 32 %
1716

1817
Inner passAndReturnInnerByVal(Inner arg) { return arg; }
1918
// CHECK: define{{.*}} void @{{.*}}_D5align23passAndReturnInnerByValFS5align5InnerZS5align5Inner
20-
// C HECK-SAME: %align.Inner* noalias sret align 32 %.sret_arg
19+
// CHECK-SAME: %align.Inner* noalias sret align 32 %.sret_arg
2120
// CHECK-SAME: align 32 %
2221

2322
void main() {
@@ -49,11 +48,11 @@ void main() {
4948

5049
outer = passAndReturnOuterByVal(outer);
5150
// CHECK: call{{.*}} void @{{.*}}_D5align23passAndReturnOuterByValFS5align5OuterZS5align5Outer
52-
// C HECK-SAME: %align.Outer* noalias sret align 32 %.rettmp
51+
// CHECK-SAME: %align.Outer* noalias sret align 32 %.rettmp
5352
// CHECK-SAME: align 32 %
5453

5554
inner = passAndReturnInnerByVal(inner);
5655
// CHECK: call{{.*}} void @{{.*}}_D5align23passAndReturnInnerByValFS5align5InnerZS5align5Inner
57-
// C HECK-SAME: %align.Inner* noalias sret align 32 %.rettmp1
56+
// CHECK-SAME: %align.Inner* noalias sret align 32 %.rettmp1
5857
// CHECK-SAME: align 32 %
5958
}

0 commit comments

Comments
 (0)