761 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i386-linux-gnu | FileCheck -check-prefix=X86_LINUX %s3; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck -check-prefix=X64_LINUX %s4; RUN: llc < %s -mtriple=i386-linux-gnu -fast-isel | FileCheck -check-prefix=X86_LINUX %s5; RUN: llc < %s -mtriple=x86_64-linux-gnu -fast-isel | FileCheck -check-prefix=X64_LINUX %s6; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck -check-prefix=X86_WIN %s7; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck -check-prefix=X64_WIN %s8; RUN: llc < %s -mtriple=i686-pc-windows-gnu | FileCheck -check-prefix=MINGW32 %s9; RUN: llc < %s -mtriple=x86_64-pc-windows-gnu | FileCheck -check-prefix=X64_WIN %s10 11@i1 = dso_local thread_local global i32 1512@i2 = external thread_local global i3213@i3 = internal thread_local global i32 1514@i4 = hidden thread_local global i32 1515@i5 = external hidden thread_local global i3216@i6 = external protected thread_local global i3217@s1 = dso_local thread_local global i16 1518@b1 = dso_local thread_local global i8 019@b2 = dso_local thread_local(localexec) global i8 020 21define dso_local i32 @f1() {22; X86_LINUX-LABEL: f1:23; X86_LINUX: # %bb.0: # %entry24; X86_LINUX-NEXT: movl %gs:i1@NTPOFF, %eax25; X86_LINUX-NEXT: retl26;27; X64_LINUX-LABEL: f1:28; X64_LINUX: # %bb.0: # %entry29; X64_LINUX-NEXT: movl %fs:i1@TPOFF, %eax30; X64_LINUX-NEXT: retq31;32; X86_WIN-LABEL: f1:33; X86_WIN: # %bb.0: # %entry34; X86_WIN-NEXT: movl __tls_index, %eax35; X86_WIN-NEXT: movl %fs:__tls_array, %ecx36; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax37; X86_WIN-NEXT: movl _i1@SECREL32(%eax), %eax38; X86_WIN-NEXT: retl39;40; X64_WIN-LABEL: f1:41; X64_WIN: # %bb.0: # %entry42; X64_WIN-NEXT: movl _tls_index(%rip), %eax43; X64_WIN-NEXT: movq %gs:88, %rcx44; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax45; X64_WIN-NEXT: movl i1@SECREL32(%rax), %eax46; X64_WIN-NEXT: retq47;48; MINGW32-LABEL: f1:49; MINGW32: # %bb.0: # %entry50; MINGW32-NEXT: movl __tls_index, %eax51; MINGW32-NEXT: movl %fs:44, %ecx52; MINGW32-NEXT: movl (%ecx,%eax,4), %eax53; MINGW32-NEXT: movl _i1@SECREL32(%eax), %eax54; MINGW32-NEXT: retl55 56entry:57 %tmp1 = load i32, ptr @i158 ret i32 %tmp159}60 61define dso_local ptr @f2() {62; X86_LINUX-LABEL: f2:63; X86_LINUX: # %bb.0: # %entry64; X86_LINUX-NEXT: movl %gs:0, %eax65; X86_LINUX-NEXT: leal i1@NTPOFF(%eax), %eax66; X86_LINUX-NEXT: retl67;68; X64_LINUX-LABEL: f2:69; X64_LINUX: # %bb.0: # %entry70; X64_LINUX-NEXT: movq %fs:0, %rax71; X64_LINUX-NEXT: leaq i1@TPOFF(%rax), %rax72; X64_LINUX-NEXT: retq73;74; X86_WIN-LABEL: f2:75; X86_WIN: # %bb.0: # %entry76; X86_WIN-NEXT: movl __tls_index, %eax77; X86_WIN-NEXT: movl %fs:__tls_array, %ecx78; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax79; X86_WIN-NEXT: leal _i1@SECREL32(%eax), %eax80; X86_WIN-NEXT: retl81;82; X64_WIN-LABEL: f2:83; X64_WIN: # %bb.0: # %entry84; X64_WIN-NEXT: movl _tls_index(%rip), %eax85; X64_WIN-NEXT: movq %gs:88, %rcx86; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax87; X64_WIN-NEXT: leaq i1@SECREL32(%rax), %rax88; X64_WIN-NEXT: retq89;90; MINGW32-LABEL: f2:91; MINGW32: # %bb.0: # %entry92; MINGW32-NEXT: movl __tls_index, %eax93; MINGW32-NEXT: movl %fs:44, %ecx94; MINGW32-NEXT: movl (%ecx,%eax,4), %eax95; MINGW32-NEXT: leal _i1@SECREL32(%eax), %eax96; MINGW32-NEXT: retl97 98entry:99 ret ptr @i1100}101 102define dso_local i32 @f3() nounwind {103; X86_LINUX-LABEL: f3:104; X86_LINUX: # %bb.0: # %entry105; X86_LINUX-NEXT: movl i2@INDNTPOFF, %eax106; X86_LINUX-NEXT: movl %gs:(%eax), %eax107; X86_LINUX-NEXT: retl108;109; X64_LINUX-LABEL: f3:110; X64_LINUX: # %bb.0: # %entry111; X64_LINUX-NEXT: movq i2@GOTTPOFF(%rip), %rax112; X64_LINUX-NEXT: movl %fs:(%rax), %eax113; X64_LINUX-NEXT: retq114;115; X86_WIN-LABEL: f3:116; X86_WIN: # %bb.0: # %entry117; X86_WIN-NEXT: movl __tls_index, %eax118; X86_WIN-NEXT: movl %fs:__tls_array, %ecx119; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax120; X86_WIN-NEXT: movl _i2@SECREL32(%eax), %eax121; X86_WIN-NEXT: retl122;123; X64_WIN-LABEL: f3:124; X64_WIN: # %bb.0: # %entry125; X64_WIN-NEXT: movl _tls_index(%rip), %eax126; X64_WIN-NEXT: movq %gs:88, %rcx127; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax128; X64_WIN-NEXT: movl i2@SECREL32(%rax), %eax129; X64_WIN-NEXT: retq130;131; MINGW32-LABEL: f3:132; MINGW32: # %bb.0: # %entry133; MINGW32-NEXT: movl __tls_index, %eax134; MINGW32-NEXT: movl %fs:44, %ecx135; MINGW32-NEXT: movl (%ecx,%eax,4), %eax136; MINGW32-NEXT: movl _i2@SECREL32(%eax), %eax137; MINGW32-NEXT: retl138 139entry:140 %tmp1 = load i32, ptr @i2141 ret i32 %tmp1142}143 144define dso_local ptr @f4() {145; X86_LINUX-LABEL: f4:146; X86_LINUX: # %bb.0: # %entry147; X86_LINUX-NEXT: movl %gs:0, %eax148; X86_LINUX-NEXT: addl i2@INDNTPOFF, %eax149; X86_LINUX-NEXT: retl150;151; X64_LINUX-LABEL: f4:152; X64_LINUX: # %bb.0: # %entry153; X64_LINUX-NEXT: movq %fs:0, %rax154; X64_LINUX-NEXT: addq i2@GOTTPOFF(%rip), %rax155; X64_LINUX-NEXT: retq156;157; X86_WIN-LABEL: f4:158; X86_WIN: # %bb.0: # %entry159; X86_WIN-NEXT: movl __tls_index, %eax160; X86_WIN-NEXT: movl %fs:__tls_array, %ecx161; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax162; X86_WIN-NEXT: leal _i2@SECREL32(%eax), %eax163; X86_WIN-NEXT: retl164;165; X64_WIN-LABEL: f4:166; X64_WIN: # %bb.0: # %entry167; X64_WIN-NEXT: movl _tls_index(%rip), %eax168; X64_WIN-NEXT: movq %gs:88, %rcx169; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax170; X64_WIN-NEXT: leaq i2@SECREL32(%rax), %rax171; X64_WIN-NEXT: retq172;173; MINGW32-LABEL: f4:174; MINGW32: # %bb.0: # %entry175; MINGW32-NEXT: movl __tls_index, %eax176; MINGW32-NEXT: movl %fs:44, %ecx177; MINGW32-NEXT: movl (%ecx,%eax,4), %eax178; MINGW32-NEXT: leal _i2@SECREL32(%eax), %eax179; MINGW32-NEXT: retl180 181entry:182 ret ptr @i2183}184 185define dso_local i32 @f5() nounwind {186; X86_LINUX-LABEL: f5:187; X86_LINUX: # %bb.0: # %entry188; X86_LINUX-NEXT: movl %gs:i3@NTPOFF, %eax189; X86_LINUX-NEXT: retl190;191; X64_LINUX-LABEL: f5:192; X64_LINUX: # %bb.0: # %entry193; X64_LINUX-NEXT: movl %fs:i3@TPOFF, %eax194; X64_LINUX-NEXT: retq195;196; X86_WIN-LABEL: f5:197; X86_WIN: # %bb.0: # %entry198; X86_WIN-NEXT: movl __tls_index, %eax199; X86_WIN-NEXT: movl %fs:__tls_array, %ecx200; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax201; X86_WIN-NEXT: movl _i3@SECREL32(%eax), %eax202; X86_WIN-NEXT: retl203;204; X64_WIN-LABEL: f5:205; X64_WIN: # %bb.0: # %entry206; X64_WIN-NEXT: movl _tls_index(%rip), %eax207; X64_WIN-NEXT: movq %gs:88, %rcx208; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax209; X64_WIN-NEXT: movl i3@SECREL32(%rax), %eax210; X64_WIN-NEXT: retq211;212; MINGW32-LABEL: f5:213; MINGW32: # %bb.0: # %entry214; MINGW32-NEXT: movl __tls_index, %eax215; MINGW32-NEXT: movl %fs:44, %ecx216; MINGW32-NEXT: movl (%ecx,%eax,4), %eax217; MINGW32-NEXT: movl _i3@SECREL32(%eax), %eax218; MINGW32-NEXT: retl219 220entry:221 %tmp1 = load i32, ptr @i3222 ret i32 %tmp1223}224 225define dso_local ptr @f6() {226; X86_LINUX-LABEL: f6:227; X86_LINUX: # %bb.0: # %entry228; X86_LINUX-NEXT: movl %gs:0, %eax229; X86_LINUX-NEXT: leal i3@NTPOFF(%eax), %eax230; X86_LINUX-NEXT: retl231;232; X64_LINUX-LABEL: f6:233; X64_LINUX: # %bb.0: # %entry234; X64_LINUX-NEXT: movq %fs:0, %rax235; X64_LINUX-NEXT: leaq i3@TPOFF(%rax), %rax236; X64_LINUX-NEXT: retq237;238; X86_WIN-LABEL: f6:239; X86_WIN: # %bb.0: # %entry240; X86_WIN-NEXT: movl __tls_index, %eax241; X86_WIN-NEXT: movl %fs:__tls_array, %ecx242; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax243; X86_WIN-NEXT: leal _i3@SECREL32(%eax), %eax244; X86_WIN-NEXT: retl245;246; X64_WIN-LABEL: f6:247; X64_WIN: # %bb.0: # %entry248; X64_WIN-NEXT: movl _tls_index(%rip), %eax249; X64_WIN-NEXT: movq %gs:88, %rcx250; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax251; X64_WIN-NEXT: leaq i3@SECREL32(%rax), %rax252; X64_WIN-NEXT: retq253;254; MINGW32-LABEL: f6:255; MINGW32: # %bb.0: # %entry256; MINGW32-NEXT: movl __tls_index, %eax257; MINGW32-NEXT: movl %fs:44, %ecx258; MINGW32-NEXT: movl (%ecx,%eax,4), %eax259; MINGW32-NEXT: leal _i3@SECREL32(%eax), %eax260; MINGW32-NEXT: retl261 262entry:263 ret ptr @i3264}265 266define dso_local i32 @f7() {267; X86_LINUX-LABEL: f7:268; X86_LINUX: # %bb.0: # %entry269; X86_LINUX-NEXT: movl %gs:i4@NTPOFF, %eax270; X86_LINUX-NEXT: retl271;272; X64_LINUX-LABEL: f7:273; X64_LINUX: # %bb.0: # %entry274; X64_LINUX-NEXT: movl %fs:i4@TPOFF, %eax275; X64_LINUX-NEXT: retq276;277; X86_WIN-LABEL: f7:278; X86_WIN: # %bb.0: # %entry279; X86_WIN-NEXT: movl __tls_index, %eax280; X86_WIN-NEXT: movl %fs:__tls_array, %ecx281; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax282; X86_WIN-NEXT: movl _i4@SECREL32(%eax), %eax283; X86_WIN-NEXT: retl284;285; X64_WIN-LABEL: f7:286; X64_WIN: # %bb.0: # %entry287; X64_WIN-NEXT: movl _tls_index(%rip), %eax288; X64_WIN-NEXT: movq %gs:88, %rcx289; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax290; X64_WIN-NEXT: movl i4@SECREL32(%rax), %eax291; X64_WIN-NEXT: retq292;293; MINGW32-LABEL: f7:294; MINGW32: # %bb.0: # %entry295; MINGW32-NEXT: movl __tls_index, %eax296; MINGW32-NEXT: movl %fs:44, %ecx297; MINGW32-NEXT: movl (%ecx,%eax,4), %eax298; MINGW32-NEXT: movl _i4@SECREL32(%eax), %eax299; MINGW32-NEXT: retl300 301entry:302 %tmp1 = load i32, ptr @i4303 ret i32 %tmp1304}305 306define dso_local ptr @f8() {307; X86_LINUX-LABEL: f8:308; X86_LINUX: # %bb.0: # %entry309; X86_LINUX-NEXT: movl %gs:0, %eax310; X86_LINUX-NEXT: leal i4@NTPOFF(%eax), %eax311; X86_LINUX-NEXT: retl312;313; X64_LINUX-LABEL: f8:314; X64_LINUX: # %bb.0: # %entry315; X64_LINUX-NEXT: movq %fs:0, %rax316; X64_LINUX-NEXT: leaq i4@TPOFF(%rax), %rax317; X64_LINUX-NEXT: retq318;319; X86_WIN-LABEL: f8:320; X86_WIN: # %bb.0: # %entry321; X86_WIN-NEXT: movl __tls_index, %eax322; X86_WIN-NEXT: movl %fs:__tls_array, %ecx323; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax324; X86_WIN-NEXT: leal _i4@SECREL32(%eax), %eax325; X86_WIN-NEXT: retl326;327; X64_WIN-LABEL: f8:328; X64_WIN: # %bb.0: # %entry329; X64_WIN-NEXT: movl _tls_index(%rip), %eax330; X64_WIN-NEXT: movq %gs:88, %rcx331; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax332; X64_WIN-NEXT: leaq i4@SECREL32(%rax), %rax333; X64_WIN-NEXT: retq334;335; MINGW32-LABEL: f8:336; MINGW32: # %bb.0: # %entry337; MINGW32-NEXT: movl __tls_index, %eax338; MINGW32-NEXT: movl %fs:44, %ecx339; MINGW32-NEXT: movl (%ecx,%eax,4), %eax340; MINGW32-NEXT: leal _i4@SECREL32(%eax), %eax341; MINGW32-NEXT: retl342 343entry:344 ret ptr @i4345}346 347define dso_local i32 @f9() {348; X86_LINUX-LABEL: f9:349; X86_LINUX: # %bb.0: # %entry350; X86_LINUX-NEXT: movl %gs:i5@NTPOFF, %eax351; X86_LINUX-NEXT: retl352;353; X64_LINUX-LABEL: f9:354; X64_LINUX: # %bb.0: # %entry355; X64_LINUX-NEXT: movl %fs:i5@TPOFF, %eax356; X64_LINUX-NEXT: retq357;358; X86_WIN-LABEL: f9:359; X86_WIN: # %bb.0: # %entry360; X86_WIN-NEXT: movl __tls_index, %eax361; X86_WIN-NEXT: movl %fs:__tls_array, %ecx362; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax363; X86_WIN-NEXT: movl _i5@SECREL32(%eax), %eax364; X86_WIN-NEXT: retl365;366; X64_WIN-LABEL: f9:367; X64_WIN: # %bb.0: # %entry368; X64_WIN-NEXT: movl _tls_index(%rip), %eax369; X64_WIN-NEXT: movq %gs:88, %rcx370; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax371; X64_WIN-NEXT: movl i5@SECREL32(%rax), %eax372; X64_WIN-NEXT: retq373;374; MINGW32-LABEL: f9:375; MINGW32: # %bb.0: # %entry376; MINGW32-NEXT: movl __tls_index, %eax377; MINGW32-NEXT: movl %fs:44, %ecx378; MINGW32-NEXT: movl (%ecx,%eax,4), %eax379; MINGW32-NEXT: movl _i5@SECREL32(%eax), %eax380; MINGW32-NEXT: retl381 382entry:383 %tmp1 = load i32, ptr @i5384 ret i32 %tmp1385}386 387define dso_local ptr @f10() {388; X86_LINUX-LABEL: f10:389; X86_LINUX: # %bb.0: # %entry390; X86_LINUX-NEXT: movl %gs:0, %eax391; X86_LINUX-NEXT: leal i5@NTPOFF(%eax), %eax392; X86_LINUX-NEXT: retl393;394; X64_LINUX-LABEL: f10:395; X64_LINUX: # %bb.0: # %entry396; X64_LINUX-NEXT: movq %fs:0, %rax397; X64_LINUX-NEXT: leaq i5@TPOFF(%rax), %rax398; X64_LINUX-NEXT: retq399;400; X86_WIN-LABEL: f10:401; X86_WIN: # %bb.0: # %entry402; X86_WIN-NEXT: movl __tls_index, %eax403; X86_WIN-NEXT: movl %fs:__tls_array, %ecx404; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax405; X86_WIN-NEXT: leal _i5@SECREL32(%eax), %eax406; X86_WIN-NEXT: retl407;408; X64_WIN-LABEL: f10:409; X64_WIN: # %bb.0: # %entry410; X64_WIN-NEXT: movl _tls_index(%rip), %eax411; X64_WIN-NEXT: movq %gs:88, %rcx412; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax413; X64_WIN-NEXT: leaq i5@SECREL32(%rax), %rax414; X64_WIN-NEXT: retq415;416; MINGW32-LABEL: f10:417; MINGW32: # %bb.0: # %entry418; MINGW32-NEXT: movl __tls_index, %eax419; MINGW32-NEXT: movl %fs:44, %ecx420; MINGW32-NEXT: movl (%ecx,%eax,4), %eax421; MINGW32-NEXT: leal _i5@SECREL32(%eax), %eax422; MINGW32-NEXT: retl423 424entry:425 ret ptr @i5426}427 428define i16 @f11() {429; X86_LINUX-LABEL: f11:430; X86_LINUX: # %bb.0: # %entry431; X86_LINUX-NEXT: movzwl %gs:s1@NTPOFF, %eax432; X86_LINUX-NEXT: retl433;434; X64_LINUX-LABEL: f11:435; X64_LINUX: # %bb.0: # %entry436; X64_LINUX-NEXT: movzwl %fs:s1@TPOFF, %eax437; X64_LINUX-NEXT: retq438;439; X86_WIN-LABEL: f11:440; X86_WIN: # %bb.0: # %entry441; X86_WIN-NEXT: movl __tls_index, %eax442; X86_WIN-NEXT: movl %fs:__tls_array, %ecx443; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax444; X86_WIN-NEXT: movzwl _s1@SECREL32(%eax), %eax445; X86_WIN-NEXT: retl446;447; X64_WIN-LABEL: f11:448; X64_WIN: # %bb.0: # %entry449; X64_WIN-NEXT: movl _tls_index(%rip), %eax450; X64_WIN-NEXT: movq %gs:88, %rcx451; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax452; X64_WIN-NEXT: movzwl s1@SECREL32(%rax), %eax453; X64_WIN-NEXT: retq454;455; MINGW32-LABEL: f11:456; MINGW32: # %bb.0: # %entry457; MINGW32-NEXT: movl __tls_index, %eax458; MINGW32-NEXT: movl %fs:44, %ecx459; MINGW32-NEXT: movl (%ecx,%eax,4), %eax460; MINGW32-NEXT: movzwl _s1@SECREL32(%eax), %eax461; MINGW32-NEXT: retl462 463entry:464 %tmp1 = load i16, ptr @s1465 ret i16 %tmp1466}467 468define dso_local i32 @f12() {469; X86_LINUX-LABEL: f12:470; X86_LINUX: # %bb.0: # %entry471; X86_LINUX-NEXT: movswl %gs:s1@NTPOFF, %eax472; X86_LINUX-NEXT: retl473;474; X64_LINUX-LABEL: f12:475; X64_LINUX: # %bb.0: # %entry476; X64_LINUX-NEXT: movswl %fs:s1@TPOFF, %eax477; X64_LINUX-NEXT: retq478;479; X86_WIN-LABEL: f12:480; X86_WIN: # %bb.0: # %entry481; X86_WIN-NEXT: movl __tls_index, %eax482; X86_WIN-NEXT: movl %fs:__tls_array, %ecx483; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax484; X86_WIN-NEXT: movswl _s1@SECREL32(%eax), %eax485; X86_WIN-NEXT: retl486;487; X64_WIN-LABEL: f12:488; X64_WIN: # %bb.0: # %entry489; X64_WIN-NEXT: movl _tls_index(%rip), %eax490; X64_WIN-NEXT: movq %gs:88, %rcx491; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax492; X64_WIN-NEXT: movswl s1@SECREL32(%rax), %eax493; X64_WIN-NEXT: retq494;495; MINGW32-LABEL: f12:496; MINGW32: # %bb.0: # %entry497; MINGW32-NEXT: movl __tls_index, %eax498; MINGW32-NEXT: movl %fs:44, %ecx499; MINGW32-NEXT: movl (%ecx,%eax,4), %eax500; MINGW32-NEXT: movswl _s1@SECREL32(%eax), %eax501; MINGW32-NEXT: retl502 503 504entry:505 %tmp1 = load i16, ptr @s1506 %tmp2 = sext i16 %tmp1 to i32507 ret i32 %tmp2508}509 510define dso_local i8 @f13() {511; X86_LINUX-LABEL: f13:512; X86_LINUX: # %bb.0: # %entry513; X86_LINUX-NEXT: movzbl %gs:b1@NTPOFF, %eax514; X86_LINUX-NEXT: retl515;516; X64_LINUX-LABEL: f13:517; X64_LINUX: # %bb.0: # %entry518; X64_LINUX-NEXT: movzbl %fs:b1@TPOFF, %eax519; X64_LINUX-NEXT: retq520;521; X86_WIN-LABEL: f13:522; X86_WIN: # %bb.0: # %entry523; X86_WIN-NEXT: movl __tls_index, %eax524; X86_WIN-NEXT: movl %fs:__tls_array, %ecx525; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax526; X86_WIN-NEXT: movzbl _b1@SECREL32(%eax), %eax527; X86_WIN-NEXT: retl528;529; X64_WIN-LABEL: f13:530; X64_WIN: # %bb.0: # %entry531; X64_WIN-NEXT: movl _tls_index(%rip), %eax532; X64_WIN-NEXT: movq %gs:88, %rcx533; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax534; X64_WIN-NEXT: movzbl b1@SECREL32(%rax), %eax535; X64_WIN-NEXT: retq536;537; MINGW32-LABEL: f13:538; MINGW32: # %bb.0: # %entry539; MINGW32-NEXT: movl __tls_index, %eax540; MINGW32-NEXT: movl %fs:44, %ecx541; MINGW32-NEXT: movl (%ecx,%eax,4), %eax542; MINGW32-NEXT: movzbl _b1@SECREL32(%eax), %eax543; MINGW32-NEXT: retl544 545entry:546 %tmp1 = load i8, ptr @b1547 ret i8 %tmp1548}549 550define dso_local i32 @f14() {551; X86_LINUX-LABEL: f14:552; X86_LINUX: # %bb.0: # %entry553; X86_LINUX-NEXT: movsbl %gs:b1@NTPOFF, %eax554; X86_LINUX-NEXT: retl555;556; X64_LINUX-LABEL: f14:557; X64_LINUX: # %bb.0: # %entry558; X64_LINUX-NEXT: movsbl %fs:b1@TPOFF, %eax559; X64_LINUX-NEXT: retq560;561; X86_WIN-LABEL: f14:562; X86_WIN: # %bb.0: # %entry563; X86_WIN-NEXT: movl __tls_index, %eax564; X86_WIN-NEXT: movl %fs:__tls_array, %ecx565; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax566; X86_WIN-NEXT: movsbl _b1@SECREL32(%eax), %eax567; X86_WIN-NEXT: retl568;569; X64_WIN-LABEL: f14:570; X64_WIN: # %bb.0: # %entry571; X64_WIN-NEXT: movl _tls_index(%rip), %eax572; X64_WIN-NEXT: movq %gs:88, %rcx573; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax574; X64_WIN-NEXT: movsbl b1@SECREL32(%rax), %eax575; X64_WIN-NEXT: retq576;577; MINGW32-LABEL: f14:578; MINGW32: # %bb.0: # %entry579; MINGW32-NEXT: movl __tls_index, %eax580; MINGW32-NEXT: movl %fs:44, %ecx581; MINGW32-NEXT: movl (%ecx,%eax,4), %eax582; MINGW32-NEXT: movsbl _b1@SECREL32(%eax), %eax583; MINGW32-NEXT: retl584 585entry:586 %tmp1 = load i8, ptr @b1587 %tmp2 = sext i8 %tmp1 to i32588 ret i32 %tmp2589}590 591define dso_local ptr @f15() {592; X86_LINUX-LABEL: f15:593; X86_LINUX: # %bb.0: # %entry594; X86_LINUX-NEXT: movl %gs:0, %eax595; X86_LINUX-NEXT: leal b2@NTPOFF(%eax), %eax596; X86_LINUX-NEXT: retl597;598; X64_LINUX-LABEL: f15:599; X64_LINUX: # %bb.0: # %entry600; X64_LINUX-NEXT: movq %fs:0, %rax601; X64_LINUX-NEXT: leaq b2@TPOFF(%rax), %rax602; X64_LINUX-NEXT: retq603;604; X86_WIN-LABEL: f15:605; X86_WIN: # %bb.0: # %entry606; X86_WIN-NEXT: movl %fs:__tls_array, %eax607; X86_WIN-NEXT: movl (%eax), %eax608; X86_WIN-NEXT: leal _b2@SECREL32(%eax), %eax609; X86_WIN-NEXT: retl610;611; X64_WIN-LABEL: f15:612; X64_WIN: # %bb.0: # %entry613; X64_WIN-NEXT: movq %gs:88, %rax614; X64_WIN-NEXT: movq (%rax), %rax615; X64_WIN-NEXT: leaq b2@SECREL32(%rax), %rax616; X64_WIN-NEXT: retq617;618; MINGW32-LABEL: f15:619; MINGW32: # %bb.0: # %entry620; MINGW32-NEXT: movl %fs:44, %eax621; MINGW32-NEXT: movl (%eax), %eax622; MINGW32-NEXT: leal _b2@SECREL32(%eax), %eax623; MINGW32-NEXT: retl624entry:625 ret ptr @b2626}627 628 629define dso_local ptr @f16() {630; X86_LINUX-LABEL: f16:631; X86_LINUX: # %bb.0:632; X86_LINUX-NEXT: movl %gs:0, %eax633; X86_LINUX-NEXT: leal i6@NTPOFF(%eax), %eax634; X86_LINUX-NEXT: retl635;636; X64_LINUX-LABEL: f16:637; X64_LINUX: # %bb.0:638; X64_LINUX-NEXT: movq %fs:0, %rax639; X64_LINUX-NEXT: leaq i6@TPOFF(%rax), %rax640; X64_LINUX-NEXT: retq641;642; X86_WIN-LABEL: f16:643; X86_WIN: # %bb.0:644; X86_WIN-NEXT: movl __tls_index, %eax645; X86_WIN-NEXT: movl %fs:__tls_array, %ecx646; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax647; X86_WIN-NEXT: leal _i6@SECREL32(%eax), %eax648; X86_WIN-NEXT: retl649;650; X64_WIN-LABEL: f16:651; X64_WIN: # %bb.0:652; X64_WIN-NEXT: movl _tls_index(%rip), %eax653; X64_WIN-NEXT: movq %gs:88, %rcx654; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax655; X64_WIN-NEXT: leaq i6@SECREL32(%rax), %rax656; X64_WIN-NEXT: retq657;658; MINGW32-LABEL: f16:659; MINGW32: # %bb.0:660; MINGW32-NEXT: movl __tls_index, %eax661; MINGW32-NEXT: movl %fs:44, %ecx662; MINGW32-NEXT: movl (%ecx,%eax,4), %eax663; MINGW32-NEXT: leal _i6@SECREL32(%eax), %eax664; MINGW32-NEXT: retl665 666 667 ret ptr @i6668}669 670; NOTE: Similar to f1() but with direct TLS segment access disabled671define dso_local i32 @f17() #0 {672; X86_LINUX-LABEL: f17:673; X86_LINUX: # %bb.0: # %entry674; X86_LINUX-NEXT: movl %gs:0, %eax675; X86_LINUX-NEXT: movl i1@NTPOFF(%eax), %eax676; X86_LINUX-NEXT: retl677;678; X64_LINUX-LABEL: f17:679; X64_LINUX: # %bb.0: # %entry680; X64_LINUX-NEXT: movq %fs:0, %rax681; X64_LINUX-NEXT: movl i1@TPOFF(%rax), %eax682; X64_LINUX-NEXT: retq683;684; X86_WIN-LABEL: f17:685; X86_WIN: # %bb.0: # %entry686; X86_WIN-NEXT: movl __tls_index, %eax687; X86_WIN-NEXT: movl %fs:__tls_array, %ecx688; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax689; X86_WIN-NEXT: movl _i1@SECREL32(%eax), %eax690; X86_WIN-NEXT: retl691;692; X64_WIN-LABEL: f17:693; X64_WIN: # %bb.0: # %entry694; X64_WIN-NEXT: movl _tls_index(%rip), %eax695; X64_WIN-NEXT: movq %gs:88, %rcx696; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax697; X64_WIN-NEXT: movl i1@SECREL32(%rax), %eax698; X64_WIN-NEXT: retq699;700; MINGW32-LABEL: f17:701; MINGW32: # %bb.0: # %entry702; MINGW32-NEXT: movl __tls_index, %eax703; MINGW32-NEXT: movl %fs:44, %ecx704; MINGW32-NEXT: movl (%ecx,%eax,4), %eax705; MINGW32-NEXT: movl _i1@SECREL32(%eax), %eax706; MINGW32-NEXT: retl707 708entry:709 %tmp1 = load i32, ptr @i1710 ret i32 %tmp1711}712 713; NOTE: Similar to f3() but with direct TLS segment access disabled714define dso_local i32 @f18() #1 {715; X86_LINUX-LABEL: f18:716; X86_LINUX: # %bb.0: # %entry717; X86_LINUX-NEXT: movl i2@INDNTPOFF, %eax718; X86_LINUX-NEXT: movl %gs:0, %ecx719; X86_LINUX-NEXT: movl (%ecx,%eax), %eax720; X86_LINUX-NEXT: retl721;722; X64_LINUX-LABEL: f18:723; X64_LINUX: # %bb.0: # %entry724; X64_LINUX-NEXT: movq i2@GOTTPOFF(%rip), %rax725; X64_LINUX-NEXT: movq %fs:0, %rcx726; X64_LINUX-NEXT: movl (%rcx,%rax), %eax727; X64_LINUX-NEXT: retq728;729; X86_WIN-LABEL: f18:730; X86_WIN: # %bb.0: # %entry731; X86_WIN-NEXT: movl __tls_index, %eax732; X86_WIN-NEXT: movl %fs:__tls_array, %ecx733; X86_WIN-NEXT: movl (%ecx,%eax,4), %eax734; X86_WIN-NEXT: movl _i2@SECREL32(%eax), %eax735; X86_WIN-NEXT: retl736;737; X64_WIN-LABEL: f18:738; X64_WIN: # %bb.0: # %entry739; X64_WIN-NEXT: movl _tls_index(%rip), %eax740; X64_WIN-NEXT: movq %gs:88, %rcx741; X64_WIN-NEXT: movq (%rcx,%rax,8), %rax742; X64_WIN-NEXT: movl i2@SECREL32(%rax), %eax743; X64_WIN-NEXT: retq744;745; MINGW32-LABEL: f18:746; MINGW32: # %bb.0: # %entry747; MINGW32-NEXT: movl __tls_index, %eax748; MINGW32-NEXT: movl %fs:44, %ecx749; MINGW32-NEXT: movl (%ecx,%eax,4), %eax750; MINGW32-NEXT: movl _i2@SECREL32(%eax), %eax751; MINGW32-NEXT: retl752 753 754entry:755 %tmp1 = load i32, ptr @i2756 ret i32 %tmp1757}758 759attributes #0 = { "indirect-tls-seg-refs" }760attributes #1 = { nounwind "indirect-tls-seg-refs" }761