1 // RUN: %clang_cc1 -triple x86_64-gnu-linux -O3 -disable-llvm-passes -I%S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,LIN,NoNewStructPathTBAA 2 // RUN: %clang_cc1 -triple x86_64-gnu-linux -O3 -disable-llvm-passes -I%S -new-struct-path-tbaa -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,LIN,NewStructPathTBAA 3 4 // RUN: %clang_cc1 -triple x86_64-windows-pc -O3 -disable-llvm-passes -I%S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,WIN,NoNewStructPathTBAA 5 // RUN: %clang_cc1 -triple x86_64-windows-pc -O3 -disable-llvm-passes -I%S -new-struct-path-tbaa -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,WIN,NewStructPathTBAA 6 7 #include <typeinfo> 8 9 // Ensure that the layout for these structs is the same as the normal bitfield 10 // layouts. 11 struct BitFieldsByte { 12 _ExtInt(7) A : 3; 13 _ExtInt(7) B : 3; 14 _ExtInt(7) C : 2; 15 }; 16 // CHECK: %struct.BitFieldsByte = type { i8 } 17 18 struct BitFieldsShort { 19 _ExtInt(15) A : 3; 20 _ExtInt(15) B : 3; 21 _ExtInt(15) C : 2; 22 }; 23 // LIN: %struct.BitFieldsShort = type { i8, i8 } 24 // WIN: %struct.BitFieldsShort = type { i16 } 25 26 struct BitFieldsInt { 27 _ExtInt(31) A : 3; 28 _ExtInt(31) B : 3; 29 _ExtInt(31) C : 2; 30 }; 31 // LIN: %struct.BitFieldsInt = type { i8, [3 x i8] } 32 // WIN: %struct.BitFieldsInt = type { i32 } 33 34 struct BitFieldsLong { 35 _ExtInt(63) A : 3; 36 _ExtInt(63) B : 3; 37 _ExtInt(63) C : 2; 38 }; 39 // LIN: %struct.BitFieldsLong = type { i8, [7 x i8] } 40 // WIN: %struct.BitFieldsLong = type { i64 } 41 42 struct HasExtIntFirst { 43 _ExtInt(35) A; 44 int B; 45 }; 46 // CHECK: %struct.HasExtIntFirst = type { i35, i32 } 47 48 struct HasExtIntLast { 49 int A; 50 _ExtInt(35) B; 51 }; 52 // CHECK: %struct.HasExtIntLast = type { i32, i35 } 53 54 struct HasExtIntMiddle { 55 int A; 56 _ExtInt(35) B; 57 int C; 58 }; 59 // CHECK: %struct.HasExtIntMiddle = type { i32, i35, i32 } 60 61 // Force emitting of the above structs. 62 void StructEmit() { 63 BitFieldsByte A; 64 BitFieldsShort B; 65 BitFieldsInt C; 66 BitFieldsLong D; 67 68 HasExtIntFirst E; 69 HasExtIntLast F; 70 HasExtIntMiddle G; 71 } 72 73 void BitfieldAssignment() { 74 // LIN: define{{.*}} void @_Z18BitfieldAssignmentv 75 // WIN: define dso_local void @"?BitfieldAssignment@@YAXXZ" 76 BitFieldsByte B; 77 B.A = 3; 78 B.B = 2; 79 B.C = 1; 80 // First one is used for the lifetime start, skip that. 81 // CHECK: bitcast %struct.BitFieldsByte* 82 // CHECK: %[[BFType:.+]] = bitcast %struct.BitFieldsByte* 83 // CHECK: %[[LOADA:.+]] = load i8, i8* %[[BFType]] 84 // CHECK: %[[CLEARA:.+]] = and i8 %[[LOADA]], -8 85 // CHECK: %[[SETA:.+]] = or i8 %[[CLEARA]], 3 86 // CHECK: %[[BFType:.+]] = bitcast %struct.BitFieldsByte* 87 // CHECK: %[[LOADB:.+]] = load i8, i8* %[[BFType]] 88 // CHECK: %[[CLEARB:.+]] = and i8 %[[LOADB]], -57 89 // CHECK: %[[SETB:.+]] = or i8 %[[CLEARB]], 16 90 // CHECK: %[[BFType:.+]] = bitcast %struct.BitFieldsByte* 91 // CHECK: %[[LOADC:.+]] = load i8, i8* %[[BFType]] 92 // CHECK: %[[CLEARC:.+]] = and i8 %[[LOADC]], 63 93 // CHECK: %[[SETC:.+]] = or i8 %[[CLEARC]], 64 94 } 95 96 enum AsEnumUnderlyingType : _ExtInt(9) { 97 A,B,C 98 }; 99 100 void UnderlyingTypeUsage(AsEnumUnderlyingType Param) { 101 // LIN: define{{.*}} void @_Z19UnderlyingTypeUsage20AsEnumUnderlyingType(i9 signext % 102 // WIN: define dso_local void @"?UnderlyingTypeUsage@@YAXW4AsEnumUnderlyingType@@@Z"(i9 % 103 AsEnumUnderlyingType Var; 104 // CHECK: alloca i9, align 2 105 // CHECK: store i9 %{{.*}}, align 2 106 } 107 108 unsigned _ExtInt(33) ManglingTestRetParam(unsigned _ExtInt(33) Param) { 109 // LIN: define{{.*}} i64 @_Z20ManglingTestRetParamU7_ExtIntILi33EEj(i64 % 110 // WIN: define dso_local i33 @"?ManglingTestRetParam@@YAU?$_UExtInt@$0CB@@__clang@@U12@@Z"(i33 111 return 0; 112 } 113 114 _ExtInt(33) ManglingTestRetParam(_ExtInt(33) Param) { 115 // LIN: define{{.*}} i64 @_Z20ManglingTestRetParamU7_ExtIntILi33EEi(i64 % 116 // WIN: define dso_local i33 @"?ManglingTestRetParam@@YAU?$_ExtInt@$0CB@@__clang@@U12@@Z"(i33 117 return 0; 118 } 119 120 template<typename T> 121 void ManglingTestTemplateParam(T&); 122 template<_ExtInt(99) T> 123 void ManglingTestNTTP(); 124 125 void ManglingInstantiator() { 126 // LIN: define{{.*}} void @_Z20ManglingInstantiatorv() 127 // WIN: define dso_local void @"?ManglingInstantiator@@YAXXZ"() 128 _ExtInt(93) A; 129 ManglingTestTemplateParam(A); 130 // LIN: call void @_Z25ManglingTestTemplateParamIU7_ExtIntILi93EEiEvRT_(i93* 131 // WIN: call void @"??$ManglingTestTemplateParam@U?$_ExtInt@$0FN@@__clang@@@@YAXAEAU?$_ExtInt@$0FN@@__clang@@@Z"(i93* 132 constexpr _ExtInt(93) B = 993; 133 ManglingTestNTTP<38>(); 134 // LIN: call void @_Z16ManglingTestNTTPILU7_ExtIntILi99EEi38EEvv() 135 // WIN: call void @"??$ManglingTestNTTP@$0CG@@@YAXXZ"() 136 ManglingTestNTTP<B>(); 137 // LIN: call void @_Z16ManglingTestNTTPILU7_ExtIntILi99EEi993EEvv() 138 // WIN: call void @"??$ManglingTestNTTP@$0DOB@@@YAXXZ"() 139 } 140 141 void TakesVarargs(int i, ...) { 142 // LIN: define{{.*}} void @_Z12TakesVarargsiz(i32 %i, ...) 143 // WIN: define dso_local void @"?TakesVarargs@@YAXHZZ"(i32 %i, ...) 144 145 __builtin_va_list args; 146 // LIN: %[[ARGS:.+]] = alloca [1 x %struct.__va_list_tag] 147 // WIN: %[[ARGS:.+]] = alloca i8* 148 __builtin_va_start(args, i); 149 // LIN: %[[STARTAD:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]] 150 // LIN: %[[STARTAD1:.+]] = bitcast %struct.__va_list_tag* %[[STARTAD]] to i8* 151 // LIN: call void @llvm.va_start(i8* %[[STARTAD1]]) 152 // WIN: %[[ARGSLLIFETIMESTART:.+]] = bitcast i8** %[[ARGS]] to i8* 153 // WIN: %[[ARGSSTART:.+]] = bitcast i8** %[[ARGS]] to i8* 154 // WIN: call void @llvm.va_start(i8* %[[ARGSSTART]]) 155 156 _ExtInt(92) A = __builtin_va_arg(args, _ExtInt(92)); 157 // LIN: %[[AD1:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]] 158 // LIN: %[[OFA_P1:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD1]], i32 0, i32 0 159 // LIN: %[[GPOFFSET:.+]] = load i32, i32* %[[OFA_P1]] 160 // LIN: %[[FITSINGP:.+]] = icmp ule i32 %[[GPOFFSET]], 32 161 // LIN: br i1 %[[FITSINGP]] 162 // LIN: %[[BC1:.+]] = phi i92* 163 // LIN: %[[LOAD1:.+]] = load i92, i92* %[[BC1]] 164 // LIN: store i92 %[[LOAD1]], i92* 165 166 // WIN: %[[CUR1:.+]] = load i8*, i8** %[[ARGS]] 167 // WIN: %[[NEXT1:.+]] = getelementptr inbounds i8, i8* %[[CUR1]], i64 8 168 // WIN: store i8* %[[NEXT1]], i8** %[[ARGS]] 169 // WIN: %[[BC1:.+]] = bitcast i8* %[[CUR1]] to i92** 170 // WIN: %[[LOADP1:.+]] = load i92*, i92** %[[BC1]] 171 // WIN: %[[LOADV1:.+]] = load i92, i92* %[[LOADP1]] 172 // WIN: store i92 %[[LOADV1]], i92* 173 174 _ExtInt(31) B = __builtin_va_arg(args, _ExtInt(31)); 175 // LIN: %[[AD2:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]] 176 // LIN: %[[OFA_P2:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD2]], i32 0, i32 0 177 // LIN: %[[GPOFFSET:.+]] = load i32, i32* %[[OFA_P2]] 178 // LIN: %[[FITSINGP:.+]] = icmp ule i32 %[[GPOFFSET]], 40 179 // LIN: br i1 %[[FITSINGP]] 180 // LIN: %[[BC1:.+]] = phi i31* 181 // LIN: %[[LOAD1:.+]] = load i31, i31* %[[BC1]] 182 // LIN: store i31 %[[LOAD1]], i31* 183 184 // WIN: %[[CUR2:.+]] = load i8*, i8** %[[ARGS]] 185 // WIN: %[[NEXT2:.+]] = getelementptr inbounds i8, i8* %[[CUR2]], i64 8 186 // WIN: store i8* %[[NEXT2]], i8** %[[ARGS]] 187 // WIN: %[[BC2:.+]] = bitcast i8* %[[CUR2]] to i31* 188 // WIN: %[[LOADV2:.+]] = load i31, i31* %[[BC2]] 189 // WIN: store i31 %[[LOADV2]], i31* 190 191 _ExtInt(16) C = __builtin_va_arg(args, _ExtInt(16)); 192 // LIN: %[[AD3:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]] 193 // LIN: %[[OFA_P3:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD3]], i32 0, i32 0 194 // LIN: %[[GPOFFSET:.+]] = load i32, i32* %[[OFA_P3]] 195 // LIN: %[[FITSINGP:.+]] = icmp ule i32 %[[GPOFFSET]], 40 196 // LIN: br i1 %[[FITSINGP]] 197 // LIN: %[[BC1:.+]] = phi i16* 198 // LIN: %[[LOAD1:.+]] = load i16, i16* %[[BC1]] 199 // LIN: store i16 %[[LOAD1]], i16* 200 201 // WIN: %[[CUR3:.+]] = load i8*, i8** %[[ARGS]] 202 // WIN: %[[NEXT3:.+]] = getelementptr inbounds i8, i8* %[[CUR3]], i64 8 203 // WIN: store i8* %[[NEXT3]], i8** %[[ARGS]] 204 // WIN: %[[BC3:.+]] = bitcast i8* %[[CUR3]] to i16* 205 // WIN: %[[LOADV3:.+]] = load i16, i16* %[[BC3]] 206 // WIN: store i16 %[[LOADV3]], i16* 207 208 _ExtInt(129) D = __builtin_va_arg(args, _ExtInt(129)); 209 // LIN: %[[AD4:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]] 210 // LIN: %[[OFA_P4:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD4]], i32 0, i32 2 211 // LIN: %[[OFA4:.+]] = load i8*, i8** %[[OFA_P4]] 212 // LIN: %[[BC4:.+]] = bitcast i8* %[[OFA4]] to i129* 213 // LIN: %[[OFANEXT4:.+]] = getelementptr i8, i8* %[[OFA4]], i32 24 214 // LIN: store i8* %[[OFANEXT4]], i8** %[[OFA_P4]] 215 // LIN: %[[LOAD4:.+]] = load i129, i129* %[[BC4]] 216 // LIN: store i129 %[[LOAD4]], i129* 217 218 // WIN: %[[CUR4:.+]] = load i8*, i8** %[[ARGS]] 219 // WIN: %[[NEXT4:.+]] = getelementptr inbounds i8, i8* %[[CUR4]], i64 8 220 // WIN: store i8* %[[NEXT4]], i8** %[[ARGS]] 221 // WIN: %[[BC4:.+]] = bitcast i8* %[[CUR4]] to i129** 222 // WIN: %[[LOADP4:.+]] = load i129*, i129** %[[BC4]] 223 // WIN: %[[LOADV4:.+]] = load i129, i129* %[[LOADP4]] 224 // WIN: store i129 %[[LOADV4]], i129* 225 226 _ExtInt(8388600) E = __builtin_va_arg(args, _ExtInt(8388600)); 227 // LIN: %[[AD5:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]] 228 // LIN: %[[OFA_P5:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD5]], i32 0, i32 2 229 // LIN: %[[OFA5:.+]] = load i8*, i8** %[[OFA_P5]] 230 // LIN: %[[BC5:.+]] = bitcast i8* %[[OFA5]] to i8388600* 231 // LIN: %[[OFANEXT5:.+]] = getelementptr i8, i8* %[[OFA5]], i32 1048576 232 // LIN: store i8* %[[OFANEXT5]], i8** %[[OFA_P5]] 233 // LIN: %[[LOAD5:.+]] = load i8388600, i8388600* %[[BC5]] 234 // LIN: store i8388600 %[[LOAD5]], i8388600* 235 236 // WIN: %[[CUR5:.+]] = load i8*, i8** %[[ARGS]] 237 // WIN: %[[NEXT5:.+]] = getelementptr inbounds i8, i8* %[[CUR5]], i64 8 238 // WIN: store i8* %[[NEXT5]], i8** %[[ARGS]] 239 // WIN: %[[BC5:.+]] = bitcast i8* %[[CUR5]] to i8388600** 240 // WIN: %[[LOADP5:.+]] = load i8388600*, i8388600** %[[BC5]] 241 // WIN: %[[LOADV5:.+]] = load i8388600, i8388600* %[[LOADP5]] 242 // WIN: store i8388600 %[[LOADV5]], i8388600* 243 244 __builtin_va_end(args); 245 // LIN: %[[ENDAD:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]] 246 // LIN: %[[ENDAD1:.+]] = bitcast %struct.__va_list_tag* %[[ENDAD]] to i8* 247 // LIN: call void @llvm.va_end(i8* %[[ENDAD1]]) 248 // WIN: %[[ARGSEND:.+]] = bitcast i8** %[[ARGS]] to i8* 249 // WIN: call void @llvm.va_end(i8* %[[ARGSEND]]) 250 } 251 void typeid_tests() { 252 // LIN: define{{.*}} void @_Z12typeid_testsv() 253 // WIN: define dso_local void @"?typeid_tests@@YAXXZ"() 254 unsigned _ExtInt(33) U33_1, U33_2; 255 _ExtInt(33) S33_1, S33_2; 256 _ExtInt(32) S32_1, S32_2; 257 258 auto A = typeid(U33_1); 259 // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi33EEj to %"class.std::type_info"*)) 260 // WIN: call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast (%rtti.TypeDescriptor28* @"??_R0U?$_UExtInt@$0CB@@__clang@@@8" to %"class.std::type_info"*)) 261 auto B = typeid(U33_2); 262 // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi33EEj to %"class.std::type_info"*)) 263 // WIN: call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast (%rtti.TypeDescriptor28* @"??_R0U?$_UExtInt@$0CB@@__clang@@@8" to %"class.std::type_info"*)) 264 auto C = typeid(S33_1); 265 // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi33EEi to %"class.std::type_info"*)) 266 // WIN: call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast (%rtti.TypeDescriptor27* @"??_R0U?$_ExtInt@$0CB@@__clang@@@8" to %"class.std::type_info"*)) 267 auto D = typeid(S33_2); 268 // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi33EEi to %"class.std::type_info"*)) 269 // WIN: call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast (%rtti.TypeDescriptor27* @"??_R0U?$_ExtInt@$0CB@@__clang@@@8" to %"class.std::type_info"*)) 270 auto E = typeid(S32_1); 271 // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi32EEi to %"class.std::type_info"*)) 272 // WIN: call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast (%rtti.TypeDescriptor27* @"??_R0U?$_ExtInt@$0CA@@__clang@@@8" to %"class.std::type_info"*)) 273 auto F = typeid(S32_2); 274 // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi32EEi to %"class.std::type_info"*)) 275 // WIN: call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast (%rtti.TypeDescriptor27* @"??_R0U?$_ExtInt@$0CA@@__clang@@@8" to %"class.std::type_info"*)) 276 } 277 278 void ExplicitCasts() { 279 // LIN: define{{.*}} void @_Z13ExplicitCastsv() 280 // WIN: define dso_local void @"?ExplicitCasts@@YAXXZ"() 281 282 _ExtInt(33) a; 283 _ExtInt(31) b; 284 int i; 285 286 a = i; 287 // CHECK: %[[CONV:.+]] = sext i32 %{{.+}} to i33 288 b = i; 289 // CHECK: %[[CONV:.+]] = trunc i32 %{{.+}} to i31 290 i = a; 291 // CHECK: %[[CONV:.+]] = trunc i33 %{{.+}} to i32 292 i = b; 293 // CHECK: %[[CONV:.+]] = sext i31 %{{.+}} to i32 294 } 295 296 struct S { 297 _ExtInt(17) A; 298 _ExtInt(8388600) B; 299 _ExtInt(17) C; 300 }; 301 302 void OffsetOfTest() { 303 // LIN: define{{.*}} void @_Z12OffsetOfTestv() 304 // WIN: define dso_local void @"?OffsetOfTest@@YAXXZ"() 305 306 auto A = __builtin_offsetof(S,A); 307 // CHECK: store i64 0, i64* %{{.+}} 308 auto B = __builtin_offsetof(S,B); 309 // CHECK: store i64 8, i64* %{{.+}} 310 auto C = __builtin_offsetof(S,C); 311 // CHECK: store i64 1048584, i64* %{{.+}} 312 } 313 314 315 void ShiftExtIntByConstant(_ExtInt(28) Ext) { 316 // LIN: define{{.*}} void @_Z21ShiftExtIntByConstantU7_ExtIntILi28EEi 317 // WIN: define dso_local void @"?ShiftExtIntByConstant@@YAXU?$_ExtInt@$0BM@@__clang@@@Z" 318 Ext << 7; 319 // CHECK: shl i28 %{{.+}}, 7 320 Ext >> 7; 321 // CHECK: ashr i28 %{{.+}}, 7 322 Ext << -7; 323 // CHECK: shl i28 %{{.+}}, -7 324 Ext >> -7; 325 // CHECK: ashr i28 %{{.+}}, -7 326 327 // UB in C/C++, Defined in OpenCL. 328 Ext << 29; 329 // CHECK: shl i28 %{{.+}}, 29 330 Ext >> 29; 331 // CHECK: ashr i28 %{{.+}}, 29 332 } 333 334 void ConstantShiftByExtInt(_ExtInt(28) Ext, _ExtInt(65) LargeExt) { 335 // LIN: define{{.*}} void @_Z21ConstantShiftByExtIntU7_ExtIntILi28EEiU7_ExtIntILi65EEi 336 // WIN: define dso_local void @"?ConstantShiftByExtInt@@YAXU?$_ExtInt@$0BM@@__clang@@U?$_ExtInt@$0EB@@2@@Z" 337 10 << Ext; 338 // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32 339 // CHECK: shl i32 10, %[[PROMO]] 340 10 >> Ext; 341 // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32 342 // CHECK: ashr i32 10, %[[PROMO]] 343 10 << LargeExt; 344 // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32 345 // CHECK: shl i32 10, %[[PROMO]] 346 10 >> LargeExt; 347 // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32 348 // CHECK: ashr i32 10, %[[PROMO]] 349 } 350 351 void Shift(_ExtInt(28) Ext, _ExtInt(65) LargeExt, int i) { 352 // LIN: define{{.*}} void @_Z5ShiftU7_ExtIntILi28EEiU7_ExtIntILi65EEii 353 // WIN: define dso_local void @"?Shift@@YAXU?$_ExtInt@$0BM@@__clang@@U?$_ExtInt@$0EB@@2@H@Z" 354 i << Ext; 355 // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32 356 // CHECK: shl i32 {{.+}}, %[[PROMO]] 357 i >> Ext; 358 // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32 359 // CHECK: ashr i32 {{.+}}, %[[PROMO]] 360 361 i << LargeExt; 362 // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32 363 // CHECK: shl i32 {{.+}}, %[[PROMO]] 364 i >> LargeExt; 365 // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32 366 // CHECK: ashr i32 {{.+}}, %[[PROMO]] 367 368 Ext << i; 369 // CHECK: %[[PROMO:.+]] = trunc i32 %{{.+}} to i28 370 // CHECK: shl i28 {{.+}}, %[[PROMO]] 371 Ext >> i; 372 // CHECK: %[[PROMO:.+]] = trunc i32 %{{.+}} to i28 373 // CHECK: ashr i28 {{.+}}, %[[PROMO]] 374 375 LargeExt << i; 376 // CHECK: %[[PROMO:.+]] = zext i32 %{{.+}} to i65 377 // CHECK: shl i65 {{.+}}, %[[PROMO]] 378 LargeExt >> i; 379 // CHECK: %[[PROMO:.+]] = zext i32 %{{.+}} to i65 380 // CHECK: ashr i65 {{.+}}, %[[PROMO]] 381 382 Ext << LargeExt; 383 // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i28 384 // CHECK: shl i28 {{.+}}, %[[PROMO]] 385 Ext >> LargeExt; 386 // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i28 387 // CHECK: ashr i28 {{.+}}, %[[PROMO]] 388 389 LargeExt << Ext; 390 // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i65 391 // CHECK: shl i65 {{.+}}, %[[PROMO]] 392 LargeExt >> Ext; 393 // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i65 394 // CHECK: ashr i65 {{.+}}, %[[PROMO]] 395 } 396 397 void ComplexTest(_Complex _ExtInt(12) first, 398 _Complex _ExtInt(33) second) { 399 // LIN: define{{.*}} void @_Z11ComplexTestCU7_ExtIntILi12EEiCU7_ExtIntILi33EEi 400 // WIN: define dso_local void @"?ComplexTest@@YAXU?$_Complex@U?$_ExtInt@$0M@@__clang@@@__clang@@U?$_Complex@U?$_ExtInt@$0CB@@__clang@@@2@@Z" 401 first + second; 402 // CHECK: %[[FIRST_REALP:.+]] = getelementptr inbounds { i12, i12 }, { i12, i12 }* %{{.+}}, i32 0, i32 0 403 // CHECK: %[[FIRST_REAL:.+]] = load i12, i12* %[[FIRST_REALP]] 404 // CHECK: %[[FIRST_IMAGP:.+]] = getelementptr inbounds { i12, i12 }, { i12, i12 }* %{{.+}}, i32 0, i32 1 405 // CHECK: %[[FIRST_IMAG:.+]] = load i12, i12* %[[FIRST_IMAGP]] 406 // CHECK: %[[FIRST_REAL_CONV:.+]] = sext i12 %[[FIRST_REAL]] 407 // CHECK: %[[FIRST_IMAG_CONV:.+]] = sext i12 %[[FIRST_IMAG]] 408 // CHECK: %[[SECOND_REALP:.+]] = getelementptr inbounds { i33, i33 }, { i33, i33 }* %{{.+}}, i32 0, i32 0 409 // CHECK: %[[SECOND_REAL:.+]] = load i33, i33* %[[SECOND_REALP]] 410 // CHECK: %[[SECOND_IMAGP:.+]] = getelementptr inbounds { i33, i33 }, { i33, i33 }* %{{.+}}, i32 0, i32 1 411 // CHECK: %[[SECOND_IMAG:.+]] = load i33, i33* %[[SECOND_IMAGP]] 412 // CHECK: %[[REAL:.+]] = add i33 %[[FIRST_REAL_CONV]], %[[SECOND_REAL]] 413 // CHECK: %[[IMAG:.+]] = add i33 %[[FIRST_IMAG_CONV]], %[[SECOND_IMAG]] 414 } 415 416 // Ensure that these types don't alias the normal int types. 417 void TBAATest(_ExtInt(sizeof(int) * 8) ExtInt, 418 unsigned _ExtInt(sizeof(int) * 8) ExtUInt, 419 _ExtInt(6) Other) { 420 // CHECK-DAG: store i32 %{{.+}}, i32* %{{.+}}, align 4, !tbaa ![[EXTINT_TBAA:.+]] 421 // CHECK-DAG: store i32 %{{.+}}, i32* %{{.+}}, align 4, !tbaa ![[EXTINT_TBAA]] 422 // CHECK-DAG: store i6 %{{.+}}, i6* %{{.+}}, align 1, !tbaa ![[EXTINT6_TBAA:.+]] 423 ExtInt = 5; 424 ExtUInt = 5; 425 Other = 5; 426 } 427 428 // NoNewStructPathTBAA-DAG: ![[CHAR_TBAA_ROOT:.+]] = !{!"omnipotent char", ![[TBAA_ROOT:.+]], i64 0} 429 // NoNewStructPathTBAA-DAG: ![[TBAA_ROOT]] = !{!"Simple C++ TBAA"} 430 // NoNewStructPathTBAA-DAG: ![[EXTINT_TBAA]] = !{![[EXTINT_TBAA_ROOT:.+]], ![[EXTINT_TBAA_ROOT]], i64 0} 431 // NoNewStructPathTBAA-DAG: ![[EXTINT_TBAA_ROOT]] = !{!"_ExtInt(32)", ![[CHAR_TBAA_ROOT]], i64 0} 432 // NoNewStructPathTBAA-DAG: ![[EXTINT6_TBAA]] = !{![[EXTINT6_TBAA_ROOT:.+]], ![[EXTINT6_TBAA_ROOT]], i64 0} 433 // NoNewStructPathTBAA-DAG: ![[EXTINT6_TBAA_ROOT]] = !{!"_ExtInt(6)", ![[CHAR_TBAA_ROOT]], i64 0} 434 435 // NewStructPathTBAA-DAG: ![[CHAR_TBAA_ROOT:.+]] = !{![[TBAA_ROOT:.+]], i64 1, !"omnipotent char"} 436 // NewStructPathTBAA-DAG: ![[TBAA_ROOT]] = !{!"Simple C++ TBAA"} 437 // NewStructPathTBAA-DAG: ![[EXTINT_TBAA]] = !{![[EXTINT_TBAA_ROOT:.+]], ![[EXTINT_TBAA_ROOT]], i64 0, i64 4} 438 // NewStructPathTBAA-DAG: ![[EXTINT_TBAA_ROOT]] = !{![[CHAR_TBAA_ROOT]], i64 4, !"_ExtInt(32)"} 439 // NewStructPathTBAA-DAG: ![[EXTINT6_TBAA]] = !{![[EXTINT6_TBAA_ROOT:.+]], ![[EXTINT6_TBAA_ROOT]], i64 0, i64 1} 440 // NewStructPathTBAA-DAG: ![[EXTINT6_TBAA_ROOT]] = !{![[CHAR_TBAA_ROOT]], i64 1, !"_ExtInt(6)"} 441