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_LINUX %s 5; RUN: llc < %s -mtriple=x86_64-linux-gnu -fast-isel | FileCheck -check-prefix=X64_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_WIN-LABEL: f1: 33; X86_WIN: # %bb.0: # %entry 34; X86_WIN-NEXT: movl __tls_index, %eax 35; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 36; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 37; X86_WIN-NEXT: movl _i1@SECREL32(%eax), %eax 38; X86_WIN-NEXT: retl 39; 40; X64_WIN-LABEL: f1: 41; X64_WIN: # %bb.0: # %entry 42; X64_WIN-NEXT: movl _tls_index(%rip), %eax 43; X64_WIN-NEXT: movq %gs:88, %rcx 44; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 45; X64_WIN-NEXT: movl i1@SECREL32(%rax), %eax 46; X64_WIN-NEXT: retq 47; 48; MINGW32-LABEL: f1: 49; MINGW32: # %bb.0: # %entry 50; MINGW32-NEXT: movl __tls_index, %eax 51; MINGW32-NEXT: movl %fs:44, %ecx 52; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 53; MINGW32-NEXT: movl _i1@SECREL32(%eax), %eax 54; MINGW32-NEXT: retl 55 56entry: 57 %tmp1 = load i32, ptr @i1 58 ret i32 %tmp1 59} 60 61define dso_local ptr @f2() { 62; X86_LINUX-LABEL: f2: 63; X86_LINUX: # %bb.0: # %entry 64; X86_LINUX-NEXT: movl %gs:0, %eax 65; X86_LINUX-NEXT: leal i1@NTPOFF(%eax), %eax 66; X86_LINUX-NEXT: retl 67; 68; X64_LINUX-LABEL: f2: 69; X64_LINUX: # %bb.0: # %entry 70; X64_LINUX-NEXT: movq %fs:0, %rax 71; X64_LINUX-NEXT: leaq i1@TPOFF(%rax), %rax 72; X64_LINUX-NEXT: retq 73; 74; X86_WIN-LABEL: f2: 75; X86_WIN: # %bb.0: # %entry 76; X86_WIN-NEXT: movl __tls_index, %eax 77; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 78; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 79; X86_WIN-NEXT: leal _i1@SECREL32(%eax), %eax 80; X86_WIN-NEXT: retl 81; 82; X64_WIN-LABEL: f2: 83; X64_WIN: # %bb.0: # %entry 84; X64_WIN-NEXT: movl _tls_index(%rip), %eax 85; X64_WIN-NEXT: movq %gs:88, %rcx 86; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 87; X64_WIN-NEXT: leaq i1@SECREL32(%rax), %rax 88; X64_WIN-NEXT: retq 89; 90; MINGW32-LABEL: f2: 91; MINGW32: # %bb.0: # %entry 92; MINGW32-NEXT: movl __tls_index, %eax 93; MINGW32-NEXT: movl %fs:44, %ecx 94; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 95; MINGW32-NEXT: leal _i1@SECREL32(%eax), %eax 96; MINGW32-NEXT: retl 97 98entry: 99 ret ptr @i1 100} 101 102define dso_local i32 @f3() nounwind { 103; X86_LINUX-LABEL: f3: 104; X86_LINUX: # %bb.0: # %entry 105; X86_LINUX-NEXT: movl i2@INDNTPOFF, %eax 106; X86_LINUX-NEXT: movl %gs:(%eax), %eax 107; X86_LINUX-NEXT: retl 108; 109; X64_LINUX-LABEL: f3: 110; X64_LINUX: # %bb.0: # %entry 111; X64_LINUX-NEXT: movq i2@GOTTPOFF(%rip), %rax 112; X64_LINUX-NEXT: movl %fs:(%rax), %eax 113; X64_LINUX-NEXT: retq 114; 115; X86_WIN-LABEL: f3: 116; X86_WIN: # %bb.0: # %entry 117; X86_WIN-NEXT: movl __tls_index, %eax 118; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 119; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 120; X86_WIN-NEXT: movl _i2@SECREL32(%eax), %eax 121; X86_WIN-NEXT: retl 122; 123; X64_WIN-LABEL: f3: 124; X64_WIN: # %bb.0: # %entry 125; X64_WIN-NEXT: movl _tls_index(%rip), %eax 126; X64_WIN-NEXT: movq %gs:88, %rcx 127; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 128; X64_WIN-NEXT: movl i2@SECREL32(%rax), %eax 129; X64_WIN-NEXT: retq 130; 131; MINGW32-LABEL: f3: 132; MINGW32: # %bb.0: # %entry 133; MINGW32-NEXT: movl __tls_index, %eax 134; MINGW32-NEXT: movl %fs:44, %ecx 135; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 136; MINGW32-NEXT: movl _i2@SECREL32(%eax), %eax 137; MINGW32-NEXT: retl 138 139entry: 140 %tmp1 = load i32, ptr @i2 141 ret i32 %tmp1 142} 143 144define dso_local ptr @f4() { 145; X86_LINUX-LABEL: f4: 146; X86_LINUX: # %bb.0: # %entry 147; X86_LINUX-NEXT: movl %gs:0, %eax 148; X86_LINUX-NEXT: addl i2@INDNTPOFF, %eax 149; X86_LINUX-NEXT: retl 150; 151; X64_LINUX-LABEL: f4: 152; X64_LINUX: # %bb.0: # %entry 153; X64_LINUX-NEXT: movq %fs:0, %rax 154; X64_LINUX-NEXT: addq i2@GOTTPOFF(%rip), %rax 155; X64_LINUX-NEXT: retq 156; 157; X86_WIN-LABEL: f4: 158; X86_WIN: # %bb.0: # %entry 159; X86_WIN-NEXT: movl __tls_index, %eax 160; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 161; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 162; X86_WIN-NEXT: leal _i2@SECREL32(%eax), %eax 163; X86_WIN-NEXT: retl 164; 165; X64_WIN-LABEL: f4: 166; X64_WIN: # %bb.0: # %entry 167; X64_WIN-NEXT: movl _tls_index(%rip), %eax 168; X64_WIN-NEXT: movq %gs:88, %rcx 169; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 170; X64_WIN-NEXT: leaq i2@SECREL32(%rax), %rax 171; X64_WIN-NEXT: retq 172; 173; MINGW32-LABEL: f4: 174; MINGW32: # %bb.0: # %entry 175; MINGW32-NEXT: movl __tls_index, %eax 176; MINGW32-NEXT: movl %fs:44, %ecx 177; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 178; MINGW32-NEXT: leal _i2@SECREL32(%eax), %eax 179; MINGW32-NEXT: retl 180 181entry: 182 ret ptr @i2 183} 184 185define dso_local i32 @f5() nounwind { 186; X86_LINUX-LABEL: f5: 187; X86_LINUX: # %bb.0: # %entry 188; X86_LINUX-NEXT: movl %gs:i3@NTPOFF, %eax 189; X86_LINUX-NEXT: retl 190; 191; X64_LINUX-LABEL: f5: 192; X64_LINUX: # %bb.0: # %entry 193; X64_LINUX-NEXT: movl %fs:i3@TPOFF, %eax 194; X64_LINUX-NEXT: retq 195; 196; X86_WIN-LABEL: f5: 197; X86_WIN: # %bb.0: # %entry 198; X86_WIN-NEXT: movl __tls_index, %eax 199; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 200; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 201; X86_WIN-NEXT: movl _i3@SECREL32(%eax), %eax 202; X86_WIN-NEXT: retl 203; 204; X64_WIN-LABEL: f5: 205; X64_WIN: # %bb.0: # %entry 206; X64_WIN-NEXT: movl _tls_index(%rip), %eax 207; X64_WIN-NEXT: movq %gs:88, %rcx 208; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 209; X64_WIN-NEXT: movl i3@SECREL32(%rax), %eax 210; X64_WIN-NEXT: retq 211; 212; MINGW32-LABEL: f5: 213; MINGW32: # %bb.0: # %entry 214; MINGW32-NEXT: movl __tls_index, %eax 215; MINGW32-NEXT: movl %fs:44, %ecx 216; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 217; MINGW32-NEXT: movl _i3@SECREL32(%eax), %eax 218; MINGW32-NEXT: retl 219 220entry: 221 %tmp1 = load i32, ptr @i3 222 ret i32 %tmp1 223} 224 225define dso_local ptr @f6() { 226; X86_LINUX-LABEL: f6: 227; X86_LINUX: # %bb.0: # %entry 228; X86_LINUX-NEXT: movl %gs:0, %eax 229; X86_LINUX-NEXT: leal i3@NTPOFF(%eax), %eax 230; X86_LINUX-NEXT: retl 231; 232; X64_LINUX-LABEL: f6: 233; X64_LINUX: # %bb.0: # %entry 234; X64_LINUX-NEXT: movq %fs:0, %rax 235; X64_LINUX-NEXT: leaq i3@TPOFF(%rax), %rax 236; X64_LINUX-NEXT: retq 237; 238; X86_WIN-LABEL: f6: 239; X86_WIN: # %bb.0: # %entry 240; X86_WIN-NEXT: movl __tls_index, %eax 241; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 242; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 243; X86_WIN-NEXT: leal _i3@SECREL32(%eax), %eax 244; X86_WIN-NEXT: retl 245; 246; X64_WIN-LABEL: f6: 247; X64_WIN: # %bb.0: # %entry 248; X64_WIN-NEXT: movl _tls_index(%rip), %eax 249; X64_WIN-NEXT: movq %gs:88, %rcx 250; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 251; X64_WIN-NEXT: leaq i3@SECREL32(%rax), %rax 252; X64_WIN-NEXT: retq 253; 254; MINGW32-LABEL: f6: 255; MINGW32: # %bb.0: # %entry 256; MINGW32-NEXT: movl __tls_index, %eax 257; MINGW32-NEXT: movl %fs:44, %ecx 258; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 259; MINGW32-NEXT: leal _i3@SECREL32(%eax), %eax 260; MINGW32-NEXT: retl 261 262entry: 263 ret ptr @i3 264} 265 266define dso_local i32 @f7() { 267; X86_LINUX-LABEL: f7: 268; X86_LINUX: # %bb.0: # %entry 269; X86_LINUX-NEXT: movl %gs:i4@NTPOFF, %eax 270; X86_LINUX-NEXT: retl 271; 272; X64_LINUX-LABEL: f7: 273; X64_LINUX: # %bb.0: # %entry 274; X64_LINUX-NEXT: movl %fs:i4@TPOFF, %eax 275; X64_LINUX-NEXT: retq 276; 277; X86_WIN-LABEL: f7: 278; X86_WIN: # %bb.0: # %entry 279; X86_WIN-NEXT: movl __tls_index, %eax 280; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 281; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 282; X86_WIN-NEXT: movl _i4@SECREL32(%eax), %eax 283; X86_WIN-NEXT: retl 284; 285; X64_WIN-LABEL: f7: 286; X64_WIN: # %bb.0: # %entry 287; X64_WIN-NEXT: movl _tls_index(%rip), %eax 288; X64_WIN-NEXT: movq %gs:88, %rcx 289; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 290; X64_WIN-NEXT: movl i4@SECREL32(%rax), %eax 291; X64_WIN-NEXT: retq 292; 293; MINGW32-LABEL: f7: 294; MINGW32: # %bb.0: # %entry 295; MINGW32-NEXT: movl __tls_index, %eax 296; MINGW32-NEXT: movl %fs:44, %ecx 297; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 298; MINGW32-NEXT: movl _i4@SECREL32(%eax), %eax 299; MINGW32-NEXT: retl 300 301entry: 302 %tmp1 = load i32, ptr @i4 303 ret i32 %tmp1 304} 305 306define dso_local ptr @f8() { 307; X86_LINUX-LABEL: f8: 308; X86_LINUX: # %bb.0: # %entry 309; X86_LINUX-NEXT: movl %gs:0, %eax 310; X86_LINUX-NEXT: leal i4@NTPOFF(%eax), %eax 311; X86_LINUX-NEXT: retl 312; 313; X64_LINUX-LABEL: f8: 314; X64_LINUX: # %bb.0: # %entry 315; X64_LINUX-NEXT: movq %fs:0, %rax 316; X64_LINUX-NEXT: leaq i4@TPOFF(%rax), %rax 317; X64_LINUX-NEXT: retq 318; 319; X86_WIN-LABEL: f8: 320; X86_WIN: # %bb.0: # %entry 321; X86_WIN-NEXT: movl __tls_index, %eax 322; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 323; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 324; X86_WIN-NEXT: leal _i4@SECREL32(%eax), %eax 325; X86_WIN-NEXT: retl 326; 327; X64_WIN-LABEL: f8: 328; X64_WIN: # %bb.0: # %entry 329; X64_WIN-NEXT: movl _tls_index(%rip), %eax 330; X64_WIN-NEXT: movq %gs:88, %rcx 331; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 332; X64_WIN-NEXT: leaq i4@SECREL32(%rax), %rax 333; X64_WIN-NEXT: retq 334; 335; MINGW32-LABEL: f8: 336; MINGW32: # %bb.0: # %entry 337; MINGW32-NEXT: movl __tls_index, %eax 338; MINGW32-NEXT: movl %fs:44, %ecx 339; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 340; MINGW32-NEXT: leal _i4@SECREL32(%eax), %eax 341; MINGW32-NEXT: retl 342 343entry: 344 ret ptr @i4 345} 346 347define dso_local i32 @f9() { 348; X86_LINUX-LABEL: f9: 349; X86_LINUX: # %bb.0: # %entry 350; X86_LINUX-NEXT: movl %gs:i5@NTPOFF, %eax 351; X86_LINUX-NEXT: retl 352; 353; X64_LINUX-LABEL: f9: 354; X64_LINUX: # %bb.0: # %entry 355; X64_LINUX-NEXT: movl %fs:i5@TPOFF, %eax 356; X64_LINUX-NEXT: retq 357; 358; X86_WIN-LABEL: f9: 359; X86_WIN: # %bb.0: # %entry 360; X86_WIN-NEXT: movl __tls_index, %eax 361; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 362; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 363; X86_WIN-NEXT: movl _i5@SECREL32(%eax), %eax 364; X86_WIN-NEXT: retl 365; 366; X64_WIN-LABEL: f9: 367; X64_WIN: # %bb.0: # %entry 368; X64_WIN-NEXT: movl _tls_index(%rip), %eax 369; X64_WIN-NEXT: movq %gs:88, %rcx 370; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 371; X64_WIN-NEXT: movl i5@SECREL32(%rax), %eax 372; X64_WIN-NEXT: retq 373; 374; MINGW32-LABEL: f9: 375; MINGW32: # %bb.0: # %entry 376; MINGW32-NEXT: movl __tls_index, %eax 377; MINGW32-NEXT: movl %fs:44, %ecx 378; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 379; MINGW32-NEXT: movl _i5@SECREL32(%eax), %eax 380; MINGW32-NEXT: retl 381 382entry: 383 %tmp1 = load i32, ptr @i5 384 ret i32 %tmp1 385} 386 387define dso_local ptr @f10() { 388; X86_LINUX-LABEL: f10: 389; X86_LINUX: # %bb.0: # %entry 390; X86_LINUX-NEXT: movl %gs:0, %eax 391; X86_LINUX-NEXT: leal i5@NTPOFF(%eax), %eax 392; X86_LINUX-NEXT: retl 393; 394; X64_LINUX-LABEL: f10: 395; X64_LINUX: # %bb.0: # %entry 396; X64_LINUX-NEXT: movq %fs:0, %rax 397; X64_LINUX-NEXT: leaq i5@TPOFF(%rax), %rax 398; X64_LINUX-NEXT: retq 399; 400; X86_WIN-LABEL: f10: 401; X86_WIN: # %bb.0: # %entry 402; X86_WIN-NEXT: movl __tls_index, %eax 403; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 404; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 405; X86_WIN-NEXT: leal _i5@SECREL32(%eax), %eax 406; X86_WIN-NEXT: retl 407; 408; X64_WIN-LABEL: f10: 409; X64_WIN: # %bb.0: # %entry 410; X64_WIN-NEXT: movl _tls_index(%rip), %eax 411; X64_WIN-NEXT: movq %gs:88, %rcx 412; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 413; X64_WIN-NEXT: leaq i5@SECREL32(%rax), %rax 414; X64_WIN-NEXT: retq 415; 416; MINGW32-LABEL: f10: 417; MINGW32: # %bb.0: # %entry 418; MINGW32-NEXT: movl __tls_index, %eax 419; MINGW32-NEXT: movl %fs:44, %ecx 420; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 421; MINGW32-NEXT: leal _i5@SECREL32(%eax), %eax 422; MINGW32-NEXT: retl 423 424entry: 425 ret ptr @i5 426} 427 428define i16 @f11() { 429; X86_LINUX-LABEL: f11: 430; X86_LINUX: # %bb.0: # %entry 431; X86_LINUX-NEXT: movzwl %gs:s1@NTPOFF, %eax 432; X86_LINUX-NEXT: retl 433; 434; X64_LINUX-LABEL: f11: 435; X64_LINUX: # %bb.0: # %entry 436; X64_LINUX-NEXT: movzwl %fs:s1@TPOFF, %eax 437; X64_LINUX-NEXT: retq 438; 439; X86_WIN-LABEL: f11: 440; X86_WIN: # %bb.0: # %entry 441; X86_WIN-NEXT: movl __tls_index, %eax 442; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 443; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 444; X86_WIN-NEXT: movzwl _s1@SECREL32(%eax), %eax 445; X86_WIN-NEXT: retl 446; 447; X64_WIN-LABEL: f11: 448; X64_WIN: # %bb.0: # %entry 449; X64_WIN-NEXT: movl _tls_index(%rip), %eax 450; X64_WIN-NEXT: movq %gs:88, %rcx 451; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 452; X64_WIN-NEXT: movzwl s1@SECREL32(%rax), %eax 453; X64_WIN-NEXT: retq 454; 455; MINGW32-LABEL: f11: 456; MINGW32: # %bb.0: # %entry 457; MINGW32-NEXT: movl __tls_index, %eax 458; MINGW32-NEXT: movl %fs:44, %ecx 459; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 460; MINGW32-NEXT: movzwl _s1@SECREL32(%eax), %eax 461; MINGW32-NEXT: retl 462 463entry: 464 %tmp1 = load i16, ptr @s1 465 ret i16 %tmp1 466} 467 468define dso_local i32 @f12() { 469; X86_LINUX-LABEL: f12: 470; X86_LINUX: # %bb.0: # %entry 471; X86_LINUX-NEXT: movswl %gs:s1@NTPOFF, %eax 472; X86_LINUX-NEXT: retl 473; 474; X64_LINUX-LABEL: f12: 475; X64_LINUX: # %bb.0: # %entry 476; X64_LINUX-NEXT: movswl %fs:s1@TPOFF, %eax 477; X64_LINUX-NEXT: retq 478; 479; X86_WIN-LABEL: f12: 480; X86_WIN: # %bb.0: # %entry 481; X86_WIN-NEXT: movl __tls_index, %eax 482; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 483; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 484; X86_WIN-NEXT: movswl _s1@SECREL32(%eax), %eax 485; X86_WIN-NEXT: retl 486; 487; X64_WIN-LABEL: f12: 488; X64_WIN: # %bb.0: # %entry 489; X64_WIN-NEXT: movl _tls_index(%rip), %eax 490; X64_WIN-NEXT: movq %gs:88, %rcx 491; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 492; X64_WIN-NEXT: movswl s1@SECREL32(%rax), %eax 493; X64_WIN-NEXT: retq 494; 495; MINGW32-LABEL: f12: 496; MINGW32: # %bb.0: # %entry 497; MINGW32-NEXT: movl __tls_index, %eax 498; MINGW32-NEXT: movl %fs:44, %ecx 499; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 500; MINGW32-NEXT: movswl _s1@SECREL32(%eax), %eax 501; MINGW32-NEXT: retl 502 503 504entry: 505 %tmp1 = load i16, ptr @s1 506 %tmp2 = sext i16 %tmp1 to i32 507 ret i32 %tmp2 508} 509 510define dso_local i8 @f13() { 511; X86_LINUX-LABEL: f13: 512; X86_LINUX: # %bb.0: # %entry 513; X86_LINUX-NEXT: movzbl %gs:b1@NTPOFF, %eax 514; X86_LINUX-NEXT: retl 515; 516; X64_LINUX-LABEL: f13: 517; X64_LINUX: # %bb.0: # %entry 518; X64_LINUX-NEXT: movzbl %fs:b1@TPOFF, %eax 519; X64_LINUX-NEXT: retq 520; 521; X86_WIN-LABEL: f13: 522; X86_WIN: # %bb.0: # %entry 523; X86_WIN-NEXT: movl __tls_index, %eax 524; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 525; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 526; X86_WIN-NEXT: movzbl _b1@SECREL32(%eax), %eax 527; X86_WIN-NEXT: retl 528; 529; X64_WIN-LABEL: f13: 530; X64_WIN: # %bb.0: # %entry 531; X64_WIN-NEXT: movl _tls_index(%rip), %eax 532; X64_WIN-NEXT: movq %gs:88, %rcx 533; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 534; X64_WIN-NEXT: movzbl b1@SECREL32(%rax), %eax 535; X64_WIN-NEXT: retq 536; 537; MINGW32-LABEL: f13: 538; MINGW32: # %bb.0: # %entry 539; MINGW32-NEXT: movl __tls_index, %eax 540; MINGW32-NEXT: movl %fs:44, %ecx 541; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 542; MINGW32-NEXT: movzbl _b1@SECREL32(%eax), %eax 543; MINGW32-NEXT: retl 544 545entry: 546 %tmp1 = load i8, ptr @b1 547 ret i8 %tmp1 548} 549 550define dso_local i32 @f14() { 551; X86_LINUX-LABEL: f14: 552; X86_LINUX: # %bb.0: # %entry 553; X86_LINUX-NEXT: movsbl %gs:b1@NTPOFF, %eax 554; X86_LINUX-NEXT: retl 555; 556; X64_LINUX-LABEL: f14: 557; X64_LINUX: # %bb.0: # %entry 558; X64_LINUX-NEXT: movsbl %fs:b1@TPOFF, %eax 559; X64_LINUX-NEXT: retq 560; 561; X86_WIN-LABEL: f14: 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: movsbl _b1@SECREL32(%eax), %eax 567; X86_WIN-NEXT: retl 568; 569; X64_WIN-LABEL: f14: 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: movsbl b1@SECREL32(%rax), %eax 575; X64_WIN-NEXT: retq 576; 577; MINGW32-LABEL: f14: 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: movsbl _b1@SECREL32(%eax), %eax 583; MINGW32-NEXT: retl 584 585entry: 586 %tmp1 = load i8, ptr @b1 587 %tmp2 = sext i8 %tmp1 to i32 588 ret i32 %tmp2 589} 590 591define dso_local ptr @f15() { 592; X86_LINUX-LABEL: f15: 593; X86_LINUX: # %bb.0: # %entry 594; X86_LINUX-NEXT: movl %gs:0, %eax 595; X86_LINUX-NEXT: leal b2@NTPOFF(%eax), %eax 596; X86_LINUX-NEXT: retl 597; 598; X64_LINUX-LABEL: f15: 599; X64_LINUX: # %bb.0: # %entry 600; X64_LINUX-NEXT: movq %fs:0, %rax 601; X64_LINUX-NEXT: leaq b2@TPOFF(%rax), %rax 602; X64_LINUX-NEXT: retq 603; 604; X86_WIN-LABEL: f15: 605; X86_WIN: # %bb.0: # %entry 606; X86_WIN-NEXT: movl %fs:__tls_array, %eax 607; X86_WIN-NEXT: movl (%eax), %eax 608; X86_WIN-NEXT: leal _b2@SECREL32(%eax), %eax 609; X86_WIN-NEXT: retl 610; 611; X64_WIN-LABEL: f15: 612; X64_WIN: # %bb.0: # %entry 613; X64_WIN-NEXT: movq %gs:88, %rax 614; X64_WIN-NEXT: movq (%rax), %rax 615; X64_WIN-NEXT: leaq b2@SECREL32(%rax), %rax 616; X64_WIN-NEXT: retq 617; 618; MINGW32-LABEL: f15: 619; MINGW32: # %bb.0: # %entry 620; MINGW32-NEXT: movl %fs:44, %eax 621; MINGW32-NEXT: movl (%eax), %eax 622; MINGW32-NEXT: leal _b2@SECREL32(%eax), %eax 623; MINGW32-NEXT: retl 624entry: 625 ret ptr @b2 626} 627 628 629define dso_local ptr @f16() { 630; X86_LINUX-LABEL: f16: 631; X86_LINUX: # %bb.0: 632; X86_LINUX-NEXT: movl %gs:0, %eax 633; X86_LINUX-NEXT: leal i6@NTPOFF(%eax), %eax 634; X86_LINUX-NEXT: retl 635; 636; X64_LINUX-LABEL: f16: 637; X64_LINUX: # %bb.0: 638; X64_LINUX-NEXT: movq %fs:0, %rax 639; X64_LINUX-NEXT: leaq i6@TPOFF(%rax), %rax 640; X64_LINUX-NEXT: retq 641; 642; X86_WIN-LABEL: f16: 643; X86_WIN: # %bb.0: 644; X86_WIN-NEXT: movl __tls_index, %eax 645; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 646; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 647; X86_WIN-NEXT: leal _i6@SECREL32(%eax), %eax 648; X86_WIN-NEXT: retl 649; 650; X64_WIN-LABEL: f16: 651; X64_WIN: # %bb.0: 652; X64_WIN-NEXT: movl _tls_index(%rip), %eax 653; X64_WIN-NEXT: movq %gs:88, %rcx 654; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 655; X64_WIN-NEXT: leaq i6@SECREL32(%rax), %rax 656; X64_WIN-NEXT: retq 657; 658; MINGW32-LABEL: f16: 659; MINGW32: # %bb.0: 660; MINGW32-NEXT: movl __tls_index, %eax 661; MINGW32-NEXT: movl %fs:44, %ecx 662; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 663; MINGW32-NEXT: leal _i6@SECREL32(%eax), %eax 664; MINGW32-NEXT: retl 665 666 667 ret ptr @i6 668} 669 670; NOTE: Similar to f1() but with direct TLS segment access disabled 671define dso_local i32 @f17() #0 { 672; X86_LINUX-LABEL: f17: 673; X86_LINUX: # %bb.0: # %entry 674; X86_LINUX-NEXT: movl %gs:0, %eax 675; X86_LINUX-NEXT: movl i1@NTPOFF(%eax), %eax 676; X86_LINUX-NEXT: retl 677; 678; X64_LINUX-LABEL: f17: 679; X64_LINUX: # %bb.0: # %entry 680; X64_LINUX-NEXT: movq %fs:0, %rax 681; X64_LINUX-NEXT: movl i1@TPOFF(%rax), %eax 682; X64_LINUX-NEXT: retq 683; 684; X86_WIN-LABEL: f17: 685; X86_WIN: # %bb.0: # %entry 686; X86_WIN-NEXT: movl __tls_index, %eax 687; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 688; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 689; X86_WIN-NEXT: movl _i1@SECREL32(%eax), %eax 690; X86_WIN-NEXT: retl 691; 692; X64_WIN-LABEL: f17: 693; X64_WIN: # %bb.0: # %entry 694; X64_WIN-NEXT: movl _tls_index(%rip), %eax 695; X64_WIN-NEXT: movq %gs:88, %rcx 696; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 697; X64_WIN-NEXT: movl i1@SECREL32(%rax), %eax 698; X64_WIN-NEXT: retq 699; 700; MINGW32-LABEL: f17: 701; MINGW32: # %bb.0: # %entry 702; MINGW32-NEXT: movl __tls_index, %eax 703; MINGW32-NEXT: movl %fs:44, %ecx 704; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 705; MINGW32-NEXT: movl _i1@SECREL32(%eax), %eax 706; MINGW32-NEXT: retl 707 708entry: 709 %tmp1 = load i32, ptr @i1 710 ret i32 %tmp1 711} 712 713; NOTE: Similar to f3() but with direct TLS segment access disabled 714define dso_local i32 @f18() #1 { 715; X86_LINUX-LABEL: f18: 716; X86_LINUX: # %bb.0: # %entry 717; X86_LINUX-NEXT: movl i2@INDNTPOFF, %eax 718; X86_LINUX-NEXT: movl %gs:0, %ecx 719; X86_LINUX-NEXT: movl (%ecx,%eax), %eax 720; X86_LINUX-NEXT: retl 721; 722; X64_LINUX-LABEL: f18: 723; X64_LINUX: # %bb.0: # %entry 724; X64_LINUX-NEXT: movq i2@GOTTPOFF(%rip), %rax 725; X64_LINUX-NEXT: movq %fs:0, %rcx 726; X64_LINUX-NEXT: movl (%rcx,%rax), %eax 727; X64_LINUX-NEXT: retq 728; 729; X86_WIN-LABEL: f18: 730; X86_WIN: # %bb.0: # %entry 731; X86_WIN-NEXT: movl __tls_index, %eax 732; X86_WIN-NEXT: movl %fs:__tls_array, %ecx 733; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax 734; X86_WIN-NEXT: movl _i2@SECREL32(%eax), %eax 735; X86_WIN-NEXT: retl 736; 737; X64_WIN-LABEL: f18: 738; X64_WIN: # %bb.0: # %entry 739; X64_WIN-NEXT: movl _tls_index(%rip), %eax 740; X64_WIN-NEXT: movq %gs:88, %rcx 741; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax 742; X64_WIN-NEXT: movl i2@SECREL32(%rax), %eax 743; X64_WIN-NEXT: retq 744; 745; MINGW32-LABEL: f18: 746; MINGW32: # %bb.0: # %entry 747; MINGW32-NEXT: movl __tls_index, %eax 748; MINGW32-NEXT: movl %fs:44, %ecx 749; MINGW32-NEXT: movl (%ecx,%eax,4), %eax 750; MINGW32-NEXT: movl _i2@SECREL32(%eax), %eax 751; MINGW32-NEXT: retl 752 753 754entry: 755 %tmp1 = load i32, ptr @i2 756 ret i32 %tmp1 757} 758 759attributes #0 = { "indirect-tls-seg-refs" } 760attributes #1 = { nounwind "indirect-tls-seg-refs" } 761