1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i386-linux-gnu | FileCheck -check-prefix=X86_LINUX %s 3; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck -check-prefix=X64_LINUX %s 4; RUN: llc < %s -mtriple=i386-linux-gnu -fast-isel | FileCheck -check-prefix=X86_ISEL_LINUX %s 5; RUN: llc < %s -mtriple=x86_64-linux-gnu -fast-isel | FileCheck -check-prefix=X64_ISEL_LINUX %s 6; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck -check-prefix=X86_WIN %s 7; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck -check-prefix=X64_WIN %s 8; RUN: llc < %s -mtriple=i686-pc-windows-gnu | FileCheck -check-prefix=MINGW32 %s 9; RUN: llc < %s -mtriple=x86_64-pc-windows-gnu | FileCheck -check-prefix=X64_WIN %s 10 11@i1 = dso_local thread_local global i32 15 12@i2 = external thread_local global i32 13@i3 = internal thread_local global i32 15 14@i4 = hidden thread_local global i32 15 15@i5 = external hidden thread_local global i32 16@i6 = external protected thread_local global i32 17@s1 = dso_local thread_local global i16 15 18@b1 = dso_local thread_local global i8 0 19@b2 = dso_local thread_local(localexec) global i8 0 20 21define dso_local i32 @f1() { 22; X86_LINUX-LABEL: f1: 23; X86_LINUX: # %bb.0: # %entry 24; X86_LINUX-NEXT: movl %gs:i1@NTPOFF, %eax 25; X86_LINUX-NEXT: retl 26; 27; X64_LINUX-LABEL: f1: 28; X64_LINUX: # %bb.0: # %entry 29; X64_LINUX-NEXT: movl %fs:i1@TPOFF, %eax 30; X64_LINUX-NEXT: retq 31; 32; X86_ISEL_LINUX-LABEL: f1: 33; X86_ISEL_LINUX: # %bb.0: # %entry 34; X86_ISEL_LINUX-NEXT: movl %gs:i1@NTPOFF, %eax 35; X86_ISEL_LINUX-NEXT: retl 36; 37; X64_ISEL_LINUX-LABEL: f1: 38; X64_ISEL_LINUX: # %bb.0: # %entry 39; X64_ISEL_LINUX-NEXT: movl %fs:i1@TPOFF, %eax 40; X64_ISEL_LINUX-NEXT: retq 41; 42; X86_WIN-LABEL: f1: 43; X86_WIN: # %bb.0: # %entry 44; X86_WIN-NEXT: movl __tls_index, %eax 45; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 46; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 47; X86_WIN-NEXT: movl _i1@SECREL32(%eax), %eax 48; X86_WIN-NEXT: retl 49; 50; X64_WIN-LABEL: f1: 51; X64_WIN: # %bb.0: # %entry 52; X64_WIN-NEXT: movl _tls_index(%rip), %eax 53; X64_WIN-NEXT: movq %gs:88, %rcx 54; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 55; X64_WIN-NEXT: movl i1@SECREL32(%rax), %eax 56; X64_WIN-NEXT: retq 57; 58; MINGW32-LABEL: f1: 59; MINGW32: # %bb.0: # %entry 60; MINGW32-NEXT: movl __tls_index, %eax 61; MINGW32-NEXT: movl %fs:44, %ecx 62; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 63; MINGW32-NEXT: movl _i1@SECREL32(%eax), %eax 64; MINGW32-NEXT: retl 65 66entry: 67 %tmp1 = load i32, ptr @i1 68 ret i32 %tmp1 69} 70 71define dso_local ptr @f2() { 72; X86_LINUX-LABEL: f2: 73; X86_LINUX: # %bb.0: # %entry 74; X86_LINUX-NEXT: movl %gs:0, %eax 75; X86_LINUX-NEXT: leal i1@NTPOFF(%eax), %eax 76; X86_LINUX-NEXT: retl 77; 78; X64_LINUX-LABEL: f2: 79; X64_LINUX: # %bb.0: # %entry 80; X64_LINUX-NEXT: movq %fs:0, %rax 81; X64_LINUX-NEXT: leaq i1@TPOFF(%rax), %rax 82; X64_LINUX-NEXT: retq 83; 84; X86_ISEL_LINUX-LABEL: f2: 85; X86_ISEL_LINUX: # %bb.0: # %entry 86; X86_ISEL_LINUX-NEXT: movl %gs:0, %eax 87; X86_ISEL_LINUX-NEXT: leal i1@NTPOFF(%eax), %eax 88; X86_ISEL_LINUX-NEXT: retl 89; 90; X64_ISEL_LINUX-LABEL: f2: 91; X64_ISEL_LINUX: # %bb.0: # %entry 92; X64_ISEL_LINUX-NEXT: movq %fs:0, %rax 93; X64_ISEL_LINUX-NEXT: leaq i1@TPOFF(%rax), %rax 94; X64_ISEL_LINUX-NEXT: retq 95; 96; X86_WIN-LABEL: f2: 97; X86_WIN: # %bb.0: # %entry 98; X86_WIN-NEXT: movl __tls_index, %eax 99; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 100; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 101; X86_WIN-NEXT: leal _i1@SECREL32(%eax), %eax 102; X86_WIN-NEXT: retl 103; 104; X64_WIN-LABEL: f2: 105; X64_WIN: # %bb.0: # %entry 106; X64_WIN-NEXT: movl _tls_index(%rip), %eax 107; X64_WIN-NEXT: movq %gs:88, %rcx 108; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 109; X64_WIN-NEXT: leaq i1@SECREL32(%rax), %rax 110; X64_WIN-NEXT: retq 111; 112; MINGW32-LABEL: f2: 113; MINGW32: # %bb.0: # %entry 114; MINGW32-NEXT: movl __tls_index, %eax 115; MINGW32-NEXT: movl %fs:44, %ecx 116; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 117; MINGW32-NEXT: leal _i1@SECREL32(%eax), %eax 118; MINGW32-NEXT: retl 119 120entry: 121 ret ptr @i1 122} 123 124define dso_local i32 @f3() nounwind { 125; X86_LINUX-LABEL: f3: 126; X86_LINUX: # %bb.0: # %entry 127; X86_LINUX-NEXT: movl i2@INDNTPOFF, %eax 128; X86_LINUX-NEXT: movl %gs:(%eax), %eax 129; X86_LINUX-NEXT: retl 130; 131; X64_LINUX-LABEL: f3: 132; X64_LINUX: # %bb.0: # %entry 133; X64_LINUX-NEXT: movq i2@GOTTPOFF(%rip), %rax 134; X64_LINUX-NEXT: movl %fs:(%rax), %eax 135; X64_LINUX-NEXT: retq 136; 137; X86_ISEL_LINUX-LABEL: f3: 138; X86_ISEL_LINUX: # %bb.0: # %entry 139; X86_ISEL_LINUX-NEXT: movl i2@INDNTPOFF, %eax 140; X86_ISEL_LINUX-NEXT: movl %gs:(%eax), %eax 141; X86_ISEL_LINUX-NEXT: retl 142; 143; X64_ISEL_LINUX-LABEL: f3: 144; X64_ISEL_LINUX: # %bb.0: # %entry 145; X64_ISEL_LINUX-NEXT: movq i2@GOTTPOFF(%rip), %rax 146; X64_ISEL_LINUX-NEXT: movl %fs:(%rax), %eax 147; X64_ISEL_LINUX-NEXT: retq 148; 149; X86_WIN-LABEL: f3: 150; X86_WIN: # %bb.0: # %entry 151; X86_WIN-NEXT: movl __tls_index, %eax 152; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 153; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 154; X86_WIN-NEXT: movl _i2@SECREL32(%eax), %eax 155; X86_WIN-NEXT: retl 156; 157; X64_WIN-LABEL: f3: 158; X64_WIN: # %bb.0: # %entry 159; X64_WIN-NEXT: movl _tls_index(%rip), %eax 160; X64_WIN-NEXT: movq %gs:88, %rcx 161; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 162; X64_WIN-NEXT: movl i2@SECREL32(%rax), %eax 163; X64_WIN-NEXT: retq 164; 165; MINGW32-LABEL: f3: 166; MINGW32: # %bb.0: # %entry 167; MINGW32-NEXT: movl __tls_index, %eax 168; MINGW32-NEXT: movl %fs:44, %ecx 169; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 170; MINGW32-NEXT: movl _i2@SECREL32(%eax), %eax 171; MINGW32-NEXT: retl 172 173entry: 174 %tmp1 = load i32, ptr @i2 175 ret i32 %tmp1 176} 177 178define dso_local ptr @f4() { 179; X86_LINUX-LABEL: f4: 180; X86_LINUX: # %bb.0: # %entry 181; X86_LINUX-NEXT: movl %gs:0, %eax 182; X86_LINUX-NEXT: addl i2@INDNTPOFF, %eax 183; X86_LINUX-NEXT: retl 184; 185; X64_LINUX-LABEL: f4: 186; X64_LINUX: # %bb.0: # %entry 187; X64_LINUX-NEXT: movq %fs:0, %rax 188; X64_LINUX-NEXT: addq i2@GOTTPOFF(%rip), %rax 189; X64_LINUX-NEXT: retq 190; 191; X86_ISEL_LINUX-LABEL: f4: 192; X86_ISEL_LINUX: # %bb.0: # %entry 193; X86_ISEL_LINUX-NEXT: movl %gs:0, %eax 194; X86_ISEL_LINUX-NEXT: addl i2@INDNTPOFF, %eax 195; X86_ISEL_LINUX-NEXT: retl 196; 197; X64_ISEL_LINUX-LABEL: f4: 198; X64_ISEL_LINUX: # %bb.0: # %entry 199; X64_ISEL_LINUX-NEXT: movq %fs:0, %rax 200; X64_ISEL_LINUX-NEXT: addq i2@GOTTPOFF(%rip), %rax 201; X64_ISEL_LINUX-NEXT: retq 202; 203; X86_WIN-LABEL: f4: 204; X86_WIN: # %bb.0: # %entry 205; X86_WIN-NEXT: movl __tls_index, %eax 206; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 207; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 208; X86_WIN-NEXT: leal _i2@SECREL32(%eax), %eax 209; X86_WIN-NEXT: retl 210; 211; X64_WIN-LABEL: f4: 212; X64_WIN: # %bb.0: # %entry 213; X64_WIN-NEXT: movl _tls_index(%rip), %eax 214; X64_WIN-NEXT: movq %gs:88, %rcx 215; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 216; X64_WIN-NEXT: leaq i2@SECREL32(%rax), %rax 217; X64_WIN-NEXT: retq 218; 219; MINGW32-LABEL: f4: 220; MINGW32: # %bb.0: # %entry 221; MINGW32-NEXT: movl __tls_index, %eax 222; MINGW32-NEXT: movl %fs:44, %ecx 223; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 224; MINGW32-NEXT: leal _i2@SECREL32(%eax), %eax 225; MINGW32-NEXT: retl 226 227entry: 228 ret ptr @i2 229} 230 231define dso_local i32 @f5() nounwind { 232; X86_LINUX-LABEL: f5: 233; X86_LINUX: # %bb.0: # %entry 234; X86_LINUX-NEXT: movl %gs:i3@NTPOFF, %eax 235; X86_LINUX-NEXT: retl 236; 237; X64_LINUX-LABEL: f5: 238; X64_LINUX: # %bb.0: # %entry 239; X64_LINUX-NEXT: movl %fs:i3@TPOFF, %eax 240; X64_LINUX-NEXT: retq 241; 242; X86_ISEL_LINUX-LABEL: f5: 243; X86_ISEL_LINUX: # %bb.0: # %entry 244; X86_ISEL_LINUX-NEXT: movl %gs:i3@NTPOFF, %eax 245; X86_ISEL_LINUX-NEXT: retl 246; 247; X64_ISEL_LINUX-LABEL: f5: 248; X64_ISEL_LINUX: # %bb.0: # %entry 249; X64_ISEL_LINUX-NEXT: movl %fs:i3@TPOFF, %eax 250; X64_ISEL_LINUX-NEXT: retq 251; 252; X86_WIN-LABEL: f5: 253; X86_WIN: # %bb.0: # %entry 254; X86_WIN-NEXT: movl __tls_index, %eax 255; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 256; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 257; X86_WIN-NEXT: movl _i3@SECREL32(%eax), %eax 258; X86_WIN-NEXT: retl 259; 260; X64_WIN-LABEL: f5: 261; X64_WIN: # %bb.0: # %entry 262; X64_WIN-NEXT: movl _tls_index(%rip), %eax 263; X64_WIN-NEXT: movq %gs:88, %rcx 264; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 265; X64_WIN-NEXT: movl i3@SECREL32(%rax), %eax 266; X64_WIN-NEXT: retq 267; 268; MINGW32-LABEL: f5: 269; MINGW32: # %bb.0: # %entry 270; MINGW32-NEXT: movl __tls_index, %eax 271; MINGW32-NEXT: movl %fs:44, %ecx 272; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 273; MINGW32-NEXT: movl _i3@SECREL32(%eax), %eax 274; MINGW32-NEXT: retl 275 276entry: 277 %tmp1 = load i32, ptr @i3 278 ret i32 %tmp1 279} 280 281define dso_local ptr @f6() { 282; X86_LINUX-LABEL: f6: 283; X86_LINUX: # %bb.0: # %entry 284; X86_LINUX-NEXT: movl %gs:0, %eax 285; X86_LINUX-NEXT: leal i3@NTPOFF(%eax), %eax 286; X86_LINUX-NEXT: retl 287; 288; X64_LINUX-LABEL: f6: 289; X64_LINUX: # %bb.0: # %entry 290; X64_LINUX-NEXT: movq %fs:0, %rax 291; X64_LINUX-NEXT: leaq i3@TPOFF(%rax), %rax 292; X64_LINUX-NEXT: retq 293; 294; X86_ISEL_LINUX-LABEL: f6: 295; X86_ISEL_LINUX: # %bb.0: # %entry 296; X86_ISEL_LINUX-NEXT: movl %gs:0, %eax 297; X86_ISEL_LINUX-NEXT: leal i3@NTPOFF(%eax), %eax 298; X86_ISEL_LINUX-NEXT: retl 299; 300; X64_ISEL_LINUX-LABEL: f6: 301; X64_ISEL_LINUX: # %bb.0: # %entry 302; X64_ISEL_LINUX-NEXT: movq %fs:0, %rax 303; X64_ISEL_LINUX-NEXT: leaq i3@TPOFF(%rax), %rax 304; X64_ISEL_LINUX-NEXT: retq 305; 306; X86_WIN-LABEL: f6: 307; X86_WIN: # %bb.0: # %entry 308; X86_WIN-NEXT: movl __tls_index, %eax 309; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 310; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 311; X86_WIN-NEXT: leal _i3@SECREL32(%eax), %eax 312; X86_WIN-NEXT: retl 313; 314; X64_WIN-LABEL: f6: 315; X64_WIN: # %bb.0: # %entry 316; X64_WIN-NEXT: movl _tls_index(%rip), %eax 317; X64_WIN-NEXT: movq %gs:88, %rcx 318; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 319; X64_WIN-NEXT: leaq i3@SECREL32(%rax), %rax 320; X64_WIN-NEXT: retq 321; 322; MINGW32-LABEL: f6: 323; MINGW32: # %bb.0: # %entry 324; MINGW32-NEXT: movl __tls_index, %eax 325; MINGW32-NEXT: movl %fs:44, %ecx 326; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 327; MINGW32-NEXT: leal _i3@SECREL32(%eax), %eax 328; MINGW32-NEXT: retl 329 330entry: 331 ret ptr @i3 332} 333 334define dso_local i32 @f7() { 335; X86_LINUX-LABEL: f7: 336; X86_LINUX: # %bb.0: # %entry 337; X86_LINUX-NEXT: movl %gs:i4@NTPOFF, %eax 338; X86_LINUX-NEXT: retl 339; 340; X64_LINUX-LABEL: f7: 341; X64_LINUX: # %bb.0: # %entry 342; X64_LINUX-NEXT: movl %fs:i4@TPOFF, %eax 343; X64_LINUX-NEXT: retq 344; 345; X86_ISEL_LINUX-LABEL: f7: 346; X86_ISEL_LINUX: # %bb.0: # %entry 347; X86_ISEL_LINUX-NEXT: movl %gs:i4@NTPOFF, %eax 348; X86_ISEL_LINUX-NEXT: retl 349; 350; X64_ISEL_LINUX-LABEL: f7: 351; X64_ISEL_LINUX: # %bb.0: # %entry 352; X64_ISEL_LINUX-NEXT: movl %fs:i4@TPOFF, %eax 353; X64_ISEL_LINUX-NEXT: retq 354; 355; X86_WIN-LABEL: f7: 356; X86_WIN: # %bb.0: # %entry 357; X86_WIN-NEXT: movl __tls_index, %eax 358; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 359; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 360; X86_WIN-NEXT: movl _i4@SECREL32(%eax), %eax 361; X86_WIN-NEXT: retl 362; 363; X64_WIN-LABEL: f7: 364; X64_WIN: # %bb.0: # %entry 365; X64_WIN-NEXT: movl _tls_index(%rip), %eax 366; X64_WIN-NEXT: movq %gs:88, %rcx 367; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 368; X64_WIN-NEXT: movl i4@SECREL32(%rax), %eax 369; X64_WIN-NEXT: retq 370; 371; MINGW32-LABEL: f7: 372; MINGW32: # %bb.0: # %entry 373; MINGW32-NEXT: movl __tls_index, %eax 374; MINGW32-NEXT: movl %fs:44, %ecx 375; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 376; MINGW32-NEXT: movl _i4@SECREL32(%eax), %eax 377; MINGW32-NEXT: retl 378 379entry: 380 %tmp1 = load i32, ptr @i4 381 ret i32 %tmp1 382} 383 384define dso_local ptr @f8() { 385; X86_LINUX-LABEL: f8: 386; X86_LINUX: # %bb.0: # %entry 387; X86_LINUX-NEXT: movl %gs:0, %eax 388; X86_LINUX-NEXT: leal i4@NTPOFF(%eax), %eax 389; X86_LINUX-NEXT: retl 390; 391; X64_LINUX-LABEL: f8: 392; X64_LINUX: # %bb.0: # %entry 393; X64_LINUX-NEXT: movq %fs:0, %rax 394; X64_LINUX-NEXT: leaq i4@TPOFF(%rax), %rax 395; X64_LINUX-NEXT: retq 396; 397; X86_ISEL_LINUX-LABEL: f8: 398; X86_ISEL_LINUX: # %bb.0: # %entry 399; X86_ISEL_LINUX-NEXT: movl %gs:0, %eax 400; X86_ISEL_LINUX-NEXT: leal i4@NTPOFF(%eax), %eax 401; X86_ISEL_LINUX-NEXT: retl 402; 403; X64_ISEL_LINUX-LABEL: f8: 404; X64_ISEL_LINUX: # %bb.0: # %entry 405; X64_ISEL_LINUX-NEXT: movq %fs:0, %rax 406; X64_ISEL_LINUX-NEXT: leaq i4@TPOFF(%rax), %rax 407; X64_ISEL_LINUX-NEXT: retq 408; 409; X86_WIN-LABEL: f8: 410; X86_WIN: # %bb.0: # %entry 411; X86_WIN-NEXT: movl __tls_index, %eax 412; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 413; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 414; X86_WIN-NEXT: leal _i4@SECREL32(%eax), %eax 415; X86_WIN-NEXT: retl 416; 417; X64_WIN-LABEL: f8: 418; X64_WIN: # %bb.0: # %entry 419; X64_WIN-NEXT: movl _tls_index(%rip), %eax 420; X64_WIN-NEXT: movq %gs:88, %rcx 421; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 422; X64_WIN-NEXT: leaq i4@SECREL32(%rax), %rax 423; X64_WIN-NEXT: retq 424; 425; MINGW32-LABEL: f8: 426; MINGW32: # %bb.0: # %entry 427; MINGW32-NEXT: movl __tls_index, %eax 428; MINGW32-NEXT: movl %fs:44, %ecx 429; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 430; MINGW32-NEXT: leal _i4@SECREL32(%eax), %eax 431; MINGW32-NEXT: retl 432 433entry: 434 ret ptr @i4 435} 436 437define dso_local i32 @f9() { 438; X86_LINUX-LABEL: f9: 439; X86_LINUX: # %bb.0: # %entry 440; X86_LINUX-NEXT: movl %gs:i5@NTPOFF, %eax 441; X86_LINUX-NEXT: retl 442; 443; X64_LINUX-LABEL: f9: 444; X64_LINUX: # %bb.0: # %entry 445; X64_LINUX-NEXT: movl %fs:i5@TPOFF, %eax 446; X64_LINUX-NEXT: retq 447; 448; X86_ISEL_LINUX-LABEL: f9: 449; X86_ISEL_LINUX: # %bb.0: # %entry 450; X86_ISEL_LINUX-NEXT: movl %gs:i5@NTPOFF, %eax 451; X86_ISEL_LINUX-NEXT: retl 452; 453; X64_ISEL_LINUX-LABEL: f9: 454; X64_ISEL_LINUX: # %bb.0: # %entry 455; X64_ISEL_LINUX-NEXT: movl %fs:i5@TPOFF, %eax 456; X64_ISEL_LINUX-NEXT: retq 457; 458; X86_WIN-LABEL: f9: 459; X86_WIN: # %bb.0: # %entry 460; X86_WIN-NEXT: movl __tls_index, %eax 461; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 462; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 463; X86_WIN-NEXT: movl _i5@SECREL32(%eax), %eax 464; X86_WIN-NEXT: retl 465; 466; X64_WIN-LABEL: f9: 467; X64_WIN: # %bb.0: # %entry 468; X64_WIN-NEXT: movl _tls_index(%rip), %eax 469; X64_WIN-NEXT: movq %gs:88, %rcx 470; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 471; X64_WIN-NEXT: movl i5@SECREL32(%rax), %eax 472; X64_WIN-NEXT: retq 473; 474; MINGW32-LABEL: f9: 475; MINGW32: # %bb.0: # %entry 476; MINGW32-NEXT: movl __tls_index, %eax 477; MINGW32-NEXT: movl %fs:44, %ecx 478; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 479; MINGW32-NEXT: movl _i5@SECREL32(%eax), %eax 480; MINGW32-NEXT: retl 481 482entry: 483 %tmp1 = load i32, ptr @i5 484 ret i32 %tmp1 485} 486 487define dso_local ptr @f10() { 488; X86_LINUX-LABEL: f10: 489; X86_LINUX: # %bb.0: # %entry 490; X86_LINUX-NEXT: movl %gs:0, %eax 491; X86_LINUX-NEXT: leal i5@NTPOFF(%eax), %eax 492; X86_LINUX-NEXT: retl 493; 494; X64_LINUX-LABEL: f10: 495; X64_LINUX: # %bb.0: # %entry 496; X64_LINUX-NEXT: movq %fs:0, %rax 497; X64_LINUX-NEXT: leaq i5@TPOFF(%rax), %rax 498; X64_LINUX-NEXT: retq 499; 500; X86_ISEL_LINUX-LABEL: f10: 501; X86_ISEL_LINUX: # %bb.0: # %entry 502; X86_ISEL_LINUX-NEXT: movl %gs:0, %eax 503; X86_ISEL_LINUX-NEXT: leal i5@NTPOFF(%eax), %eax 504; X86_ISEL_LINUX-NEXT: retl 505; 506; X64_ISEL_LINUX-LABEL: f10: 507; X64_ISEL_LINUX: # %bb.0: # %entry 508; X64_ISEL_LINUX-NEXT: movq %fs:0, %rax 509; X64_ISEL_LINUX-NEXT: leaq i5@TPOFF(%rax), %rax 510; X64_ISEL_LINUX-NEXT: retq 511; 512; X86_WIN-LABEL: f10: 513; X86_WIN: # %bb.0: # %entry 514; X86_WIN-NEXT: movl __tls_index, %eax 515; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 516; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 517; X86_WIN-NEXT: leal _i5@SECREL32(%eax), %eax 518; X86_WIN-NEXT: retl 519; 520; X64_WIN-LABEL: f10: 521; X64_WIN: # %bb.0: # %entry 522; X64_WIN-NEXT: movl _tls_index(%rip), %eax 523; X64_WIN-NEXT: movq %gs:88, %rcx 524; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 525; X64_WIN-NEXT: leaq i5@SECREL32(%rax), %rax 526; X64_WIN-NEXT: retq 527; 528; MINGW32-LABEL: f10: 529; MINGW32: # %bb.0: # %entry 530; MINGW32-NEXT: movl __tls_index, %eax 531; MINGW32-NEXT: movl %fs:44, %ecx 532; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 533; MINGW32-NEXT: leal _i5@SECREL32(%eax), %eax 534; MINGW32-NEXT: retl 535 536entry: 537 ret ptr @i5 538} 539 540define i16 @f11() { 541; X86_LINUX-LABEL: f11: 542; X86_LINUX: # %bb.0: # %entry 543; X86_LINUX-NEXT: movzwl %gs:s1@NTPOFF, %eax 544; X86_LINUX-NEXT: retl 545; 546; X64_LINUX-LABEL: f11: 547; X64_LINUX: # %bb.0: # %entry 548; X64_LINUX-NEXT: movzwl %fs:s1@TPOFF, %eax 549; X64_LINUX-NEXT: retq 550; 551; X86_ISEL_LINUX-LABEL: f11: 552; X86_ISEL_LINUX: # %bb.0: # %entry 553; X86_ISEL_LINUX-NEXT: movzwl %gs:s1@NTPOFF, %eax 554; X86_ISEL_LINUX-NEXT: retl 555; 556; X64_ISEL_LINUX-LABEL: f11: 557; X64_ISEL_LINUX: # %bb.0: # %entry 558; X64_ISEL_LINUX-NEXT: movzwl %fs:s1@TPOFF, %eax 559; X64_ISEL_LINUX-NEXT: retq 560; 561; X86_WIN-LABEL: f11: 562; X86_WIN: # %bb.0: # %entry 563; X86_WIN-NEXT: movl __tls_index, %eax 564; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 565; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 566; X86_WIN-NEXT: movzwl _s1@SECREL32(%eax), %eax 567; X86_WIN-NEXT: retl 568; 569; X64_WIN-LABEL: f11: 570; X64_WIN: # %bb.0: # %entry 571; X64_WIN-NEXT: movl _tls_index(%rip), %eax 572; X64_WIN-NEXT: movq %gs:88, %rcx 573; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 574; X64_WIN-NEXT: movzwl s1@SECREL32(%rax), %eax 575; X64_WIN-NEXT: retq 576; 577; MINGW32-LABEL: f11: 578; MINGW32: # %bb.0: # %entry 579; MINGW32-NEXT: movl __tls_index, %eax 580; MINGW32-NEXT: movl %fs:44, %ecx 581; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 582; MINGW32-NEXT: movzwl _s1@SECREL32(%eax), %eax 583; MINGW32-NEXT: retl 584 585entry: 586 %tmp1 = load i16, ptr @s1 587 ret i16 %tmp1 588} 589 590define dso_local i32 @f12() { 591; X86_LINUX-LABEL: f12: 592; X86_LINUX: # %bb.0: # %entry 593; X86_LINUX-NEXT: movswl %gs:s1@NTPOFF, %eax 594; X86_LINUX-NEXT: retl 595; 596; X64_LINUX-LABEL: f12: 597; X64_LINUX: # %bb.0: # %entry 598; X64_LINUX-NEXT: movswl %fs:s1@TPOFF, %eax 599; X64_LINUX-NEXT: retq 600; 601; X86_ISEL_LINUX-LABEL: f12: 602; X86_ISEL_LINUX: # %bb.0: # %entry 603; X86_ISEL_LINUX-NEXT: movswl %gs:s1@NTPOFF, %eax 604; X86_ISEL_LINUX-NEXT: retl 605; 606; X64_ISEL_LINUX-LABEL: f12: 607; X64_ISEL_LINUX: # %bb.0: # %entry 608; X64_ISEL_LINUX-NEXT: movswl %fs:s1@TPOFF, %eax 609; X64_ISEL_LINUX-NEXT: retq 610; 611; X86_WIN-LABEL: f12: 612; X86_WIN: # %bb.0: # %entry 613; X86_WIN-NEXT: movl __tls_index, %eax 614; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 615; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 616; X86_WIN-NEXT: movswl _s1@SECREL32(%eax), %eax 617; X86_WIN-NEXT: retl 618; 619; X64_WIN-LABEL: f12: 620; X64_WIN: # %bb.0: # %entry 621; X64_WIN-NEXT: movl _tls_index(%rip), %eax 622; X64_WIN-NEXT: movq %gs:88, %rcx 623; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 624; X64_WIN-NEXT: movswl s1@SECREL32(%rax), %eax 625; X64_WIN-NEXT: retq 626; 627; MINGW32-LABEL: f12: 628; MINGW32: # %bb.0: # %entry 629; MINGW32-NEXT: movl __tls_index, %eax 630; MINGW32-NEXT: movl %fs:44, %ecx 631; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 632; MINGW32-NEXT: movswl _s1@SECREL32(%eax), %eax 633; MINGW32-NEXT: retl 634 635 636entry: 637 %tmp1 = load i16, ptr @s1 638 %tmp2 = sext i16 %tmp1 to i32 639 ret i32 %tmp2 640} 641 642define dso_local i8 @f13() { 643; X86_LINUX-LABEL: f13: 644; X86_LINUX: # %bb.0: # %entry 645; X86_LINUX-NEXT: movzbl %gs:b1@NTPOFF, %eax 646; X86_LINUX-NEXT: retl 647; 648; X64_LINUX-LABEL: f13: 649; X64_LINUX: # %bb.0: # %entry 650; X64_LINUX-NEXT: movzbl %fs:b1@TPOFF, %eax 651; X64_LINUX-NEXT: retq 652; 653; X86_ISEL_LINUX-LABEL: f13: 654; X86_ISEL_LINUX: # %bb.0: # %entry 655; X86_ISEL_LINUX-NEXT: movzbl %gs:b1@NTPOFF, %eax 656; X86_ISEL_LINUX-NEXT: retl 657; 658; X64_ISEL_LINUX-LABEL: f13: 659; X64_ISEL_LINUX: # %bb.0: # %entry 660; X64_ISEL_LINUX-NEXT: movzbl %fs:b1@TPOFF, %eax 661; X64_ISEL_LINUX-NEXT: retq 662; 663; X86_WIN-LABEL: f13: 664; X86_WIN: # %bb.0: # %entry 665; X86_WIN-NEXT: movl __tls_index, %eax 666; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 667; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 668; X86_WIN-NEXT: movzbl _b1@SECREL32(%eax), %eax 669; X86_WIN-NEXT: retl 670; 671; X64_WIN-LABEL: f13: 672; X64_WIN: # %bb.0: # %entry 673; X64_WIN-NEXT: movl _tls_index(%rip), %eax 674; X64_WIN-NEXT: movq %gs:88, %rcx 675; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 676; X64_WIN-NEXT: movzbl b1@SECREL32(%rax), %eax 677; X64_WIN-NEXT: retq 678; 679; MINGW32-LABEL: f13: 680; MINGW32: # %bb.0: # %entry 681; MINGW32-NEXT: movl __tls_index, %eax 682; MINGW32-NEXT: movl %fs:44, %ecx 683; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 684; MINGW32-NEXT: movzbl _b1@SECREL32(%eax), %eax 685; MINGW32-NEXT: retl 686 687entry: 688 %tmp1 = load i8, ptr @b1 689 ret i8 %tmp1 690} 691 692define dso_local i32 @f14() { 693; X86_LINUX-LABEL: f14: 694; X86_LINUX: # %bb.0: # %entry 695; X86_LINUX-NEXT: movsbl %gs:b1@NTPOFF, %eax 696; X86_LINUX-NEXT: retl 697; 698; X64_LINUX-LABEL: f14: 699; X64_LINUX: # %bb.0: # %entry 700; X64_LINUX-NEXT: movsbl %fs:b1@TPOFF, %eax 701; X64_LINUX-NEXT: retq 702; 703; X86_ISEL_LINUX-LABEL: f14: 704; X86_ISEL_LINUX: # %bb.0: # %entry 705; X86_ISEL_LINUX-NEXT: movsbl %gs:b1@NTPOFF, %eax 706; X86_ISEL_LINUX-NEXT: retl 707; 708; X64_ISEL_LINUX-LABEL: f14: 709; X64_ISEL_LINUX: # %bb.0: # %entry 710; X64_ISEL_LINUX-NEXT: movsbl %fs:b1@TPOFF, %eax 711; X64_ISEL_LINUX-NEXT: retq 712; 713; X86_WIN-LABEL: f14: 714; X86_WIN: # %bb.0: # %entry 715; X86_WIN-NEXT: movl __tls_index, %eax 716; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 717; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 718; X86_WIN-NEXT: movsbl _b1@SECREL32(%eax), %eax 719; X86_WIN-NEXT: retl 720; 721; X64_WIN-LABEL: f14: 722; X64_WIN: # %bb.0: # %entry 723; X64_WIN-NEXT: movl _tls_index(%rip), %eax 724; X64_WIN-NEXT: movq %gs:88, %rcx 725; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 726; X64_WIN-NEXT: movsbl b1@SECREL32(%rax), %eax 727; X64_WIN-NEXT: retq 728; 729; MINGW32-LABEL: f14: 730; MINGW32: # %bb.0: # %entry 731; MINGW32-NEXT: movl __tls_index, %eax 732; MINGW32-NEXT: movl %fs:44, %ecx 733; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 734; MINGW32-NEXT: movsbl _b1@SECREL32(%eax), %eax 735; MINGW32-NEXT: retl 736 737entry: 738 %tmp1 = load i8, ptr @b1 739 %tmp2 = sext i8 %tmp1 to i32 740 ret i32 %tmp2 741} 742 743define dso_local ptr @f15() { 744; X86_LINUX-LABEL: f15: 745; X86_LINUX: # %bb.0: # %entry 746; X86_LINUX-NEXT: movl %gs:0, %eax 747; X86_LINUX-NEXT: leal b2@NTPOFF(%eax), %eax 748; X86_LINUX-NEXT: retl 749; 750; X64_LINUX-LABEL: f15: 751; X64_LINUX: # %bb.0: # %entry 752; X64_LINUX-NEXT: movq %fs:0, %rax 753; X64_LINUX-NEXT: leaq b2@TPOFF(%rax), %rax 754; X64_LINUX-NEXT: retq 755; 756; X86_ISEL_LINUX-LABEL: f15: 757; X86_ISEL_LINUX: # %bb.0: # %entry 758; X86_ISEL_LINUX-NEXT: movl %gs:0, %eax 759; X86_ISEL_LINUX-NEXT: leal b2@NTPOFF(%eax), %eax 760; X86_ISEL_LINUX-NEXT: retl 761; 762; X64_ISEL_LINUX-LABEL: f15: 763; X64_ISEL_LINUX: # %bb.0: # %entry 764; X64_ISEL_LINUX-NEXT: movq %fs:0, %rax 765; X64_ISEL_LINUX-NEXT: leaq b2@TPOFF(%rax), %rax 766; X64_ISEL_LINUX-NEXT: retq 767; 768; X86_WIN-LABEL: f15: 769; X86_WIN: # %bb.0: # %entry 770; X86_WIN-NEXT: movl %fs:__tls_array, %eax 771; X86_WIN-NEXT: movl (%eax), %eax 772; X86_WIN-NEXT: leal _b2@SECREL32(%eax), %eax 773; X86_WIN-NEXT: retl 774; 775; X64_WIN-LABEL: f15: 776; X64_WIN: # %bb.0: # %entry 777; X64_WIN-NEXT: movq %gs:88, %rax 778; X64_WIN-NEXT: movq (%rax), %rax 779; X64_WIN-NEXT: leaq b2@SECREL32(%rax), %rax 780; X64_WIN-NEXT: retq 781; 782; MINGW32-LABEL: f15: 783; MINGW32: # %bb.0: # %entry 784; MINGW32-NEXT: movl %fs:44, %eax 785; MINGW32-NEXT: movl (%eax), %eax 786; MINGW32-NEXT: leal _b2@SECREL32(%eax), %eax 787; MINGW32-NEXT: retl 788entry: 789 ret ptr @b2 790} 791 792 793define dso_local ptr @f16() { 794; X86_LINUX-LABEL: f16: 795; X86_LINUX: # %bb.0: 796; X86_LINUX-NEXT: movl %gs:0, %eax 797; X86_LINUX-NEXT: leal i6@NTPOFF(%eax), %eax 798; X86_LINUX-NEXT: retl 799; 800; X64_LINUX-LABEL: f16: 801; X64_LINUX: # %bb.0: 802; X64_LINUX-NEXT: movq %fs:0, %rax 803; X64_LINUX-NEXT: leaq i6@TPOFF(%rax), %rax 804; X64_LINUX-NEXT: retq 805; 806; X86_ISEL_LINUX-LABEL: f16: 807; X86_ISEL_LINUX: # %bb.0: 808; X86_ISEL_LINUX-NEXT: movl %gs:0, %eax 809; X86_ISEL_LINUX-NEXT: leal i6@NTPOFF(%eax), %eax 810; X86_ISEL_LINUX-NEXT: retl 811; 812; X64_ISEL_LINUX-LABEL: f16: 813; X64_ISEL_LINUX: # %bb.0: 814; X64_ISEL_LINUX-NEXT: movq %fs:0, %rax 815; X64_ISEL_LINUX-NEXT: leaq i6@TPOFF(%rax), %rax 816; X64_ISEL_LINUX-NEXT: retq 817; 818; X86_WIN-LABEL: f16: 819; X86_WIN: # %bb.0: 820; X86_WIN-NEXT: movl __tls_index, %eax 821; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 822; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 823; X86_WIN-NEXT: leal _i6@SECREL32(%eax), %eax 824; X86_WIN-NEXT: retl 825; 826; X64_WIN-LABEL: f16: 827; X64_WIN: # %bb.0: 828; X64_WIN-NEXT: movl _tls_index(%rip), %eax 829; X64_WIN-NEXT: movq %gs:88, %rcx 830; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 831; X64_WIN-NEXT: leaq i6@SECREL32(%rax), %rax 832; X64_WIN-NEXT: retq 833; 834; MINGW32-LABEL: f16: 835; MINGW32: # %bb.0: 836; MINGW32-NEXT: movl __tls_index, %eax 837; MINGW32-NEXT: movl %fs:44, %ecx 838; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 839; MINGW32-NEXT: leal _i6@SECREL32(%eax), %eax 840; MINGW32-NEXT: retl 841 842 843 ret ptr @i6 844} 845 846; NOTE: Similar to f1() but with direct TLS segment access disabled 847define dso_local i32 @f17() #0 { 848; X86_LINUX-LABEL: f17: 849; X86_LINUX: # %bb.0: # %entry 850; X86_LINUX-NEXT: movl %gs:0, %eax 851; X86_LINUX-NEXT: movl i1@NTPOFF(%eax), %eax 852; X86_LINUX-NEXT: retl 853; 854; X64_LINUX-LABEL: f17: 855; X64_LINUX: # %bb.0: # %entry 856; X64_LINUX-NEXT: movq %fs:0, %rax 857; X64_LINUX-NEXT: movl i1@TPOFF(%rax), %eax 858; X64_LINUX-NEXT: retq 859; 860; X86_ISEL_LINUX-LABEL: f17: 861; X86_ISEL_LINUX: # %bb.0: # %entry 862; X86_ISEL_LINUX-NEXT: movl %gs:0, %eax 863; X86_ISEL_LINUX-NEXT: movl i1@NTPOFF(%eax), %eax 864; X86_ISEL_LINUX-NEXT: retl 865; 866; X64_ISEL_LINUX-LABEL: f17: 867; X64_ISEL_LINUX: # %bb.0: # %entry 868; X64_ISEL_LINUX-NEXT: movq %fs:0, %rax 869; X64_ISEL_LINUX-NEXT: movl i1@TPOFF(%rax), %eax 870; X64_ISEL_LINUX-NEXT: retq 871; 872; X86_WIN-LABEL: f17: 873; X86_WIN: # %bb.0: # %entry 874; X86_WIN-NEXT: movl __tls_index, %eax 875; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 876; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 877; X86_WIN-NEXT: movl _i1@SECREL32(%eax), %eax 878; X86_WIN-NEXT: retl 879; 880; X64_WIN-LABEL: f17: 881; X64_WIN: # %bb.0: # %entry 882; X64_WIN-NEXT: movl _tls_index(%rip), %eax 883; X64_WIN-NEXT: movq %gs:88, %rcx 884; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 885; X64_WIN-NEXT: movl i1@SECREL32(%rax), %eax 886; X64_WIN-NEXT: retq 887; 888; MINGW32-LABEL: f17: 889; MINGW32: # %bb.0: # %entry 890; MINGW32-NEXT: movl __tls_index, %eax 891; MINGW32-NEXT: movl %fs:44, %ecx 892; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 893; MINGW32-NEXT: movl _i1@SECREL32(%eax), %eax 894; MINGW32-NEXT: retl 895 896entry: 897 %tmp1 = load i32, ptr @i1 898 ret i32 %tmp1 899} 900 901; NOTE: Similar to f3() but with direct TLS segment access disabled 902define dso_local i32 @f18() #1 { 903; X86_LINUX-LABEL: f18: 904; X86_LINUX: # %bb.0: # %entry 905; X86_LINUX-NEXT: movl i2@INDNTPOFF, %eax 906; X86_LINUX-NEXT: movl %gs:0, %ecx 907; X86_LINUX-NEXT: movl (%ecx,%eax), %eax 908; X86_LINUX-NEXT: retl 909; 910; X64_LINUX-LABEL: f18: 911; X64_LINUX: # %bb.0: # %entry 912; X64_LINUX-NEXT: movq i2@GOTTPOFF(%rip), %rax 913; X64_LINUX-NEXT: movq %fs:0, %rcx 914; X64_LINUX-NEXT: movl (%rcx,%rax), %eax 915; X64_LINUX-NEXT: retq 916; 917; X86_ISEL_LINUX-LABEL: f18: 918; X86_ISEL_LINUX: # %bb.0: # %entry 919; X86_ISEL_LINUX-NEXT: movl i2@INDNTPOFF, %eax 920; X86_ISEL_LINUX-NEXT: movl %gs:0, %ecx 921; X86_ISEL_LINUX-NEXT: movl (%ecx,%eax), %eax 922; X86_ISEL_LINUX-NEXT: retl 923; 924; X64_ISEL_LINUX-LABEL: f18: 925; X64_ISEL_LINUX: # %bb.0: # %entry 926; X64_ISEL_LINUX-NEXT: movq i2@GOTTPOFF(%rip), %rax 927; X64_ISEL_LINUX-NEXT: movq %fs:0, %rcx 928; X64_ISEL_LINUX-NEXT: movl (%rcx,%rax), %eax 929; X64_ISEL_LINUX-NEXT: retq 930; 931; X86_WIN-LABEL: f18: 932; X86_WIN: # %bb.0: # %entry 933; X86_WIN-NEXT: movl __tls_index, %eax 934; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 935; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 936; X86_WIN-NEXT: movl _i2@SECREL32(%eax), %eax 937; X86_WIN-NEXT: retl 938; 939; X64_WIN-LABEL: f18: 940; X64_WIN: # %bb.0: # %entry 941; X64_WIN-NEXT: movl _tls_index(%rip), %eax 942; X64_WIN-NEXT: movq %gs:88, %rcx 943; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 944; X64_WIN-NEXT: movl i2@SECREL32(%rax), %eax 945; X64_WIN-NEXT: retq 946; 947; MINGW32-LABEL: f18: 948; MINGW32: # %bb.0: # %entry 949; MINGW32-NEXT: movl __tls_index, %eax 950; MINGW32-NEXT: movl %fs:44, %ecx 951; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 952; MINGW32-NEXT: movl _i2@SECREL32(%eax), %eax 953; MINGW32-NEXT: retl 954 955 956entry: 957 %tmp1 = load i32, ptr @i2 958 ret i32 %tmp1 959} 960 961attributes #0 = { "indirect-tls-seg-refs" } 962attributes #1 = { nounwind "indirect-tls-seg-refs" } 963