1
- // RUN: %clang_cc1 -emit-llvm %s -triple=x86_64-pc-windows-msvc -o - | FileCheck %s
1
+ // RUN: %clang_cc1 -emit-llvm %s -triple=x86_64-pc-windows-msvc -o - | FileCheck --check-prefixes=X64,CHECK %s
2
+ // RUN: %clang_cc1 -emit-llvm %s -triple=i386-pc-windows-msvc -o - | FileCheck --check-prefixes=X86,CHECK %s
2
3
3
4
struct Bird {
4
5
virtual ~Bird ();
5
6
};
6
7
7
8
struct Parrot : public Bird {
8
- // CHECK: @[[ParrotVtable:[0-9]+]] = private unnamed_addr constant { [2 x ptr] } { [2 x ptr] [ptr @"??_R4Parrot@@6B@", ptr @"??_EParrot@@UEAAPEAXI@Z"] }, comdat($"??_7Parrot@@6B@")
9
- // CHECK: @[[Bird:[0-9]+]] = private unnamed_addr constant { [2 x ptr] } { [2 x ptr] [ptr @"??_R4Bird@@6B@", ptr @"??_EBird@@UEAAPEAXI@Z"] }, comdat($"??_7Bird@@6B@")
9
+ // X64: @[[ParrotVtable:[0-9]+]] = private unnamed_addr constant { [2 x ptr] } { [2 x ptr] [ptr @"??_R4Parrot@@6B@", ptr @"??_EParrot@@UEAAPEAXI@Z"] }, comdat($"??_7Parrot@@6B@")
10
+ // X86: @[[ParrotVtable:[0-9]+]] = private unnamed_addr constant { [2 x ptr] } { [2 x ptr] [ptr @"??_R4Parrot@@6B@", ptr @"??_EParrot@@UAEPAXI@Z"] }, comdat($"??_7Parrot@@6B@")
11
+ // X64: @[[Bird:[0-9]+]] = private unnamed_addr constant { [2 x ptr] } { [2 x ptr] [ptr @"??_R4Bird@@6B@", ptr @"??_EBird@@UEAAPEAXI@Z"] }, comdat($"??_7Bird@@6B@")
12
+ // X86: @[[Bird:[0-9]+]] = private unnamed_addr constant { [2 x ptr] } { [2 x ptr] [ptr @"??_R4Bird@@6B@", ptr @"??_EBird@@UAEPAXI@Z"] }, comdat($"??_7Bird@@6B@")
10
13
virtual ~Parrot () {}
11
14
};
12
15
@@ -27,7 +30,8 @@ struct JustAWeirdBird {
27
30
28
31
// Vector deleting dtor for Bird is an alias because no new Bird[] expressions
29
32
// in the TU.
30
- // CHECK: @"??_EBird@@UEAAPEAXI@Z" = weak dso_local unnamed_addr alias ptr (ptr, i32), ptr @"??_GBird@@UEAAPEAXI@Z"
33
+ // X64: @"??_EBird@@UEAAPEAXI@Z" = weak dso_local unnamed_addr alias ptr (ptr, i32), ptr @"??_GBird@@UEAAPEAXI@Z"
34
+ // X86: @"??_EBird@@UAEPAXI@Z" = weak dso_local unnamed_addr alias ptr (ptr, i32), ptr @"??_GBird@@UAEPAXI@Z"
31
35
// No scalar destructor for Parrot.
32
36
// CHECK-NOT: @"??_GParrot"
33
37
// No vector destructor definition for Bird.
@@ -60,27 +64,36 @@ void bar() {
60
64
// CHECK-NEXT: %[[ISNULL:.*]] = icmp eq ptr %[[LPTR]], null
61
65
// CHECK-NEXT: br i1 %[[ISNULL]], label %delete.end, label %delete.notnull
62
66
// CHECK: delete.notnull:
63
- // CHECK-NEXT: %[[COOKIEGEP:.*]] = getelementptr inbounds i8, ptr %[[LPTR]], i64 -8
64
- // CHECK-NEXT: %[[HOWMANY:.*]] = load i64, ptr %[[COOKIEGEP]]
65
- // CHECK-NEXT: %[[ISNOELEM:.*]] = icmp eq i64 %2, 0
67
+ // X64-NEXT: %[[COOKIEGEP:.*]] = getelementptr inbounds i8, ptr %[[LPTR]], i64 -8
68
+ // X86-NEXT: %[[COOKIEGEP:.*]] = getelementptr inbounds i8, ptr %[[LPTR]], i32 -4
69
+ // X64-NEXT: %[[HOWMANY:.*]] = load i64, ptr %[[COOKIEGEP]]
70
+ // X86-NEXT: %[[HOWMANY:.*]] = load i32, ptr %[[COOKIEGEP]]
71
+ // X64-NEXT: %[[ISNOELEM:.*]] = icmp eq i64 %2, 0
72
+ // X86-NEXT: %[[ISNOELEM:.*]] = icmp eq i32 %2, 0
66
73
// CHECK-NEXT: br i1 %[[ISNOELEM]], label %vdtor.nocall, label %vdtor.call
67
74
// CHECK: vdtor.nocall:
68
- // CHECK-NEXT: %[[HOWMANYBYTES:.*]] = mul i64 8, %[[HOWMANY]]
69
- // CHECK-NEXT: %[[ADDCOOKIESIZE:.*]] = add i64 %[[HOWMANYBYTES]], 8
70
- // CHECK-NEXT: call void @"??_V@YAXPEAX_K@Z"(ptr noundef %[[COOKIEGEP]], i64 noundef %[[ADDCOOKIESIZE]])
75
+ // X64-NEXT: %[[HOWMANYBYTES:.*]] = mul i64 8, %[[HOWMANY]]
76
+ // X86-NEXT: %[[HOWMANYBYTES:.*]] = mul i32 4, %[[HOWMANY]]
77
+ // X64-NEXT: %[[ADDCOOKIESIZE:.*]] = add i64 %[[HOWMANYBYTES]], 8
78
+ // X86-NEXT: %[[ADDCOOKIESIZE:.*]] = add i32 %[[HOWMANYBYTES]], 4
79
+ // X64-NEXT: call void @"??_V@YAXPEAX_K@Z"(ptr noundef %[[COOKIEGEP]], i64 noundef %[[ADDCOOKIESIZE]])
80
+ // X86-NEXT: call void @"??_V@YAXPAXI@Z"(ptr noundef %[[COOKIEGEP]], i32 noundef %[[ADDCOOKIESIZE]])
71
81
// CHECK-NEXT: br label %delete.end
72
82
// CHECK: vdtor.call:
73
- // CHECK-NEXT: %[[VTABLE:.*]] = load ptr, ptr %[[LPTR]], align 8
83
+ // CHECK-NEXT: %[[VTABLE:.*]] = load ptr, ptr %[[LPTR]]
74
84
// CHECK-NEXT: %[[FPGEP:.*]] = getelementptr inbounds ptr, ptr %[[VTABLE]], i64 0
75
- // CHECK-NEXT: %[[FPLOAD:.*]] = load ptr, ptr %[[FPGEP]], align 8
76
- // CHECK-NEXT: %[[CALL:.*]] = call noundef ptr %[[FPLOAD]](ptr noundef nonnull align 8 dereferenceable(8) %[[LPTR]], i32 noundef 3)
85
+ // CHECK-NEXT: %[[FPLOAD:.*]] = load ptr, ptr %[[FPGEP]]
86
+ // X64-NEXT: %[[CALL:.*]] = call noundef ptr %[[FPLOAD]](ptr noundef nonnull align 8 dereferenceable(8) %[[LPTR]], i32 noundef 3)
87
+ // X86-NEXT: %[[CALL:.*]] = call x86_thiscallcc noundef ptr %[[FPLOAD]](ptr noundef nonnull align 4 dereferenceable(4) %[[LPTR]], i32 noundef 3)
77
88
// CHECK-NEXT: br label %delete.end
78
89
// CHECK: delete.end:
79
90
// CHECK-NEXT: ret void
80
91
81
92
// Vector dtor definition for Parrot.
82
- // CHECK-LABEL: define weak dso_local noundef ptr @"??_EParrot@@UEAAPEAXI@Z"(
83
- // CHECK-SAME: ptr {{.*}} %[[THIS:.*]], i32 {{.*}} %[[IMPLICIT_PARAM:.*]])
93
+ // X64-LABEL: define weak dso_local noundef ptr @"??_EParrot@@UEAAPEAXI@Z"(
94
+ // X64-SAME: ptr {{.*}} %[[THIS:.*]], i32 {{.*}} %[[IMPLICIT_PARAM:.*]]) unnamed_addr
95
+ // X86-LABEL: define weak dso_local x86_thiscallcc noundef ptr @"??_EParrot@@UAEPAXI@Z"(
96
+ // X86-SAME: ptr noundef nonnull align 4 dereferenceable(4) %[[THIS:.*]], i32 noundef %[[IMPLICIT_PARAM:.*]]) unnamed_addr
84
97
// CHECK: entry:
85
98
// CHECK-NEXT: %[[RET:.*]] = alloca ptr
86
99
// CHECK-NEXT: %[[IPADDR:.*]] = alloca i32
@@ -94,14 +107,19 @@ void bar() {
94
107
// CHECK-NEXT: %[[ISSECONDBITZERO:.*]] = icmp eq i32 %[[SECONDBIT]], 0
95
108
// CHECK-NEXT: br i1 %[[ISSECONDBITZERO:.*]], label %dtor.scalar, label %dtor.vector
96
109
// CHECK: dtor.vector:
97
- // CHECK-NEXT: %[[COOKIEGEP:.*]] = getelementptr inbounds i8, ptr %[[LTHIS]], i64 -8
98
- // CHECK-NEXT: %[[HOWMANY:.*]] = load i64, ptr %[[COOKIEGEP]]
99
- // CHECK-NEXT: %[[END:.*]] = getelementptr inbounds %struct.Parrot, ptr %[[LTHIS]], i64 %[[HOWMANY]]
110
+ // X64-NEXT: %[[COOKIEGEP:.*]] = getelementptr inbounds i8, ptr %[[LTHIS]], i64 -8
111
+ // X86-NEXT: %[[COOKIEGEP:.*]] = getelementptr inbounds i8, ptr %[[LTHIS]], i32 -4
112
+ // X64-NEXT: %[[HOWMANY:.*]] = load i64, ptr %[[COOKIEGEP]]
113
+ // X86-NEXT: %[[HOWMANY:.*]] = load i32, ptr %[[COOKIEGEP]]
114
+ // X64-NEXT: %[[END:.*]] = getelementptr inbounds %struct.Parrot, ptr %[[LTHIS]], i64 %[[HOWMANY]]
115
+ // X86-NEXT: %[[END:.*]] = getelementptr inbounds %struct.Parrot, ptr %[[LTHIS]], i32 %[[HOWMANY]]
100
116
// CHECK-NEXT: br label %arraydestroy.body
101
117
// CHECK: arraydestroy.body:
102
118
// CHECK-NEXT: %[[PASTELEM:.*]] = phi ptr [ %delete.end, %dtor.vector ], [ %arraydestroy.element, %arraydestroy.body ]
103
- // CHECK-NEXT: %[[CURELEM:.*]] = getelementptr inbounds %struct.Parrot, ptr %[[PASTELEM]], i64 -1
104
- // CHECK-NEXT: call void @"??1Parrot@@UEAA@XZ"(ptr noundef nonnull align 8 dereferenceable(8) %[[CURELEM]])
119
+ // X64-NEXT: %[[CURELEM:.*]] = getelementptr inbounds %struct.Parrot, ptr %[[PASTELEM]], i64 -1
120
+ // X86-NEXT: %[[CURELEM:.*]] = getelementptr inbounds %struct.Parrot, ptr %[[PASTELEM]], i32 -1
121
+ // X64-NEXT: call void @"??1Parrot@@UEAA@XZ"(ptr noundef nonnull align 8 dereferenceable(8) %[[CURELEM]])
122
+ // X86-NEXT: call x86_thiscallcc void @"??1Parrot@@UAE@XZ"(ptr noundef nonnull align 4 dereferenceable(4) %[[CURELEM]])
105
123
// CHECK-NEXT: %[[DONE:.*]] = icmp eq ptr %[[CURELEM]], %[[LTHIS]]
106
124
// CHECK-NEXT: br i1 %[[DONE]], label %arraydestroy.done3, label %arraydestroy.body
107
125
// CHECK: arraydestroy.done3:
@@ -111,19 +129,24 @@ void bar() {
111
129
// CHECK-NEXT: %[[ISFIRSTBITZERO:.*]] = icmp eq i32 %[[FIRSTBIT]], 0
112
130
// CHECK-NEXT: br i1 %[[ISFIRSTBITZERO]], label %dtor.continue, label %dtor.call_delete_after_array_destroy
113
131
// CHECK: dtor.call_delete_after_array_destroy:
114
- // CHECK-NEXT: call void @"??3@YAXPEAX_K@Z"(ptr noundef %[[COOKIEGEP]], i64 noundef 8)
132
+ // X64-NEXT: call void @"??3@YAXPEAX_K@Z"(ptr noundef %[[COOKIEGEP]], i64 noundef 8)
133
+ // X86-NEXT: call void @"??3@YAXPAXI@Z"(ptr noundef %[[COOKIEGEP]], i32 noundef 4)
115
134
// CHECK-NEXT: br label %dtor.continue
116
135
// CHECK: dtor.scalar:
117
- // CHECK-NEXT: call void @"??1Parrot@@UEAA@XZ"(ptr noundef nonnull align 8 dereferenceable(8) %[[LTHIS]])
136
+ // X64-NEXT: call void @"??1Parrot@@UEAA@XZ"(ptr noundef nonnull align 8 dereferenceable(8) %[[LTHIS]])
137
+ // X86-NEXT: call x86_thiscallcc void @"??1Parrot@@UAE@XZ"(ptr noundef nonnull align 4 dereferenceable(4) %[[LTHIS]])
118
138
// CHECK-NEXT: %[[FIRSTBIT:.*]] = and i32 %[[LIP]], 1
119
139
// CHECK-NEXT: %[[ISFIRSTBITZERO:.*]] = icmp eq i32 %[[FIRSTBIT]], 0
120
140
// CHECK-NEXT: br i1 %[[ISFIRSTBITZERO]], label %dtor.continue, label %dtor.call_delete
121
141
// CHECK: dtor.call_delete:
122
- // CHECK-NEXT: call void @"??3@YAXPEAX_K@Z"(ptr noundef %[[LTHIS]], i64 noundef 8)
142
+ // X64-NEXT: call void @"??3@YAXPEAX_K@Z"(ptr noundef %[[LTHIS]], i64 noundef 8)
143
+ // X86-NEXT: call void @"??3@YAXPAXI@Z"(ptr noundef %[[LTHIS]], i32 noundef 4)
123
144
// CHECK-NEXT: br label %dtor.continue
124
145
// CHECK: dtor.continue:
125
- // CHECK-NEXT: %[[LOADRET:.*]] = load ptr, ptr %[[RET]], align 8
146
+ // CHECK-NEXT: %[[LOADRET:.*]] = load ptr, ptr %[[RET]]
126
147
// CHECK-NEXT: ret ptr %[[LOADRET]]
127
148
128
- // CHECK: define weak dso_local ptr @"??_EJustAWeirdBird@@UEAAPEAXI@Z"(
129
- // CHECK-SAME: ptr %this, i32 %should_call_delete)
149
+ // X64: define weak dso_local noundef ptr @"??_EJustAWeirdBird@@UEAAPEAXI@Z"(
150
+ // X64-SAME: ptr noundef nonnull align 8 dereferenceable(8) %this, i32 noundef %should_call_delete)
151
+ // X86: define weak dso_local x86_thiscallcc noundef ptr @"??_EJustAWeirdBird@@UAEPAXI@Z"(
152
+ // X86-SAME: ptr noundef nonnull align 4 dereferenceable(4) %this, i32 noundef %should_call_delete) unnamed_addr
0 commit comments