[clang] 068ec1a - [clang] fix __builtin_clear_padding not working with virtual base pointers on Windows (#211355)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Jul 25 01:35:49 PDT 2026
Author: Hui
Date: 2026-07-25T09:35:45+01:00
New Revision: 068ec1a282c1f4c22c5a1e71f7f6834846c5dca9
URL: https://github.com/llvm/llvm-project/commit/068ec1a282c1f4c22c5a1e71f7f6834846c5dca9
DIFF: https://github.com/llvm/llvm-project/commit/068ec1a282c1f4c22c5a1e71f7f6834846c5dca9.diff
LOG: [clang] fix __builtin_clear_padding not working with virtual base pointers on Windows (#211355)
Fixes https://github.com/llvm/llvm-project/issues/209787
It was an oversight that the builtin only takes care of the virtual
function table pointer but not the virtual base pointer. On Itanium
there is one pointer so it wasn't a problem but on windows msvc , this
is a problem. And the runtime test in libcxx CI was disabled in llvm 23
because we don't use trunk clang in our libcxx CI in general. and after
we flipped to llvm 24, the test started to fail on downstream (chromium)
where they use trunk clang with trunk libc++ on Windows.
We do have FileCheck test in clang test which covers this virtual case.
However, the target triple in the FileCheck under test were
`x86_64-linux-gnu` and `x86_64-windows-gnu` , which does not cover the
Windows msvc ABI. I updated the test to test `x86_64-pc-windows-msvc` in
this PR to cover that ABI.
Added:
Modified:
clang/lib/CodeGen/CGBuiltin.cpp
clang/test/CodeGen/builtin-clear-padding-codegen.c
clang/test/CodeGenCXX/builtin-clear-padding-codegen.cpp
Removed:
################################################################################
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 37846bbb0b5ec..f38a891272474 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -2733,6 +2733,13 @@ struct PaddingClearer {
StartBitOffset, StartBitOffset + DL.getPointerSizeInBits()});
}
+ if (ASTLayout.hasOwnVBPtr()) {
+ auto Offset = ASTLayout.getVBPtrOffset().getQuantity();
+ auto StartVBPtr = StartBitOffset + Offset * CharWidth;
+ OccuppiedIntervals.push_back(
+ BitInterval{StartVBPtr, StartVBPtr + DL.getPointerSizeInBits()});
+ }
+
const auto VisitBase = [&ASTLayout, StartBitOffset, this](
const CXXBaseSpecifier &Base, auto GetOffset) {
auto *BaseRecord = Base.getType()->getAsCXXRecordDecl();
diff --git a/clang/test/CodeGen/builtin-clear-padding-codegen.c b/clang/test/CodeGen/builtin-clear-padding-codegen.c
index c2602d8934bd7..0564c52dd2a49 100644
--- a/clang/test/CodeGen/builtin-clear-padding-codegen.c
+++ b/clang/test/CodeGen/builtin-clear-padding-codegen.c
@@ -1,6 +1,6 @@
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
// RUN: %clang_cc1 -std=c11 -triple=x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s --check-prefix=LINUX
-// RUN: %clang_cc1 -std=c11 -triple=x86_64-windows-gnu -emit-llvm -o - %s | FileCheck %s --check-prefix=WINDOWS
+// RUN: %clang_cc1 -std=c11 -triple=x86_64-pc-windows-msvc -emit-llvm -o - %s | FileCheck %s --check-prefix=WINDOWS
struct Empty {};
@@ -12,16 +12,24 @@ struct Empty {};
// LINUX-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 8
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testEmpty(
-// WINDOWS-SAME: ptr noundef [[E:%.*]]) #[[ATTR0:[0-9]+]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[E_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[E]], ptr [[E_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 8
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testEmpty(ptr noundef %e) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %e.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %e, ptr %e.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %e.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 2
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: ret void
//
void testEmpty(struct Empty *e) {
- // Emtpy struct is empty in C, no padding
+ // Emtpy struct is empty in C in Itanium ABI, no padding
+ // Emtpy struct has 4 bytes in C in clang's MSVC ABI
__builtin_clear_padding(e);
}
@@ -34,13 +42,12 @@ void testEmpty(struct Empty *e) {
// LINUX-NEXT: [[TMP0:%.*]] = load ptr, ptr [[I_ADDR]], align 8
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testPrimitiveNoPadding(
-// WINDOWS-SAME: ptr noundef [[I:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[I_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[I]], ptr [[I_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[I_ADDR]], align 8
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testPrimitiveNoPadding(ptr noundef %i) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %i.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %i, ptr %i.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %i.addr, align 8
+// WINDOWS-NEXT: ret void
//
void testPrimitiveNoPadding(int *i) {
// This should not clear any padding, since int has no padding.
@@ -68,25 +75,12 @@ void testPrimitiveNoPadding(int *i) {
// LINUX-NEXT: store i8 0, ptr [[TMP6]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testPrimitiveLongDouble(
-// WINDOWS-SAME: ptr noundef [[LD:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[LD_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[LD]], ptr [[LD_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[LD_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 10
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 11
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 12
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 4
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testPrimitiveLongDouble(ptr noundef %ld) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %ld.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %ld, ptr %ld.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %ld.addr, align 8
+// WINDOWS-NEXT: ret void
//
void testPrimitiveLongDouble(long double *ld) {
// padding [10, 15] on x86
@@ -111,23 +105,22 @@ void testPrimitiveLongDouble(long double *ld) {
// LINUX-NEXT: store i8 0, ptr [[TMP6]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testBitInt(
-// WINDOWS-SAME: ptr noundef [[BI:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[BI_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[BI]], ptr [[BI_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BI_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 12
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 4
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], 1
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 4
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testBitInt(ptr noundef %bi) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %bi.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %bi, ptr %bi.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %bi.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 12
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 4
+// WINDOWS-NEXT: %3 = and i8 %2, 1
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 4
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 13
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 14
+// WINDOWS-NEXT: store i8 0, ptr %5, align 2
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 15
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: ret void
//
void testBitInt(_BitInt(97) *bi) {
// Storage is widened to 128 bits; clear bits [97, 128).
@@ -167,37 +160,12 @@ void testBitInt(_BitInt(97) *bi) {
// LINUX-NEXT: store i8 0, ptr [[TMP12]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testPrimitiveComplexLongDouble(
-// WINDOWS-SAME: ptr noundef [[C:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 10
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 11
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 12
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 4
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 26
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 2
-// WINDOWS-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[TMP0]], i32 27
-// WINDOWS-NEXT: store i8 0, ptr [[TMP8]], align 1
-// WINDOWS-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP0]], i32 28
-// WINDOWS-NEXT: store i8 0, ptr [[TMP9]], align 4
-// WINDOWS-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[TMP0]], i32 29
-// WINDOWS-NEXT: store i8 0, ptr [[TMP10]], align 1
-// WINDOWS-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[TMP0]], i32 30
-// WINDOWS-NEXT: store i8 0, ptr [[TMP11]], align 2
-// WINDOWS-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[TMP0]], i32 31
-// WINDOWS-NEXT: store i8 0, ptr [[TMP12]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testPrimitiveComplexLongDouble(ptr noundef %c) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %c.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %c, ptr %c.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %c.addr, align 8
+// WINDOWS-NEXT: ret void
//
void testPrimitiveComplexLongDouble(_Complex long double *c) {
// padding [10, 15] and [26, 31] on x86
@@ -217,13 +185,12 @@ union U1 {
// LINUX-NEXT: [[TMP0:%.*]] = load ptr, ptr [[U_ADDR]], align 8
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testUnionDifferentLength(
-// WINDOWS-SAME: ptr noundef [[U:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[U_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[U]], ptr [[U_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[U_ADDR]], align 8
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testUnionDifferentLength(ptr noundef %u) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %u.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %u, ptr %u.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %u.addr, align 8
+// WINDOWS-NEXT: ret void
//
void testUnionDifferentLength(union U1 *u) {
// This should not clear the object representation bits of the non-active member.
@@ -261,27 +228,26 @@ union U2 {
// LINUX-NEXT: store i8 0, ptr [[TMP7]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testUnionTailPaddingOfLongestMember(
-// WINDOWS-SAME: ptr noundef [[U:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[U_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[U]], ptr [[U_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[U_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 2
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 2
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 4
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 4
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 2
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testUnionTailPaddingOfLongestMember(ptr noundef %u) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %u.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %u, ptr %u.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %u.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 2
+// WINDOWS-NEXT: store i8 0, ptr %2, align 2
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 4
+// WINDOWS-NEXT: store i8 0, ptr %4, align 4
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %6, align 2
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %7, align 1
+// WINDOWS-NEXT: ret void
//
void testUnionTailPaddingOfLongestMember(union U2 *u) {
// This should clear the tail padding of the longest member.
@@ -334,27 +300,26 @@ struct __attribute__((aligned(4))) Baz {
// LINUX-NEXT: store i8 0, ptr [[TMP7]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testStructPaddingInBetweenMembers(
-// WINDOWS-SAME: ptr noundef [[BAZ:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[BAZ_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[BAZ]], ptr [[BAZ_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BAZ_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 2
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 9
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 11
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testStructPaddingInBetweenMembers(ptr noundef %baz) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %baz.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %baz, ptr %baz.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %baz.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %4, align 2
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 9
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %0, i32 11
+// WINDOWS-NEXT: store i8 0, ptr %7, align 1
+// WINDOWS-NEXT: ret void
//
void testStructPaddingInBetweenMembers(struct Baz *baz) {
// this should clear all the padding in between various members
@@ -383,27 +348,26 @@ void testStructPaddingInBetweenMembers(struct Baz *baz) {
// LINUX-NEXT: store i8 0, ptr [[TMP7]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testStructVolatile(
-// WINDOWS-SAME: ptr noundef [[BAZ:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[BAZ_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[BAZ]], ptr [[BAZ_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BAZ_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 2
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 9
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 11
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testStructVolatile(ptr noundef %baz) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %baz.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %baz, ptr %baz.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %baz.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %4, align 2
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 9
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %0, i32 11
+// WINDOWS-NEXT: store i8 0, ptr %7, align 1
+// WINDOWS-NEXT: ret void
//
void testStructVolatile(volatile struct Baz *baz) {
// this should clear all the padding in between various members
@@ -468,55 +432,26 @@ struct S3 {
// LINUX-NEXT: store i8 0, ptr [[TMP21]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testStructWithLongDouble(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 10
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 11
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 12
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 4
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 17
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 1
-// WINDOWS-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[TMP0]], i32 18
-// WINDOWS-NEXT: store i8 0, ptr [[TMP8]], align 2
-// WINDOWS-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP0]], i32 19
-// WINDOWS-NEXT: store i8 0, ptr [[TMP9]], align 1
-// WINDOWS-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[TMP0]], i32 20
-// WINDOWS-NEXT: store i8 0, ptr [[TMP10]], align 4
-// WINDOWS-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[TMP0]], i32 21
-// WINDOWS-NEXT: store i8 0, ptr [[TMP11]], align 1
-// WINDOWS-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[TMP0]], i32 22
-// WINDOWS-NEXT: store i8 0, ptr [[TMP12]], align 2
-// WINDOWS-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[TMP0]], i32 23
-// WINDOWS-NEXT: store i8 0, ptr [[TMP13]], align 1
-// WINDOWS-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP0]], i32 24
-// WINDOWS-NEXT: store i8 0, ptr [[TMP14]], align 8
-// WINDOWS-NEXT: [[TMP15:%.*]] = getelementptr i8, ptr [[TMP0]], i32 25
-// WINDOWS-NEXT: store i8 0, ptr [[TMP15]], align 1
-// WINDOWS-NEXT: [[TMP16:%.*]] = getelementptr i8, ptr [[TMP0]], i32 26
-// WINDOWS-NEXT: store i8 0, ptr [[TMP16]], align 2
-// WINDOWS-NEXT: [[TMP17:%.*]] = getelementptr i8, ptr [[TMP0]], i32 27
-// WINDOWS-NEXT: store i8 0, ptr [[TMP17]], align 1
-// WINDOWS-NEXT: [[TMP18:%.*]] = getelementptr i8, ptr [[TMP0]], i32 28
-// WINDOWS-NEXT: store i8 0, ptr [[TMP18]], align 4
-// WINDOWS-NEXT: [[TMP19:%.*]] = getelementptr i8, ptr [[TMP0]], i32 29
-// WINDOWS-NEXT: store i8 0, ptr [[TMP19]], align 1
-// WINDOWS-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[TMP0]], i32 30
-// WINDOWS-NEXT: store i8 0, ptr [[TMP20]], align 2
-// WINDOWS-NEXT: [[TMP21:%.*]] = getelementptr i8, ptr [[TMP0]], i32 31
-// WINDOWS-NEXT: store i8 0, ptr [[TMP21]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testStructWithLongDouble(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 9
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 10
+// WINDOWS-NEXT: store i8 0, ptr %2, align 2
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 11
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 12
+// WINDOWS-NEXT: store i8 0, ptr %4, align 4
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 13
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 14
+// WINDOWS-NEXT: store i8 0, ptr %6, align 2
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %0, i32 15
+// WINDOWS-NEXT: store i8 0, ptr %7, align 1
+// WINDOWS-NEXT: ret void
//
void testStructWithLongDouble(struct S3 *s) {
// "long double data[0-9]", PAD [10-15], "b", PAD [17-31]
@@ -543,17 +478,16 @@ struct S11 {
// LINUX-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testBitFields(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], 31
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testBitFields(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 1
+// WINDOWS-NEXT: %3 = and i8 %2, 31
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 1
+// WINDOWS-NEXT: ret void
//
void testBitFields(struct S11 *s) {
// "b1" [0-2], "b2" [3-4], PAD [5-7], "b3" [8-13], "b4" [14-15]
@@ -568,11 +502,10 @@ void testBitFields(struct S11 *s) {
// LINUX-NEXT: [[I:%.*]] = alloca [4 x i32], align 16
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testArrayNoPadding(
-// WINDOWS-SAME: ) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[I:%.*]] = alloca [4 x i32], align 16
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testArrayNoPadding() #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %i = alloca [4 x i32], align 4
+// WINDOWS-NEXT: ret void
//
void testArrayNoPadding(void) {
int i[4];
@@ -610,35 +543,10 @@ void testArrayNoPadding(void) {
// LINUX-NEXT: store i8 0, ptr [[TMP11]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testArrayLongDouble(
-// WINDOWS-SAME: ) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[LD:%.*]] = alloca [2 x x86_fp80], align 16
-// WINDOWS-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[LD]], i32 10
-// WINDOWS-NEXT: store i8 0, ptr [[TMP0]], align 2
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[LD]], i32 11
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[LD]], i32 12
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 4
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[LD]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[LD]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 2
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[LD]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[LD]], i32 26
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 2
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[LD]], i32 27
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 1
-// WINDOWS-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[LD]], i32 28
-// WINDOWS-NEXT: store i8 0, ptr [[TMP8]], align 4
-// WINDOWS-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[LD]], i32 29
-// WINDOWS-NEXT: store i8 0, ptr [[TMP9]], align 1
-// WINDOWS-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[LD]], i32 30
-// WINDOWS-NEXT: store i8 0, ptr [[TMP10]], align 2
-// WINDOWS-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[LD]], i32 31
-// WINDOWS-NEXT: store i8 0, ptr [[TMP11]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testArrayLongDouble() #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %ld = alloca [2 x double], align 8
+// WINDOWS-NEXT: ret void
//
void testArrayLongDouble() {
// long double 0, [0-9] PAD [10-15]
@@ -677,35 +585,34 @@ void testArrayLongDouble() {
// LINUX-NEXT: store i8 0, ptr [[TMP11]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testArrayOfStruct(
-// WINDOWS-SAME: ) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S:%.*]] = alloca [2 x [[STRUCT_S_LOCAL:%.*]]], align 16
-// WINDOWS-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[S]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP0]], align 1
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[S]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[S]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[S]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[S]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 2
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[S]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[S]], i32 21
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[S]], i32 22
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 2
-// WINDOWS-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[S]], i32 23
-// WINDOWS-NEXT: store i8 0, ptr [[TMP8]], align 1
-// WINDOWS-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[S]], i32 29
-// WINDOWS-NEXT: store i8 0, ptr [[TMP9]], align 1
-// WINDOWS-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[S]], i32 30
-// WINDOWS-NEXT: store i8 0, ptr [[TMP10]], align 2
-// WINDOWS-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[S]], i32 31
-// WINDOWS-NEXT: store i8 0, ptr [[TMP11]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testArrayOfStruct() #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s = alloca [2 x %struct.S_local], align 4
+// WINDOWS-NEXT: %0 = getelementptr i8, ptr %s, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %0, align 1
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %s, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %1, align 2
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %s, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %s, i32 13
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %s, i32 14
+// WINDOWS-NEXT: store i8 0, ptr %4, align 2
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %s, i32 15
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %s, i32 21
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %s, i32 22
+// WINDOWS-NEXT: store i8 0, ptr %7, align 2
+// WINDOWS-NEXT: %8 = getelementptr i8, ptr %s, i32 23
+// WINDOWS-NEXT: store i8 0, ptr %8, align 1
+// WINDOWS-NEXT: %9 = getelementptr i8, ptr %s, i32 29
+// WINDOWS-NEXT: store i8 0, ptr %9, align 1
+// WINDOWS-NEXT: %10 = getelementptr i8, ptr %s, i32 30
+// WINDOWS-NEXT: store i8 0, ptr %10, align 2
+// WINDOWS-NEXT: %11 = getelementptr i8, ptr %s, i32 31
+// WINDOWS-NEXT: store i8 0, ptr %11, align 1
+// WINDOWS-NEXT: ret void
//
void testArrayOfStruct(void) {
struct S_local {
@@ -748,21 +655,20 @@ struct ArrOfStructsWithPadding {
// LINUX-NEXT: store i8 0, ptr [[TMP4]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testArrOfStructsWithPadding(
-// WINDOWS-SAME: ptr noundef [[ARR:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[ARR_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[ARR]], ptr [[ARR_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[ARR_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testArrOfStructsWithPadding(ptr noundef %arr) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %arr.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %arr, ptr %arr.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %arr.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: ret void
//
void testArrOfStructsWithPadding(struct ArrOfStructsWithPadding *arr) {
__builtin_clear_padding(arr);
@@ -780,17 +686,16 @@ void testArrOfStructsWithPadding(struct ArrOfStructsWithPadding *arr) {
// LINUX-NEXT: store i8 0, ptr [[TMP2]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testAtomic(
-// WINDOWS-SAME: ptr noundef [[BAR:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[BAR_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[BAR]], ptr [[BAR_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BAR_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testAtomic(ptr noundef %bar) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %bar.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %bar, ptr %bar.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %bar.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: ret void
//
void testAtomic(_Atomic(struct Bar)* bar) {
__builtin_clear_padding(bar);
@@ -815,21 +720,20 @@ typedef long double LongDouble3Vec __attribute__((ext_vector_type(3)));
// LINUX-NEXT: store i8 0, ptr [[TMP4]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testAttributedType(
-// WINDOWS-SAME: ptr noundef [[V:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[V_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[V]], ptr [[V_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[V_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 12
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 4
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 2
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testAttributedType(ptr noundef %v) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %v.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %v, ptr %v.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %v.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 12
+// WINDOWS-NEXT: store i8 0, ptr %1, align 4
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 13
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 14
+// WINDOWS-NEXT: store i8 0, ptr %3, align 2
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 15
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: ret void
//
void testAttributedType(Float3Vec* v) {
__builtin_clear_padding(v);
@@ -911,81 +815,28 @@ void testAttributedType(Float3Vec* v) {
// LINUX-NEXT: store i8 0, ptr [[TMP34]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testAttributedLongDoubleType(
-// WINDOWS-SAME: ptr noundef [[V:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[V_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[V]], ptr [[V_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[V_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 30
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 31
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 32
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 32
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 33
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 34
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 35
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 36
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 4
-// WINDOWS-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[TMP0]], i32 37
-// WINDOWS-NEXT: store i8 0, ptr [[TMP8]], align 1
-// WINDOWS-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP0]], i32 38
-// WINDOWS-NEXT: store i8 0, ptr [[TMP9]], align 2
-// WINDOWS-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[TMP0]], i32 39
-// WINDOWS-NEXT: store i8 0, ptr [[TMP10]], align 1
-// WINDOWS-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[TMP0]], i32 40
-// WINDOWS-NEXT: store i8 0, ptr [[TMP11]], align 8
-// WINDOWS-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[TMP0]], i32 41
-// WINDOWS-NEXT: store i8 0, ptr [[TMP12]], align 1
-// WINDOWS-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[TMP0]], i32 42
-// WINDOWS-NEXT: store i8 0, ptr [[TMP13]], align 2
-// WINDOWS-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP0]], i32 43
-// WINDOWS-NEXT: store i8 0, ptr [[TMP14]], align 1
-// WINDOWS-NEXT: [[TMP15:%.*]] = getelementptr i8, ptr [[TMP0]], i32 44
-// WINDOWS-NEXT: store i8 0, ptr [[TMP15]], align 4
-// WINDOWS-NEXT: [[TMP16:%.*]] = getelementptr i8, ptr [[TMP0]], i32 45
-// WINDOWS-NEXT: store i8 0, ptr [[TMP16]], align 1
-// WINDOWS-NEXT: [[TMP17:%.*]] = getelementptr i8, ptr [[TMP0]], i32 46
-// WINDOWS-NEXT: store i8 0, ptr [[TMP17]], align 2
-// WINDOWS-NEXT: [[TMP18:%.*]] = getelementptr i8, ptr [[TMP0]], i32 47
-// WINDOWS-NEXT: store i8 0, ptr [[TMP18]], align 1
-// WINDOWS-NEXT: [[TMP19:%.*]] = getelementptr i8, ptr [[TMP0]], i32 48
-// WINDOWS-NEXT: store i8 0, ptr [[TMP19]], align 16
-// WINDOWS-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[TMP0]], i32 49
-// WINDOWS-NEXT: store i8 0, ptr [[TMP20]], align 1
-// WINDOWS-NEXT: [[TMP21:%.*]] = getelementptr i8, ptr [[TMP0]], i32 50
-// WINDOWS-NEXT: store i8 0, ptr [[TMP21]], align 2
-// WINDOWS-NEXT: [[TMP22:%.*]] = getelementptr i8, ptr [[TMP0]], i32 51
-// WINDOWS-NEXT: store i8 0, ptr [[TMP22]], align 1
-// WINDOWS-NEXT: [[TMP23:%.*]] = getelementptr i8, ptr [[TMP0]], i32 52
-// WINDOWS-NEXT: store i8 0, ptr [[TMP23]], align 4
-// WINDOWS-NEXT: [[TMP24:%.*]] = getelementptr i8, ptr [[TMP0]], i32 53
-// WINDOWS-NEXT: store i8 0, ptr [[TMP24]], align 1
-// WINDOWS-NEXT: [[TMP25:%.*]] = getelementptr i8, ptr [[TMP0]], i32 54
-// WINDOWS-NEXT: store i8 0, ptr [[TMP25]], align 2
-// WINDOWS-NEXT: [[TMP26:%.*]] = getelementptr i8, ptr [[TMP0]], i32 55
-// WINDOWS-NEXT: store i8 0, ptr [[TMP26]], align 1
-// WINDOWS-NEXT: [[TMP27:%.*]] = getelementptr i8, ptr [[TMP0]], i32 56
-// WINDOWS-NEXT: store i8 0, ptr [[TMP27]], align 8
-// WINDOWS-NEXT: [[TMP28:%.*]] = getelementptr i8, ptr [[TMP0]], i32 57
-// WINDOWS-NEXT: store i8 0, ptr [[TMP28]], align 1
-// WINDOWS-NEXT: [[TMP29:%.*]] = getelementptr i8, ptr [[TMP0]], i32 58
-// WINDOWS-NEXT: store i8 0, ptr [[TMP29]], align 2
-// WINDOWS-NEXT: [[TMP30:%.*]] = getelementptr i8, ptr [[TMP0]], i32 59
-// WINDOWS-NEXT: store i8 0, ptr [[TMP30]], align 1
-// WINDOWS-NEXT: [[TMP31:%.*]] = getelementptr i8, ptr [[TMP0]], i32 60
-// WINDOWS-NEXT: store i8 0, ptr [[TMP31]], align 4
-// WINDOWS-NEXT: [[TMP32:%.*]] = getelementptr i8, ptr [[TMP0]], i32 61
-// WINDOWS-NEXT: store i8 0, ptr [[TMP32]], align 1
-// WINDOWS-NEXT: [[TMP33:%.*]] = getelementptr i8, ptr [[TMP0]], i32 62
-// WINDOWS-NEXT: store i8 0, ptr [[TMP33]], align 2
-// WINDOWS-NEXT: [[TMP34:%.*]] = getelementptr i8, ptr [[TMP0]], i32 63
-// WINDOWS-NEXT: store i8 0, ptr [[TMP34]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testAttributedLongDoubleType(ptr noundef %v) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %v.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %v, ptr %v.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %v.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 24
+// WINDOWS-NEXT: store i8 0, ptr %1, align 8
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 25
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 26
+// WINDOWS-NEXT: store i8 0, ptr %3, align 2
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 27
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 28
+// WINDOWS-NEXT: store i8 0, ptr %5, align 4
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 29
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %0, i32 30
+// WINDOWS-NEXT: store i8 0, ptr %7, align 2
+// WINDOWS-NEXT: %8 = getelementptr i8, ptr %0, i32 31
+// WINDOWS-NEXT: store i8 0, ptr %8, align 1
+// WINDOWS-NEXT: ret void
//
void testAttributedLongDoubleType(LongDouble3Vec *v) {
// long double elements occupy [0-9], [16-25], [32-41] on x86.
@@ -1010,17 +861,16 @@ struct UnnamedBitfieldSingleBit {
// LINUX-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testUnnamedBitfieldSingleBit(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], -9
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testUnnamedBitfieldSingleBit(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 1
+// WINDOWS-NEXT: %3 = and i8 %2, -9
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 1
+// WINDOWS-NEXT: ret void
//
void testUnnamedBitfieldSingleBit(struct UnnamedBitfieldSingleBit *s) {
// byte 0: a[bits 0-2], unnamed[bit 3], b[bits 4-7]
@@ -1047,17 +897,16 @@ struct UnnamedBitfieldMiddle {
// LINUX-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testUnnamedBitfieldMiddle(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], -25
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testUnnamedBitfieldMiddle(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 1
+// WINDOWS-NEXT: %3 = and i8 %2, -25
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 1
+// WINDOWS-NEXT: ret void
//
void testUnnamedBitfieldMiddle(struct UnnamedBitfieldMiddle *s) {
// byte 0: a[0-2], unnamed[3-4], b[5-7]
@@ -1088,21 +937,20 @@ struct UnnamedBitfieldSurrounding {
// LINUX-NEXT: store i8 [[TMP6]], ptr [[TMP4]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testUnnamedBitfieldSurrounding(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], -4
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = and i8 [[TMP5]], 63
-// WINDOWS-NEXT: store i8 [[TMP6]], ptr [[TMP4]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testUnnamedBitfieldSurrounding(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 1
+// WINDOWS-NEXT: %3 = and i8 %2, -4
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %5 = load i8, ptr %4, align 1
+// WINDOWS-NEXT: %6 = and i8 %5, 63
+// WINDOWS-NEXT: store i8 %6, ptr %4, align 1
+// WINDOWS-NEXT: ret void
//
void testUnnamedBitfieldSurrounding(struct UnnamedBitfieldSurrounding *s) {
// byte 0: unnamed[0-1], a[2-5], unnamed[6-7]
@@ -1147,33 +995,32 @@ struct UnnamedZeroWidthBitfield {
// LINUX-NEXT: store i8 0, ptr [[TMP12]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testUnnamedZeroWidthBitfield(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 4
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], 15
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 4
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 2
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 4
-// WINDOWS-NEXT: [[TMP8:%.*]] = load i8, ptr [[TMP7]], align 4
-// WINDOWS-NEXT: [[TMP9:%.*]] = and i8 [[TMP8]], 15
-// WINDOWS-NEXT: store i8 [[TMP9]], ptr [[TMP7]], align 4
-// WINDOWS-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP10]], align 1
-// WINDOWS-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[TMP0]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP11]], align 2
-// WINDOWS-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP12]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testUnnamedZeroWidthBitfield(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 4
+// WINDOWS-NEXT: %3 = and i8 %2, 15
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 4
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 2
+// WINDOWS-NEXT: store i8 0, ptr %5, align 2
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %0, i32 4
+// WINDOWS-NEXT: %8 = load i8, ptr %7, align 4
+// WINDOWS-NEXT: %9 = and i8 %8, 15
+// WINDOWS-NEXT: store i8 %9, ptr %7, align 4
+// WINDOWS-NEXT: %10 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %10, align 1
+// WINDOWS-NEXT: %11 = getelementptr i8, ptr %0, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %11, align 2
+// WINDOWS-NEXT: %12 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %12, align 1
+// WINDOWS-NEXT: ret void
//
void testUnnamedZeroWidthBitfield(struct UnnamedZeroWidthBitfield *s) {
// byte 0: a[0-3], unnamed[4-7]
@@ -1214,21 +1061,20 @@ struct UnnamedBitfieldMultiByte {
// LINUX-NEXT: store i8 [[TMP6]], ptr [[TMP4]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @testUnnamedBitfieldMultiByte(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], 15
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = and i8 [[TMP5]], -16
-// WINDOWS-NEXT: store i8 [[TMP6]], ptr [[TMP4]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @testUnnamedBitfieldMultiByte(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 2
+// WINDOWS-NEXT: %3 = and i8 %2, 15
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 2
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: %5 = load i8, ptr %4, align 1
+// WINDOWS-NEXT: %6 = and i8 %5, -16
+// WINDOWS-NEXT: store i8 %6, ptr %4, align 1
+// WINDOWS-NEXT: ret void
//
void testUnnamedBitfieldMultiByte(struct UnnamedBitfieldMultiByte *s) {
// 2 bytes: a[0-3], unnamed[4-11], b[12-15]
diff --git a/clang/test/CodeGenCXX/builtin-clear-padding-codegen.cpp b/clang/test/CodeGenCXX/builtin-clear-padding-codegen.cpp
index 21b7c9a94e847..4500e74576561 100644
--- a/clang/test/CodeGenCXX/builtin-clear-padding-codegen.cpp
+++ b/clang/test/CodeGenCXX/builtin-clear-padding-codegen.cpp
@@ -1,6 +1,6 @@
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
// RUN: %clang_cc1 -std=c++20 -triple=x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s --check-prefix=LINUX
-// RUN: %clang_cc1 -std=c++20 -triple=x86_64-windows-gnu -emit-llvm -o - %s | FileCheck %s --check-prefix=WINDOWS
+// RUN: %clang_cc1 -std=c++20 -triple=x86_64-pc-windows-msvc -emit-llvm -o - %s | FileCheck %s --check-prefix=WINDOWS
struct Empty {};
@@ -15,15 +15,14 @@ struct Empty {};
// LINUX-NEXT: store i8 0, ptr [[TMP1]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z9testEmptyP5Empty(
-// WINDOWS-SAME: ptr noundef [[E:%.*]]) #[[ATTR0:[0-9]+]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[E_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[E]], ptr [[E_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testEmpty@@YAXPEAUEmpty@@@Z"(ptr noundef %e) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %e.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %e, ptr %e.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %e.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: ret void
//
void testEmpty(Empty *e) {
// This should clear the one byte that Empty occupies.
@@ -39,13 +38,12 @@ void testEmpty(Empty *e) {
// LINUX-NEXT: [[TMP0:%.*]] = load ptr, ptr [[I_ADDR]], align 8
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z22testPrimitiveNoPaddingPi(
-// WINDOWS-SAME: ptr noundef [[I:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[I_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[I]], ptr [[I_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[I_ADDR]], align 8
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testPrimitiveNoPadding@@YAXPEAH at Z"(ptr noundef %i) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %i.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %i, ptr %i.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %i.addr, align 8
+// WINDOWS-NEXT: ret void
//
void testPrimitiveNoPadding(int *i) {
// This should not clear any padding, since int has no padding.
@@ -73,25 +71,12 @@ void testPrimitiveNoPadding(int *i) {
// LINUX-NEXT: store i8 0, ptr [[TMP6]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z23testPrimitiveLongDoublePe(
-// WINDOWS-SAME: ptr noundef [[LD:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[LD_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[LD]], ptr [[LD_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[LD_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 10
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 11
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 12
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 4
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testPrimitiveLongDouble@@YAXPEAO at Z"(ptr noundef %ld) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %ld.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %ld, ptr %ld.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %ld.addr, align 8
+// WINDOWS-NEXT: ret void
//
void testPrimitiveLongDouble(long double *ld) {
// padding [10, 15] on x86
@@ -116,23 +101,22 @@ void testPrimitiveLongDouble(long double *ld) {
// LINUX-NEXT: store i8 0, ptr [[TMP6]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z10testBitIntPDB97_(
-// WINDOWS-SAME: ptr noundef [[BI:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[BI_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[BI]], ptr [[BI_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BI_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 12
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 4
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], 1
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 4
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testBitInt@@YAXPEAU?$_BitInt@$0GB@@__clang@@@Z"(ptr noundef %bi) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %bi.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %bi, ptr %bi.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %bi.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 12
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 4
+// WINDOWS-NEXT: %3 = and i8 %2, 1
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 4
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 13
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 14
+// WINDOWS-NEXT: store i8 0, ptr %5, align 2
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 15
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: ret void
//
void testBitInt(_BitInt(97) *bi) {
// Storage is widened to 128 bits; clear bits [97, 128).
@@ -172,37 +156,12 @@ void testBitInt(_BitInt(97) *bi) {
// LINUX-NEXT: store i8 0, ptr [[TMP12]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z30testPrimitiveComplexLongDoublePCe(
-// WINDOWS-SAME: ptr noundef [[C:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 10
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 11
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 12
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 4
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 26
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 2
-// WINDOWS-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[TMP0]], i32 27
-// WINDOWS-NEXT: store i8 0, ptr [[TMP8]], align 1
-// WINDOWS-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP0]], i32 28
-// WINDOWS-NEXT: store i8 0, ptr [[TMP9]], align 4
-// WINDOWS-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[TMP0]], i32 29
-// WINDOWS-NEXT: store i8 0, ptr [[TMP10]], align 1
-// WINDOWS-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[TMP0]], i32 30
-// WINDOWS-NEXT: store i8 0, ptr [[TMP11]], align 2
-// WINDOWS-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[TMP0]], i32 31
-// WINDOWS-NEXT: store i8 0, ptr [[TMP12]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testPrimitiveComplexLongDouble@@YAXPEAU?$_Complex at O@__clang@@@Z"(ptr noundef %c) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %c.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %c, ptr %c.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %c.addr, align 8
+// WINDOWS-NEXT: ret void
//
void testPrimitiveComplexLongDouble(_Complex long double *c) {
// padding [10, 15] and [26, 31] on x86
@@ -222,13 +181,12 @@ union U1 {
// LINUX-NEXT: [[TMP0:%.*]] = load ptr, ptr [[U_ADDR]], align 8
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z24testUnionDifferentLengthP2U1(
-// WINDOWS-SAME: ptr noundef [[U:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[U_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[U]], ptr [[U_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[U_ADDR]], align 8
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testUnionDifferentLength@@YAXPEATU1@@@Z"(ptr noundef %u) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %u.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %u, ptr %u.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %u.addr, align 8
+// WINDOWS-NEXT: ret void
//
void testUnionDifferentLength(U1 *u) {
// This should not clear the object representation bits of the non-active member.
@@ -267,27 +225,26 @@ union U2 {
// LINUX-NEXT: store i8 0, ptr [[TMP7]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z35testUnionTailPaddingOfLongestMemberP2U2(
-// WINDOWS-SAME: ptr noundef [[U:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[U_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[U]], ptr [[U_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[U_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 2
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 2
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 4
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 4
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 2
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testUnionTailPaddingOfLongestMember@@YAXPEATU2@@@Z"(ptr noundef %u) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %u.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %u, ptr %u.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %u.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 2
+// WINDOWS-NEXT: store i8 0, ptr %2, align 2
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 4
+// WINDOWS-NEXT: store i8 0, ptr %4, align 4
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %6, align 2
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %7, align 1
+// WINDOWS-NEXT: ret void
//
void testUnionTailPaddingOfLongestMember(U2 *u) {
// This should clear the tail padding of the longest member.
@@ -339,27 +296,26 @@ struct alignas(4) Baz : Foo {
// LINUX-NEXT: store i8 0, ptr [[TMP7]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z33testStructPaddingInBetweenMembersP3Baz(
-// WINDOWS-SAME: ptr noundef [[BAZ:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[BAZ_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[BAZ]], ptr [[BAZ_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BAZ_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 2
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 9
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 11
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testStructPaddingInBetweenMembers@@YAXPEAUBaz@@@Z"(ptr noundef %baz) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %baz.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %baz, ptr %baz.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %baz.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %4, align 2
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 9
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %0, i32 11
+// WINDOWS-NEXT: store i8 0, ptr %7, align 1
+// WINDOWS-NEXT: ret void
//
void testStructPaddingInBetweenMembers(Baz *baz) {
// this should clear all the padding in between various members
@@ -388,27 +344,26 @@ void testStructPaddingInBetweenMembers(Baz *baz) {
// LINUX-NEXT: store i8 0, ptr [[TMP7]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z18testStructVolatilePV3Baz(
-// WINDOWS-SAME: ptr noundef [[BAZ:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[BAZ_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[BAZ]], ptr [[BAZ_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BAZ_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 2
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 9
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 11
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testStructVolatile@@YAXPECUBaz@@@Z"(ptr noundef %baz) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %baz.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %baz, ptr %baz.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %baz.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %4, align 2
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 9
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %0, i32 11
+// WINDOWS-NEXT: store i8 0, ptr %7, align 1
+// WINDOWS-NEXT: ret void
//
void testStructVolatile(volatile Baz *baz) {
// this should clear all the padding in between various members
@@ -437,17 +392,24 @@ class S2 {
// LINUX-NEXT: store i8 0, ptr [[TMP2]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z19testNoUniqueAddressP2S2(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testNoUniqueAddress@@YAXPEAVS2@@@Z"(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %2, align 2
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 9
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 10
+// WINDOWS-NEXT: store i8 0, ptr %5, align 2
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 11
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: ret void
//
void testNoUniqueAddress(S2 *s) {
// "x [0-3]", "c" , "b", PAD [6-7]
@@ -509,55 +471,26 @@ struct S3 {
// LINUX-NEXT: store i8 0, ptr [[TMP21]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z24testStructWithLongDoubleP2S3(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 10
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 11
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 12
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 4
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 17
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 1
-// WINDOWS-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[TMP0]], i32 18
-// WINDOWS-NEXT: store i8 0, ptr [[TMP8]], align 2
-// WINDOWS-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP0]], i32 19
-// WINDOWS-NEXT: store i8 0, ptr [[TMP9]], align 1
-// WINDOWS-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[TMP0]], i32 20
-// WINDOWS-NEXT: store i8 0, ptr [[TMP10]], align 4
-// WINDOWS-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[TMP0]], i32 21
-// WINDOWS-NEXT: store i8 0, ptr [[TMP11]], align 1
-// WINDOWS-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[TMP0]], i32 22
-// WINDOWS-NEXT: store i8 0, ptr [[TMP12]], align 2
-// WINDOWS-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[TMP0]], i32 23
-// WINDOWS-NEXT: store i8 0, ptr [[TMP13]], align 1
-// WINDOWS-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP0]], i32 24
-// WINDOWS-NEXT: store i8 0, ptr [[TMP14]], align 8
-// WINDOWS-NEXT: [[TMP15:%.*]] = getelementptr i8, ptr [[TMP0]], i32 25
-// WINDOWS-NEXT: store i8 0, ptr [[TMP15]], align 1
-// WINDOWS-NEXT: [[TMP16:%.*]] = getelementptr i8, ptr [[TMP0]], i32 26
-// WINDOWS-NEXT: store i8 0, ptr [[TMP16]], align 2
-// WINDOWS-NEXT: [[TMP17:%.*]] = getelementptr i8, ptr [[TMP0]], i32 27
-// WINDOWS-NEXT: store i8 0, ptr [[TMP17]], align 1
-// WINDOWS-NEXT: [[TMP18:%.*]] = getelementptr i8, ptr [[TMP0]], i32 28
-// WINDOWS-NEXT: store i8 0, ptr [[TMP18]], align 4
-// WINDOWS-NEXT: [[TMP19:%.*]] = getelementptr i8, ptr [[TMP0]], i32 29
-// WINDOWS-NEXT: store i8 0, ptr [[TMP19]], align 1
-// WINDOWS-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[TMP0]], i32 30
-// WINDOWS-NEXT: store i8 0, ptr [[TMP20]], align 2
-// WINDOWS-NEXT: [[TMP21:%.*]] = getelementptr i8, ptr [[TMP0]], i32 31
-// WINDOWS-NEXT: store i8 0, ptr [[TMP21]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testStructWithLongDouble@@YAXPEAUS3@@@Z"(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 9
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 10
+// WINDOWS-NEXT: store i8 0, ptr %2, align 2
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 11
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 12
+// WINDOWS-NEXT: store i8 0, ptr %4, align 4
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 13
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 14
+// WINDOWS-NEXT: store i8 0, ptr %6, align 2
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %0, i32 15
+// WINDOWS-NEXT: store i8 0, ptr %7, align 1
+// WINDOWS-NEXT: ret void
//
void testStructWithLongDouble(S3 *s) {
// "long double data[0-9]", PAD [10-15], "b", PAD [17-31]
@@ -585,19 +518,18 @@ struct S4 : Empty, B {
// LINUX-NEXT: store i8 0, ptr [[TMP3]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z23testStructWithEmptyBaseP2S4(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 2
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testStructWithEmptyBase@@YAXPEAUS4@@@Z"(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %2, align 2
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: ret void
//
void testStructWithEmptyBase(S4 *s) {
// "i" [0-3], "b" [4], PAD [5-7]
@@ -633,25 +565,24 @@ struct S5 : B1, B2 {
// LINUX-NEXT: store i8 0, ptr [[TMP6]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z23testPaddingBetweenBasesP2S5(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 2
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 2
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testPaddingBetweenBases@@YAXPEAUS5@@@Z"(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 2
+// WINDOWS-NEXT: store i8 0, ptr %2, align 2
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %5, align 2
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: ret void
//
void testPaddingBetweenBases(S5 *s) {
// "c1" [0], PAD [1-3] , "c2" [4], PAD [5-7]
@@ -688,23 +619,22 @@ struct S6 : B3, B4 {
// LINUX-NEXT: store i8 0, ptr [[TMP5]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z24testPaddingAfterLastBaseP2S6(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 2
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 2
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testPaddingAfterLastBase@@YAXPEAUS6@@@Z"(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 2
+// WINDOWS-NEXT: store i8 0, ptr %1, align 2
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %4, align 2
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: ret void
//
void testPaddingAfterLastBase(S6 *s) {
// "c1"[0], "c2"[1], PAD [2-3], "c3" [4], PAD [5-7]
@@ -738,16 +668,32 @@ struct S7 : VirtualBase, NonVirtualBase {
// LINUX-NEXT: store i8 0, ptr [[TMP1]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z10testVtable2S7(
-// WINDOWS-SAME: ptr noundef align 8 [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_INDIRECT_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[S]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP0]], align 2
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[S]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testVtable@@YAXUS7@@@Z"(ptr noundef align 8 dead_on_return %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.indirect_addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.indirect_addr, align 8
+// WINDOWS-NEXT: %0 = getelementptr i8, ptr %s, i32 12
+// WINDOWS-NEXT: store i8 0, ptr %0, align 4
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %s, i32 13
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %s, i32 14
+// WINDOWS-NEXT: store i8 0, ptr %2, align 2
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %s, i32 15
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %s, i32 18
+// WINDOWS-NEXT: store i8 0, ptr %4, align 2
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %s, i32 19
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %s, i32 20
+// WINDOWS-NEXT: store i8 0, ptr %6, align 4
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %s, i32 21
+// WINDOWS-NEXT: store i8 0, ptr %7, align 1
+// WINDOWS-NEXT: %8 = getelementptr i8, ptr %s, i32 22
+// WINDOWS-NEXT: store i8 0, ptr %8, align 2
+// WINDOWS-NEXT: %9 = getelementptr i8, ptr %s, i32 23
+// WINDOWS-NEXT: store i8 0, ptr %9, align 1
+// WINDOWS-NEXT: call void @"??1S7@@UEAA at XZ"(ptr noundef nonnull align 8 dead_on_return(24) dereferenceable(24) %s) #1
+// WINDOWS-NEXT: ret void
//
void testVtable(S7 s) {
// "vtable ptr" [0-7], "x" [8-11], "y" [12], "z" [13], PAD [14-15]
@@ -807,32 +753,48 @@ struct S8 : VirtualBase1, VirtualBase2, NonVirtualBase1, VirtualBase3 {
// LINUX-NEXT: store i8 0, ptr [[TMP9]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z23testMultipleBasesVtable2S8(
-// WINDOWS-SAME: ptr noundef align 8 [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_INDIRECT_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[S]], i32 12
-// WINDOWS-NEXT: store i8 0, ptr [[TMP0]], align 4
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[S]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[S]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 2
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[S]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[S]], i32 29
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[S]], i32 30
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[S]], i32 31
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[S]], i32 45
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 1
-// WINDOWS-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[S]], i32 46
-// WINDOWS-NEXT: store i8 0, ptr [[TMP8]], align 2
-// WINDOWS-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[S]], i32 47
-// WINDOWS-NEXT: store i8 0, ptr [[TMP9]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testMultipleBasesVtable@@YAXUS8@@@Z"(ptr noundef align 8 dead_on_return %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.indirect_addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.indirect_addr, align 8
+// WINDOWS-NEXT: %0 = getelementptr i8, ptr %s, i32 12
+// WINDOWS-NEXT: store i8 0, ptr %0, align 4
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %s, i32 13
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %s, i32 14
+// WINDOWS-NEXT: store i8 0, ptr %2, align 2
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %s, i32 15
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %s, i32 28
+// WINDOWS-NEXT: store i8 0, ptr %4, align 4
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %s, i32 29
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %s, i32 30
+// WINDOWS-NEXT: store i8 0, ptr %6, align 2
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %s, i32 31
+// WINDOWS-NEXT: store i8 0, ptr %7, align 1
+// WINDOWS-NEXT: %8 = getelementptr i8, ptr %s, i32 44
+// WINDOWS-NEXT: store i8 0, ptr %8, align 4
+// WINDOWS-NEXT: %9 = getelementptr i8, ptr %s, i32 45
+// WINDOWS-NEXT: store i8 0, ptr %9, align 1
+// WINDOWS-NEXT: %10 = getelementptr i8, ptr %s, i32 46
+// WINDOWS-NEXT: store i8 0, ptr %10, align 2
+// WINDOWS-NEXT: %11 = getelementptr i8, ptr %s, i32 47
+// WINDOWS-NEXT: store i8 0, ptr %11, align 1
+// WINDOWS-NEXT: %12 = getelementptr i8, ptr %s, i32 50
+// WINDOWS-NEXT: store i8 0, ptr %12, align 2
+// WINDOWS-NEXT: %13 = getelementptr i8, ptr %s, i32 51
+// WINDOWS-NEXT: store i8 0, ptr %13, align 1
+// WINDOWS-NEXT: %14 = getelementptr i8, ptr %s, i32 52
+// WINDOWS-NEXT: store i8 0, ptr %14, align 4
+// WINDOWS-NEXT: %15 = getelementptr i8, ptr %s, i32 53
+// WINDOWS-NEXT: store i8 0, ptr %15, align 1
+// WINDOWS-NEXT: %16 = getelementptr i8, ptr %s, i32 54
+// WINDOWS-NEXT: store i8 0, ptr %16, align 2
+// WINDOWS-NEXT: %17 = getelementptr i8, ptr %s, i32 55
+// WINDOWS-NEXT: store i8 0, ptr %17, align 1
+// WINDOWS-NEXT: call void @"??1S8@@UEAA at XZ"(ptr noundef nonnull align 8 dead_on_return(56) dereferenceable(56) %s) #1
+// WINDOWS-NEXT: ret void
//
void testMultipleBasesVtable(S8 s) {
// "vtable ptr" [0-7], "x1" [8-11], PAD "[12-15]",
@@ -878,16 +840,48 @@ struct S9 : NonVirtualBase2, VirtualChain3 {
// LINUX-NEXT: store i8 0, ptr [[TMP1]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z16testVirtualChain2S9(
-// WINDOWS-SAME: ptr noundef align 8 [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_INDIRECT_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[S]], i32 22
-// WINDOWS-NEXT: store i8 0, ptr [[TMP0]], align 2
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[S]], i32 23
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testVirtualChain@@YAXUS9@@@Z"(ptr noundef align 8 dead_on_return %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.indirect_addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.indirect_addr, align 8
+// WINDOWS-NEXT: %0 = getelementptr i8, ptr %s, i32 12
+// WINDOWS-NEXT: store i8 0, ptr %0, align 4
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %s, i32 13
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %s, i32 14
+// WINDOWS-NEXT: store i8 0, ptr %2, align 2
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %s, i32 15
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %s, i32 20
+// WINDOWS-NEXT: store i8 0, ptr %4, align 4
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %s, i32 21
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %s, i32 22
+// WINDOWS-NEXT: store i8 0, ptr %6, align 2
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %s, i32 23
+// WINDOWS-NEXT: store i8 0, ptr %7, align 1
+// WINDOWS-NEXT: %8 = getelementptr i8, ptr %s, i32 28
+// WINDOWS-NEXT: store i8 0, ptr %8, align 4
+// WINDOWS-NEXT: %9 = getelementptr i8, ptr %s, i32 29
+// WINDOWS-NEXT: store i8 0, ptr %9, align 1
+// WINDOWS-NEXT: %10 = getelementptr i8, ptr %s, i32 30
+// WINDOWS-NEXT: store i8 0, ptr %10, align 2
+// WINDOWS-NEXT: %11 = getelementptr i8, ptr %s, i32 31
+// WINDOWS-NEXT: store i8 0, ptr %11, align 1
+// WINDOWS-NEXT: %12 = getelementptr i8, ptr %s, i32 34
+// WINDOWS-NEXT: store i8 0, ptr %12, align 2
+// WINDOWS-NEXT: %13 = getelementptr i8, ptr %s, i32 35
+// WINDOWS-NEXT: store i8 0, ptr %13, align 1
+// WINDOWS-NEXT: %14 = getelementptr i8, ptr %s, i32 36
+// WINDOWS-NEXT: store i8 0, ptr %14, align 4
+// WINDOWS-NEXT: %15 = getelementptr i8, ptr %s, i32 37
+// WINDOWS-NEXT: store i8 0, ptr %15, align 1
+// WINDOWS-NEXT: %16 = getelementptr i8, ptr %s, i32 38
+// WINDOWS-NEXT: store i8 0, ptr %16, align 2
+// WINDOWS-NEXT: %17 = getelementptr i8, ptr %s, i32 39
+// WINDOWS-NEXT: store i8 0, ptr %17, align 1
+// WINDOWS-NEXT: call void @"??1S9@@UEAA at XZ"(ptr noundef nonnull align 8 dead_on_return(40) dereferenceable(40) %s) #1
+// WINDOWS-NEXT: ret void
//
void testVirtualChain(S9 s) {
// This should clear the padding after the bool z.
@@ -940,30 +934,45 @@ struct S10 : D1, D2 {
// LINUX-NEXT: store i8 0, ptr [[TMP8]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z22testVirtualInheritance3S10(
-// WINDOWS-SAME: ptr noundef align 8 dead_on_return [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_INDIRECT_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[S]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP0]], align 1
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[S]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[S]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[S]], i32 30
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 2
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[S]], i32 31
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[S]], i32 36
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 4
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[S]], i32 37
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[S]], i32 38
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 2
-// WINDOWS-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[S]], i32 39
-// WINDOWS-NEXT: store i8 0, ptr [[TMP8]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testVirtualInheritance@@YAXUS10@@@Z"(ptr noundef align 8 dead_on_return %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.indirect_addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.indirect_addr, align 8
+// WINDOWS-NEXT: %0 = getelementptr i8, ptr %s, i32 13
+// WINDOWS-NEXT: store i8 0, ptr %0, align 1
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %s, i32 14
+// WINDOWS-NEXT: store i8 0, ptr %1, align 2
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %s, i32 15
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %s, i32 29
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %s, i32 30
+// WINDOWS-NEXT: store i8 0, ptr %4, align 2
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %s, i32 31
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %s, i32 33
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %s, i32 34
+// WINDOWS-NEXT: store i8 0, ptr %7, align 2
+// WINDOWS-NEXT: %8 = getelementptr i8, ptr %s, i32 35
+// WINDOWS-NEXT: store i8 0, ptr %8, align 1
+// WINDOWS-NEXT: %9 = getelementptr i8, ptr %s, i32 36
+// WINDOWS-NEXT: store i8 0, ptr %9, align 4
+// WINDOWS-NEXT: %10 = getelementptr i8, ptr %s, i32 37
+// WINDOWS-NEXT: store i8 0, ptr %10, align 1
+// WINDOWS-NEXT: %11 = getelementptr i8, ptr %s, i32 38
+// WINDOWS-NEXT: store i8 0, ptr %11, align 2
+// WINDOWS-NEXT: %12 = getelementptr i8, ptr %s, i32 39
+// WINDOWS-NEXT: store i8 0, ptr %12, align 1
+// WINDOWS-NEXT: %13 = getelementptr i8, ptr %s, i32 44
+// WINDOWS-NEXT: store i8 0, ptr %13, align 4
+// WINDOWS-NEXT: %14 = getelementptr i8, ptr %s, i32 45
+// WINDOWS-NEXT: store i8 0, ptr %14, align 1
+// WINDOWS-NEXT: %15 = getelementptr i8, ptr %s, i32 46
+// WINDOWS-NEXT: store i8 0, ptr %15, align 2
+// WINDOWS-NEXT: %16 = getelementptr i8, ptr %s, i32 47
+// WINDOWS-NEXT: store i8 0, ptr %16, align 1
+// WINDOWS-NEXT: ret void
//
void testVirtualInheritance(S10 s) {
// note derived member placed before the virtual base
@@ -973,6 +982,58 @@ void testVirtualInheritance(S10 s) {
__builtin_clear_padding(&s);
}
+struct S10_2 : virtual Base {
+ int d1;
+ bool b;
+ virtual ~S10_2() = default;
+};
+
+// LINUX-LABEL: define dso_local void @_Z40testVirtualInheritanceAndVirtualFunction5S10_2(
+// LINUX-SAME: ptr noundef align 8 [[S:%.*]]) #[[ATTR0]] {
+// LINUX-NEXT: [[ENTRY:.*:]]
+// LINUX-NEXT: [[S_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
+// LINUX-NEXT: store ptr [[S]], ptr [[S_INDIRECT_ADDR]], align 8
+// LINUX-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[S]], i32 13
+// LINUX-NEXT: store i8 0, ptr [[TMP0]], align 1
+// LINUX-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[S]], i32 14
+// LINUX-NEXT: store i8 0, ptr [[TMP1]], align 2
+// LINUX-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[S]], i32 15
+// LINUX-NEXT: store i8 0, ptr [[TMP2]], align 1
+// LINUX-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[S]], i32 20
+// LINUX-NEXT: store i8 0, ptr [[TMP3]], align 4
+// LINUX-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[S]], i32 21
+// LINUX-NEXT: store i8 0, ptr [[TMP4]], align 1
+// LINUX-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[S]], i32 22
+// LINUX-NEXT: store i8 0, ptr [[TMP5]], align 2
+// LINUX-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[S]], i32 23
+// LINUX-NEXT: store i8 0, ptr [[TMP6]], align 1
+// LINUX-NEXT: ret void
+//
+// WINDOWS-LABEL: define dso_local void @"?testVirtualInheritanceAndVirtualFunction@@YAXUS10_2@@@Z"(ptr noundef align 8 dead_on_return %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.indirect_addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.indirect_addr, align 8
+// WINDOWS-NEXT: %0 = getelementptr i8, ptr %s, i32 21
+// WINDOWS-NEXT: store i8 0, ptr %0, align 1
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %s, i32 22
+// WINDOWS-NEXT: store i8 0, ptr %1, align 2
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %s, i32 23
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %s, i32 28
+// WINDOWS-NEXT: store i8 0, ptr %3, align 4
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %s, i32 29
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %s, i32 30
+// WINDOWS-NEXT: store i8 0, ptr %5, align 2
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %s, i32 31
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: call void @"??_DS10_2@@QEAAXXZ"(ptr noundef nonnull align 8 dereferenceable(24) %s) #1
+// WINDOWS-NEXT: ret void
+//
+void testVirtualInheritanceAndVirtualFunction(S10_2 s) {
+ __builtin_clear_padding(&s);
+}
+
struct S11 {
// will usually occupy 2 bytes:
unsigned char b1 : 3; // 1st 3 bits (in 1st byte) are b1
@@ -993,17 +1054,16 @@ struct S11 {
// LINUX-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z13testBitFieldsP3S11(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], 31
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testBitFields@@YAXPEAUS11@@@Z"(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 1
+// WINDOWS-NEXT: %3 = and i8 %2, 31
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 1
+// WINDOWS-NEXT: ret void
//
void testBitFields(S11 *s) {
// "b1" [0-2], "b2" [3-4], PAD [5-7], "b3" [8-13], "b4" [14-15]
@@ -1018,11 +1078,10 @@ void testBitFields(S11 *s) {
// LINUX-NEXT: [[I:%.*]] = alloca [4 x i32], align 16
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z18testArrayNoPaddingv(
-// WINDOWS-SAME: ) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[I:%.*]] = alloca [4 x i32], align 16
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testArrayNoPadding@@YAXXZ"() #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %i = alloca [4 x i32], align 4
+// WINDOWS-NEXT: ret void
//
void testArrayNoPadding() {
int i[4];
@@ -1060,35 +1119,10 @@ void testArrayNoPadding() {
// LINUX-NEXT: store i8 0, ptr [[TMP11]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z19testArrayLongDoublev(
-// WINDOWS-SAME: ) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[LD:%.*]] = alloca [2 x x86_fp80], align 16
-// WINDOWS-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[LD]], i32 10
-// WINDOWS-NEXT: store i8 0, ptr [[TMP0]], align 2
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[LD]], i32 11
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[LD]], i32 12
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 4
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[LD]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[LD]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 2
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[LD]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[LD]], i32 26
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 2
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[LD]], i32 27
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 1
-// WINDOWS-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[LD]], i32 28
-// WINDOWS-NEXT: store i8 0, ptr [[TMP8]], align 4
-// WINDOWS-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[LD]], i32 29
-// WINDOWS-NEXT: store i8 0, ptr [[TMP9]], align 1
-// WINDOWS-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[LD]], i32 30
-// WINDOWS-NEXT: store i8 0, ptr [[TMP10]], align 2
-// WINDOWS-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[LD]], i32 31
-// WINDOWS-NEXT: store i8 0, ptr [[TMP11]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testArrayLongDouble@@YAXXZ"() #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %ld = alloca [2 x double], align 8
+// WINDOWS-NEXT: ret void
//
void testArrayLongDouble() {
// long double 0, [0-9] PAD [10-15]
@@ -1127,35 +1161,34 @@ void testArrayLongDouble() {
// LINUX-NEXT: store i8 0, ptr [[TMP11]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z17testArrayOfStructv(
-// WINDOWS-SAME: ) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S:%.*]] = alloca [2 x [[STRUCT_S_0:%.*]]], align 16
-// WINDOWS-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[S]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP0]], align 1
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[S]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[S]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[S]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[S]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 2
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[S]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[S]], i32 21
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[S]], i32 22
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 2
-// WINDOWS-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[S]], i32 23
-// WINDOWS-NEXT: store i8 0, ptr [[TMP8]], align 1
-// WINDOWS-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[S]], i32 29
-// WINDOWS-NEXT: store i8 0, ptr [[TMP9]], align 1
-// WINDOWS-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[S]], i32 30
-// WINDOWS-NEXT: store i8 0, ptr [[TMP10]], align 2
-// WINDOWS-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[S]], i32 31
-// WINDOWS-NEXT: store i8 0, ptr [[TMP11]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testArrayOfStruct@@YAXXZ"() #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s = alloca [2 x %struct.S.0], align 4
+// WINDOWS-NEXT: %0 = getelementptr i8, ptr %s, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %0, align 1
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %s, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %1, align 2
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %s, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %s, i32 13
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %s, i32 14
+// WINDOWS-NEXT: store i8 0, ptr %4, align 2
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %s, i32 15
+// WINDOWS-NEXT: store i8 0, ptr %5, align 1
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %s, i32 21
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %s, i32 22
+// WINDOWS-NEXT: store i8 0, ptr %7, align 2
+// WINDOWS-NEXT: %8 = getelementptr i8, ptr %s, i32 23
+// WINDOWS-NEXT: store i8 0, ptr %8, align 1
+// WINDOWS-NEXT: %9 = getelementptr i8, ptr %s, i32 29
+// WINDOWS-NEXT: store i8 0, ptr %9, align 1
+// WINDOWS-NEXT: %10 = getelementptr i8, ptr %s, i32 30
+// WINDOWS-NEXT: store i8 0, ptr %10, align 2
+// WINDOWS-NEXT: %11 = getelementptr i8, ptr %s, i32 31
+// WINDOWS-NEXT: store i8 0, ptr %11, align 1
+// WINDOWS-NEXT: ret void
//
void testArrayOfStruct() {
struct S {
@@ -1198,21 +1231,20 @@ struct ArrOfStructsWithPadding {
// LINUX-NEXT: store i8 0, ptr [[TMP4]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z27testArrOfStructsWithPaddingP23ArrOfStructsWithPadding(
-// WINDOWS-SAME: ptr noundef [[ARR:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[ARR_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[ARR]], ptr [[ARR_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[ARR_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testArrOfStructsWithPadding@@YAXPEAUArrOfStructsWithPadding@@@Z"(ptr noundef %arr) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %arr.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %arr, ptr %arr.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %arr.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: ret void
//
void testArrOfStructsWithPadding(ArrOfStructsWithPadding *arr) {
__builtin_clear_padding(arr);
@@ -1238,19 +1270,18 @@ struct S12 {
// LINUX-NEXT: store i8 0, ptr [[TMP3]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z18testTemplateStructP3S12IiE(
-// WINDOWS-SAME: ptr noundef [[S12:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S12_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S12]], ptr [[S12_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S12_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 2
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testTemplateStruct@@YAXPEAU?$S12 at H@@@Z"(ptr noundef %s12) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s12.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s12, ptr %s12.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s12.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %2, align 2
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %3, align 1
+// WINDOWS-NEXT: ret void
//
void testTemplateStruct(S12<int>* s12) {
__builtin_clear_padding(s12);
@@ -1268,17 +1299,16 @@ void testTemplateStruct(S12<int>* s12) {
// LINUX-NEXT: store i8 0, ptr [[TMP2]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z10testAtomicPU7_Atomic3Bar(
-// WINDOWS-SAME: ptr noundef [[BAR:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[BAR_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[BAR]], ptr [[BAR_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BAR_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testAtomic@@YAXPEAU?$_Atomic at UBar@@@__clang@@@Z"(ptr noundef %bar) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %bar.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %bar, ptr %bar.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %bar.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %1, align 1
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: ret void
//
void testAtomic(_Atomic(Bar)* bar) {
__builtin_clear_padding(bar);
@@ -1307,18 +1337,18 @@ struct NonTriviallyCopyable {
// LINUX-NEXT: store i8 0, ptr [[TMP2]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z24testNonTriviallyCopyable20NonTriviallyCopyable(
-// WINDOWS-SAME: ptr noundef align 4 [[NTC:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[NTC_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[NTC]], ptr [[NTC_INDIRECT_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[NTC]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP0]], align 1
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[NTC]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[NTC]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testNonTriviallyCopyable@@YAXUNonTriviallyCopyable@@@Z"(ptr noundef align 4 dead_on_return %ntc) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %ntc.indirect_addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %ntc, ptr %ntc.indirect_addr, align 8
+// WINDOWS-NEXT: %0 = getelementptr i8, ptr %ntc, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %0, align 1
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %ntc, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %1, align 2
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %ntc, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: call void @"??1NonTriviallyCopyable@@QEAA at XZ"(ptr noundef nonnull align 4 dead_on_return(8) dereferenceable(8) %ntc) #1
+// WINDOWS-NEXT: ret void
//
void testNonTriviallyCopyable(NonTriviallyCopyable ntc) {
__builtin_clear_padding(&ntc);
@@ -1343,21 +1373,20 @@ typedef long double LongDouble3Vec __attribute__((ext_vector_type(3)));
// LINUX-NEXT: store i8 0, ptr [[TMP4]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z18testAttributedTypePDv3_f(
-// WINDOWS-SAME: ptr noundef [[V:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[V_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[V]], ptr [[V_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[V_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 12
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 4
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 13
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 14
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 2
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 15
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testAttributedType@@YAXPEAT?$__vector at M$02 at __clang@@@Z"(ptr noundef %v) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %v.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %v, ptr %v.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %v.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 12
+// WINDOWS-NEXT: store i8 0, ptr %1, align 4
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 13
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 14
+// WINDOWS-NEXT: store i8 0, ptr %3, align 2
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 15
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: ret void
//
void testAttributedType(Float3Vec* v) {
__builtin_clear_padding(v);
@@ -1439,81 +1468,28 @@ void testAttributedType(Float3Vec* v) {
// LINUX-NEXT: store i8 0, ptr [[TMP34]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z28testAttributedLongDoubleTypePDv3_e(
-// WINDOWS-SAME: ptr noundef [[V:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[V_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[V]], ptr [[V_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[V_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 30
-// WINDOWS-NEXT: store i8 0, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP0]], i32 31
-// WINDOWS-NEXT: store i8 0, ptr [[TMP2]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[TMP0]], i32 32
-// WINDOWS-NEXT: store i8 0, ptr [[TMP3]], align 32
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 33
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 34
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 35
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 36
-// WINDOWS-NEXT: store i8 0, ptr [[TMP7]], align 4
-// WINDOWS-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[TMP0]], i32 37
-// WINDOWS-NEXT: store i8 0, ptr [[TMP8]], align 1
-// WINDOWS-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[TMP0]], i32 38
-// WINDOWS-NEXT: store i8 0, ptr [[TMP9]], align 2
-// WINDOWS-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[TMP0]], i32 39
-// WINDOWS-NEXT: store i8 0, ptr [[TMP10]], align 1
-// WINDOWS-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[TMP0]], i32 40
-// WINDOWS-NEXT: store i8 0, ptr [[TMP11]], align 8
-// WINDOWS-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[TMP0]], i32 41
-// WINDOWS-NEXT: store i8 0, ptr [[TMP12]], align 1
-// WINDOWS-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[TMP0]], i32 42
-// WINDOWS-NEXT: store i8 0, ptr [[TMP13]], align 2
-// WINDOWS-NEXT: [[TMP14:%.*]] = getelementptr i8, ptr [[TMP0]], i32 43
-// WINDOWS-NEXT: store i8 0, ptr [[TMP14]], align 1
-// WINDOWS-NEXT: [[TMP15:%.*]] = getelementptr i8, ptr [[TMP0]], i32 44
-// WINDOWS-NEXT: store i8 0, ptr [[TMP15]], align 4
-// WINDOWS-NEXT: [[TMP16:%.*]] = getelementptr i8, ptr [[TMP0]], i32 45
-// WINDOWS-NEXT: store i8 0, ptr [[TMP16]], align 1
-// WINDOWS-NEXT: [[TMP17:%.*]] = getelementptr i8, ptr [[TMP0]], i32 46
-// WINDOWS-NEXT: store i8 0, ptr [[TMP17]], align 2
-// WINDOWS-NEXT: [[TMP18:%.*]] = getelementptr i8, ptr [[TMP0]], i32 47
-// WINDOWS-NEXT: store i8 0, ptr [[TMP18]], align 1
-// WINDOWS-NEXT: [[TMP19:%.*]] = getelementptr i8, ptr [[TMP0]], i32 48
-// WINDOWS-NEXT: store i8 0, ptr [[TMP19]], align 16
-// WINDOWS-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[TMP0]], i32 49
-// WINDOWS-NEXT: store i8 0, ptr [[TMP20]], align 1
-// WINDOWS-NEXT: [[TMP21:%.*]] = getelementptr i8, ptr [[TMP0]], i32 50
-// WINDOWS-NEXT: store i8 0, ptr [[TMP21]], align 2
-// WINDOWS-NEXT: [[TMP22:%.*]] = getelementptr i8, ptr [[TMP0]], i32 51
-// WINDOWS-NEXT: store i8 0, ptr [[TMP22]], align 1
-// WINDOWS-NEXT: [[TMP23:%.*]] = getelementptr i8, ptr [[TMP0]], i32 52
-// WINDOWS-NEXT: store i8 0, ptr [[TMP23]], align 4
-// WINDOWS-NEXT: [[TMP24:%.*]] = getelementptr i8, ptr [[TMP0]], i32 53
-// WINDOWS-NEXT: store i8 0, ptr [[TMP24]], align 1
-// WINDOWS-NEXT: [[TMP25:%.*]] = getelementptr i8, ptr [[TMP0]], i32 54
-// WINDOWS-NEXT: store i8 0, ptr [[TMP25]], align 2
-// WINDOWS-NEXT: [[TMP26:%.*]] = getelementptr i8, ptr [[TMP0]], i32 55
-// WINDOWS-NEXT: store i8 0, ptr [[TMP26]], align 1
-// WINDOWS-NEXT: [[TMP27:%.*]] = getelementptr i8, ptr [[TMP0]], i32 56
-// WINDOWS-NEXT: store i8 0, ptr [[TMP27]], align 8
-// WINDOWS-NEXT: [[TMP28:%.*]] = getelementptr i8, ptr [[TMP0]], i32 57
-// WINDOWS-NEXT: store i8 0, ptr [[TMP28]], align 1
-// WINDOWS-NEXT: [[TMP29:%.*]] = getelementptr i8, ptr [[TMP0]], i32 58
-// WINDOWS-NEXT: store i8 0, ptr [[TMP29]], align 2
-// WINDOWS-NEXT: [[TMP30:%.*]] = getelementptr i8, ptr [[TMP0]], i32 59
-// WINDOWS-NEXT: store i8 0, ptr [[TMP30]], align 1
-// WINDOWS-NEXT: [[TMP31:%.*]] = getelementptr i8, ptr [[TMP0]], i32 60
-// WINDOWS-NEXT: store i8 0, ptr [[TMP31]], align 4
-// WINDOWS-NEXT: [[TMP32:%.*]] = getelementptr i8, ptr [[TMP0]], i32 61
-// WINDOWS-NEXT: store i8 0, ptr [[TMP32]], align 1
-// WINDOWS-NEXT: [[TMP33:%.*]] = getelementptr i8, ptr [[TMP0]], i32 62
-// WINDOWS-NEXT: store i8 0, ptr [[TMP33]], align 2
-// WINDOWS-NEXT: [[TMP34:%.*]] = getelementptr i8, ptr [[TMP0]], i32 63
-// WINDOWS-NEXT: store i8 0, ptr [[TMP34]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testAttributedLongDoubleType@@YAXPEAT?$__vector at O$02 at __clang@@@Z"(ptr noundef %v) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %v.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %v, ptr %v.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %v.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 24
+// WINDOWS-NEXT: store i8 0, ptr %1, align 8
+// WINDOWS-NEXT: %2 = getelementptr i8, ptr %0, i32 25
+// WINDOWS-NEXT: store i8 0, ptr %2, align 1
+// WINDOWS-NEXT: %3 = getelementptr i8, ptr %0, i32 26
+// WINDOWS-NEXT: store i8 0, ptr %3, align 2
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 27
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 28
+// WINDOWS-NEXT: store i8 0, ptr %5, align 4
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 29
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %0, i32 30
+// WINDOWS-NEXT: store i8 0, ptr %7, align 2
+// WINDOWS-NEXT: %8 = getelementptr i8, ptr %0, i32 31
+// WINDOWS-NEXT: store i8 0, ptr %8, align 1
+// WINDOWS-NEXT: ret void
//
void testAttributedLongDoubleType(LongDouble3Vec *v) {
// long double elements occupy [0-9], [16-25], [32-41] on x86.
@@ -1538,17 +1514,16 @@ struct UnnamedBitfieldSingleBit {
// LINUX-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z28testUnnamedBitfieldSingleBitP24UnnamedBitfieldSingleBit(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], -9
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testUnnamedBitfieldSingleBit@@YAXPEAUUnnamedBitfieldSingleBit@@@Z"(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 1
+// WINDOWS-NEXT: %3 = and i8 %2, -9
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 1
+// WINDOWS-NEXT: ret void
//
void testUnnamedBitfieldSingleBit(struct UnnamedBitfieldSingleBit *s) {
// byte 0: a[bits 0-2], unnamed[bit 3], b[bits 4-7]
@@ -1575,17 +1550,16 @@ struct UnnamedBitfieldMiddle {
// LINUX-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z25testUnnamedBitfieldMiddleP21UnnamedBitfieldMiddle(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], -25
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testUnnamedBitfieldMiddle@@YAXPEAUUnnamedBitfieldMiddle@@@Z"(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 1
+// WINDOWS-NEXT: %3 = and i8 %2, -25
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 1
+// WINDOWS-NEXT: ret void
//
void testUnnamedBitfieldMiddle(struct UnnamedBitfieldMiddle *s) {
// byte 0: a[0-2], unnamed[3-4], b[5-7]
@@ -1616,21 +1590,20 @@ struct UnnamedBitfieldSurrounding {
// LINUX-NEXT: store i8 [[TMP6]], ptr [[TMP4]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z30testUnnamedBitfieldSurroundingP26UnnamedBitfieldSurrounding(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], -4
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 1
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = and i8 [[TMP5]], 63
-// WINDOWS-NEXT: store i8 [[TMP6]], ptr [[TMP4]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testUnnamedBitfieldSurrounding@@YAXPEAUUnnamedBitfieldSurrounding@@@Z"(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 1
+// WINDOWS-NEXT: %3 = and i8 %2, -4
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 1
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %5 = load i8, ptr %4, align 1
+// WINDOWS-NEXT: %6 = and i8 %5, 63
+// WINDOWS-NEXT: store i8 %6, ptr %4, align 1
+// WINDOWS-NEXT: ret void
//
void testUnnamedBitfieldSurrounding(struct UnnamedBitfieldSurrounding *s) {
// byte 0: unnamed[0-1], a[2-5], unnamed[6-7]
@@ -1675,33 +1648,32 @@ struct UnnamedZeroWidthBitfield {
// LINUX-NEXT: store i8 0, ptr [[TMP12]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z28testUnnamedZeroWidthBitfieldP24UnnamedZeroWidthBitfield(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 4
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], 15
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 4
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: store i8 0, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP0]], i32 2
-// WINDOWS-NEXT: store i8 0, ptr [[TMP5]], align 2
-// WINDOWS-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[TMP0]], i32 3
-// WINDOWS-NEXT: store i8 0, ptr [[TMP6]], align 1
-// WINDOWS-NEXT: [[TMP7:%.*]] = getelementptr i8, ptr [[TMP0]], i32 4
-// WINDOWS-NEXT: [[TMP8:%.*]] = load i8, ptr [[TMP7]], align 4
-// WINDOWS-NEXT: [[TMP9:%.*]] = and i8 [[TMP8]], 15
-// WINDOWS-NEXT: store i8 [[TMP9]], ptr [[TMP7]], align 4
-// WINDOWS-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[TMP0]], i32 5
-// WINDOWS-NEXT: store i8 0, ptr [[TMP10]], align 1
-// WINDOWS-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[TMP0]], i32 6
-// WINDOWS-NEXT: store i8 0, ptr [[TMP11]], align 2
-// WINDOWS-NEXT: [[TMP12:%.*]] = getelementptr i8, ptr [[TMP0]], i32 7
-// WINDOWS-NEXT: store i8 0, ptr [[TMP12]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testUnnamedZeroWidthBitfield@@YAXPEAUUnnamedZeroWidthBitfield@@@Z"(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 4
+// WINDOWS-NEXT: %3 = and i8 %2, 15
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 4
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: store i8 0, ptr %4, align 1
+// WINDOWS-NEXT: %5 = getelementptr i8, ptr %0, i32 2
+// WINDOWS-NEXT: store i8 0, ptr %5, align 2
+// WINDOWS-NEXT: %6 = getelementptr i8, ptr %0, i32 3
+// WINDOWS-NEXT: store i8 0, ptr %6, align 1
+// WINDOWS-NEXT: %7 = getelementptr i8, ptr %0, i32 4
+// WINDOWS-NEXT: %8 = load i8, ptr %7, align 4
+// WINDOWS-NEXT: %9 = and i8 %8, 15
+// WINDOWS-NEXT: store i8 %9, ptr %7, align 4
+// WINDOWS-NEXT: %10 = getelementptr i8, ptr %0, i32 5
+// WINDOWS-NEXT: store i8 0, ptr %10, align 1
+// WINDOWS-NEXT: %11 = getelementptr i8, ptr %0, i32 6
+// WINDOWS-NEXT: store i8 0, ptr %11, align 2
+// WINDOWS-NEXT: %12 = getelementptr i8, ptr %0, i32 7
+// WINDOWS-NEXT: store i8 0, ptr %12, align 1
+// WINDOWS-NEXT: ret void
//
void testUnnamedZeroWidthBitfield(struct UnnamedZeroWidthBitfield *s) {
// byte 0: a[0-3], unnamed[4-7]
@@ -1742,21 +1714,20 @@ struct UnnamedBitfieldMultiByte {
// LINUX-NEXT: store i8 [[TMP6]], ptr [[TMP4]], align 1
// LINUX-NEXT: ret void
//
-// WINDOWS-LABEL: define dso_local void @_Z28testUnnamedBitfieldMultiByteP24UnnamedBitfieldMultiByte(
-// WINDOWS-SAME: ptr noundef [[S:%.*]]) #[[ATTR0]] {
-// WINDOWS-NEXT: [[ENTRY:.*:]]
-// WINDOWS-NEXT: [[S_ADDR:%.*]] = alloca ptr, align 8
-// WINDOWS-NEXT: store ptr [[S]], ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ADDR]], align 8
-// WINDOWS-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i32 0
-// WINDOWS-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], 15
-// WINDOWS-NEXT: store i8 [[TMP3]], ptr [[TMP1]], align 2
-// WINDOWS-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[TMP0]], i32 1
-// WINDOWS-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP4]], align 1
-// WINDOWS-NEXT: [[TMP6:%.*]] = and i8 [[TMP5]], -16
-// WINDOWS-NEXT: store i8 [[TMP6]], ptr [[TMP4]], align 1
-// WINDOWS-NEXT: ret void
+// WINDOWS-LABEL: define dso_local void @"?testUnnamedBitfieldMultiByte@@YAXPEAUUnnamedBitfieldMultiByte@@@Z"(ptr noundef %s) #0 {
+// WINDOWS-NEXT: entry:
+// WINDOWS-NEXT: %s.addr = alloca ptr, align 8
+// WINDOWS-NEXT: store ptr %s, ptr %s.addr, align 8
+// WINDOWS-NEXT: %0 = load ptr, ptr %s.addr, align 8
+// WINDOWS-NEXT: %1 = getelementptr i8, ptr %0, i32 0
+// WINDOWS-NEXT: %2 = load i8, ptr %1, align 2
+// WINDOWS-NEXT: %3 = and i8 %2, 15
+// WINDOWS-NEXT: store i8 %3, ptr %1, align 2
+// WINDOWS-NEXT: %4 = getelementptr i8, ptr %0, i32 1
+// WINDOWS-NEXT: %5 = load i8, ptr %4, align 1
+// WINDOWS-NEXT: %6 = and i8 %5, -16
+// WINDOWS-NEXT: store i8 %6, ptr %4, align 1
+// WINDOWS-NEXT: ret void
//
void testUnnamedBitfieldMultiByte(struct UnnamedBitfieldMultiByte *s) {
// 2 bytes: a[0-3], unnamed[4-11], b[12-15]
More information about the cfe-commits
mailing list