383 lines · plain
1; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff \2; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s \3; RUN: --check-prefix=CHECK644; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff \5; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s \6; RUN: --check-prefix=CHECK327; RUN: llc -verify-machineinstrs -mtriple powerpc64le-unknown-linux \8; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s \9; RUN: --check-prefix=LINUX64LE10; RUN: llc -verify-machineinstrs -mtriple powerpc64-unknown-linux \11; RUN: -ppc-asm-full-reg-names < %s | FileCheck %s \12; RUN: --check-prefix=LINUX64BE13 14@.str = private unnamed_addr constant [47 x i8] c"TLS variable 1, 2 and non-TLS var: %s, %s, %s\0A\00", align 115@a = internal thread_local constant [5 x i8] c"tls1\00", align 116@b = internal thread_local constant [5 x i8] c"tls2\00", align 117@c = internal constant [15 x i8] c"Regular global\00", align 118@d = internal constant [10 x i32] [i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10], align 419@e = internal constant [4 x float] [float 0x4055F33340000000, float 0x4056333340000000, float 0x40567999A0000000, float 0x4056B33340000000], align 420 21declare noundef signext i32 @printf(ptr nocapture noundef readonly, ...) local_unnamed_addr #022declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #123declare void @callee(ptr noundef) local_unnamed_addr #324declare void @callee2(ptr noundef) local_unnamed_addr #325 26define void @print_tls_func() {27; CHECK64-LABEL: print_tls_func:28; CHECK64: # %bb.0: # %entry29; CHECK64-NEXT: mflr r030; CHECK64-NEXT: stdu r1, -112(r1)31; CHECK64-NEXT: ld r3, L..C0(r2) # target-flags(ppc-tlsldm) @"_$TLSML"32; CHECK64-NEXT: std r0, 128(r1)33; CHECK64-NEXT: ld r6, L..C1(r2) # @_MergedGlobals34; CHECK64-NEXT: bla .__tls_get_mod[PR]35; CHECK64-NEXT: ld r4, L..C2(r2) # target-flags(ppc-tlsld) @a36; CHECK64-NEXT: ld r5, L..C3(r2) # target-flags(ppc-tlsld) @b37; CHECK64-NEXT: add r4, r3, r438; CHECK64-NEXT: add r5, r3, r539; CHECK64-NEXT: addi r3, r6, 7240; CHECK64-NEXT: bl .printf[PR]41; CHECK64-NEXT: nop42; CHECK64-NEXT: addi r1, r1, 11243; CHECK64-NEXT: ld r0, 16(r1)44; CHECK64-NEXT: mtlr r045; CHECK64-NEXT: blr46;47; CHECK32-LABEL: print_tls_func:48; CHECK32: # %bb.0: # %entry49; CHECK32-NEXT: mflr r050; CHECK32-NEXT: stwu r1, -64(r1)51; CHECK32-NEXT: lwz r3, L..C0(r2) # target-flags(ppc-tlsldm) @"_$TLSML"52; CHECK32-NEXT: stw r0, 72(r1)53; CHECK32-NEXT: lwz r6, L..C1(r2) # @_MergedGlobals54; CHECK32-NEXT: bla .__tls_get_mod[PR]55; CHECK32-NEXT: lwz r4, L..C2(r2) # target-flags(ppc-tlsld) @a56; CHECK32-NEXT: lwz r5, L..C3(r2) # target-flags(ppc-tlsld) @b57; CHECK32-NEXT: add r4, r3, r458; CHECK32-NEXT: add r5, r3, r559; CHECK32-NEXT: addi r3, r6, 7260; CHECK32-NEXT: bl .printf[PR]61; CHECK32-NEXT: nop62; CHECK32-NEXT: addi r1, r1, 6463; CHECK32-NEXT: lwz r0, 8(r1)64; CHECK32-NEXT: mtlr r065; CHECK32-NEXT: blr66;67; LINUX64LE-LABEL: print_tls_func:68; LINUX64LE: # %bb.0: # %entry69; LINUX64LE-NEXT: mflr r070; LINUX64LE-NEXT: stdu r1, -96(r1)71; LINUX64LE-NEXT: std r0, 112(r1)72; LINUX64LE-NEXT: .cfi_def_cfa_offset 9673; LINUX64LE-NEXT: .cfi_offset lr, 1674; LINUX64LE-NEXT: addis r3, r13, a@tprel@ha75; LINUX64LE-NEXT: addi r4, r3, a@tprel@l76; LINUX64LE-NEXT: addis r3, r13, b@tprel@ha77; LINUX64LE-NEXT: addi r5, r3, b@tprel@l78; LINUX64LE-NEXT: addis r3, r2, .L_MergedGlobals@toc@ha79; LINUX64LE-NEXT: addi r6, r3, .L_MergedGlobals@toc@l80; LINUX64LE-NEXT: addi r3, r6, 7281; LINUX64LE-NEXT: bl printf82; LINUX64LE-NEXT: nop83; LINUX64LE-NEXT: addi r1, r1, 9684; LINUX64LE-NEXT: ld r0, 16(r1)85; LINUX64LE-NEXT: mtlr r086; LINUX64LE-NEXT: blr87;88; LINUX64BE-LABEL: print_tls_func:89; LINUX64BE: # %bb.0: # %entry90; LINUX64BE-NEXT: mflr r091; LINUX64BE-NEXT: stdu r1, -128(r1)92; LINUX64BE-NEXT: std r0, 144(r1)93; LINUX64BE-NEXT: .cfi_def_cfa_offset 12894; LINUX64BE-NEXT: .cfi_offset lr, 1695; LINUX64BE-NEXT: .cfi_offset r30, -1696; LINUX64BE-NEXT: addis r3, r2, a@got@tlsld@ha97; LINUX64BE-NEXT: std r30, 112(r1) # 8-byte Folded Spill98; LINUX64BE-NEXT: addi r3, r3, a@got@tlsld@l99; LINUX64BE-NEXT: bl __tls_get_addr(a@tlsld)100; LINUX64BE-NEXT: nop101; LINUX64BE-NEXT: addis r4, r2, b@got@tlsld@ha102; LINUX64BE-NEXT: addis r3, r3, a@dtprel@ha103; LINUX64BE-NEXT: addi r30, r3, a@dtprel@l104; LINUX64BE-NEXT: addi r3, r4, b@got@tlsld@l105; LINUX64BE-NEXT: bl __tls_get_addr(b@tlsld)106; LINUX64BE-NEXT: nop107; LINUX64BE-NEXT: addis r3, r3, b@dtprel@ha108; LINUX64BE-NEXT: mr r4, r30109; LINUX64BE-NEXT: addi r5, r3, b@dtprel@l110; LINUX64BE-NEXT: addis r3, r2, .L_MergedGlobals@toc@ha111; LINUX64BE-NEXT: addi r6, r3, .L_MergedGlobals@toc@l112; LINUX64BE-NEXT: addi r3, r6, 72113; LINUX64BE-NEXT: bl printf114; LINUX64BE-NEXT: nop115; LINUX64BE-NEXT: ld r30, 112(r1) # 8-byte Folded Reload116; LINUX64BE-NEXT: addi r1, r1, 128117; LINUX64BE-NEXT: ld r0, 16(r1)118; LINUX64BE-NEXT: mtlr r0119; LINUX64BE-NEXT: blr120entry:121 %0 = tail call align 1 ptr @llvm.threadlocal.address.p0(ptr align 1 @a)122 %1 = tail call align 1 ptr @llvm.threadlocal.address.p0(ptr align 1 @b)123 %call = tail call signext i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str, ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef nonnull @c)124 ret void125}126 127define void @test_func() {128; CHECK64-LABEL: test_func:129; CHECK64: # %bb.0: # %entry130; CHECK64-NEXT: mflr r0131; CHECK64-NEXT: stdu r1, -112(r1)132; CHECK64-NEXT: ld r3, L..C1(r2) # @_MergedGlobals133; CHECK64-NEXT: std r0, 128(r1)134; CHECK64-NEXT: addi r3, r3, 32135; CHECK64-NEXT: bl .callee[PR]136; CHECK64-NEXT: nop137; CHECK64-NEXT: addi r1, r1, 112138; CHECK64-NEXT: ld r0, 16(r1)139; CHECK64-NEXT: mtlr r0140; CHECK64-NEXT: blr141;142; CHECK32-LABEL: test_func:143; CHECK32: # %bb.0: # %entry144; CHECK32-NEXT: mflr r0145; CHECK32-NEXT: stwu r1, -64(r1)146; CHECK32-NEXT: lwz r3, L..C1(r2) # @_MergedGlobals147; CHECK32-NEXT: stw r0, 72(r1)148; CHECK32-NEXT: addi r3, r3, 32149; CHECK32-NEXT: bl .callee[PR]150; CHECK32-NEXT: nop151; CHECK32-NEXT: addi r1, r1, 64152; CHECK32-NEXT: lwz r0, 8(r1)153; CHECK32-NEXT: mtlr r0154; CHECK32-NEXT: blr155 156; LINUX64LE-LABEL: test_func:157; LINUX64LE: # %bb.0: # %entry158; LINUX64LE-NEXT: mflr r0159; LINUX64LE-NEXT: stdu r1, -32(r1)160; LINUX64LE-NEXT: std r0, 48(r1)161; LINUX64LE-NEXT: .cfi_def_cfa_offset 32162; LINUX64LE-NEXT: .cfi_offset lr, 16163; LINUX64LE-NEXT: addis r3, r2, .L_MergedGlobals@toc@ha164; LINUX64LE-NEXT: addi r3, r3, .L_MergedGlobals@toc@l165; LINUX64LE-NEXT: addi r3, r3, 32166; LINUX64LE-NEXT: bl callee167; LINUX64LE-NEXT: nop168; LINUX64LE-NEXT: addi r1, r1, 32169; LINUX64LE-NEXT: ld r0, 16(r1)170; LINUX64LE-NEXT: mtlr r0171; LINUX64LE-NEXT: blr172;173; LINUX64BE-LABEL: test_func:174; LINUX64BE: # %bb.0: # %entry175; LINUX64BE-NEXT: mflr r0176; LINUX64BE-NEXT: stdu r1, -112(r1)177; LINUX64BE-NEXT: std r0, 128(r1)178; LINUX64BE-NEXT: .cfi_def_cfa_offset 112179; LINUX64BE-NEXT: .cfi_offset lr, 16180; LINUX64BE-NEXT: addis r3, r2, .L_MergedGlobals@toc@ha181; LINUX64BE-NEXT: addi r3, r3, .L_MergedGlobals@toc@l182; LINUX64BE-NEXT: addi r3, r3, 32183; LINUX64BE-NEXT: bl callee184; LINUX64BE-NEXT: nop185; LINUX64BE-NEXT: addi r1, r1, 112186; LINUX64BE-NEXT: ld r0, 16(r1)187; LINUX64BE-NEXT: mtlr r0188; LINUX64BE-NEXT: blr189entry:190 tail call void @callee(ptr noundef nonnull @d) #4191 ret void192}193 194define void @test_func2() {195; CHECK64-LABEL: test_func2:196; CHECK64: # %bb.0: # %entry197; CHECK64-NEXT: mflr r0198; CHECK64-NEXT: stdu r1, -112(r1)199; CHECK64-NEXT: ld r3, L..C1(r2) # @_MergedGlobals200; CHECK64-NEXT: std r0, 128(r1)201; CHECK64-NEXT: addi r3, r3, 16202; CHECK64-NEXT: bl .callee2[PR]203; CHECK64-NEXT: nop204; CHECK64-NEXT: addi r1, r1, 112205; CHECK64-NEXT: ld r0, 16(r1)206; CHECK64-NEXT: mtlr r0207; CHECK64-NEXT: blr208;209; CHECK32-LABEL: test_func2:210; CHECK32: # %bb.0: # %entry211; CHECK32-NEXT: mflr r0212; CHECK32-NEXT: stwu r1, -64(r1)213; CHECK32-NEXT: lwz r3, L..C1(r2) # @_MergedGlobals214; CHECK32-NEXT: stw r0, 72(r1)215; CHECK32-NEXT: addi r3, r3, 16216; CHECK32-NEXT: bl .callee2[PR]217; CHECK32-NEXT: nop218; CHECK32-NEXT: addi r1, r1, 64219; CHECK32-NEXT: lwz r0, 8(r1)220; CHECK32-NEXT: mtlr r0221; CHECK32-NEXT: blr222;223; LINUX64LE-LABEL: test_func2:224; LINUX64LE: # %bb.0: # %entry225; LINUX64LE-NEXT: mflr r0226; LINUX64LE-NEXT: stdu r1, -32(r1)227; LINUX64LE-NEXT: std r0, 48(r1)228; LINUX64LE-NEXT: .cfi_def_cfa_offset 32229; LINUX64LE-NEXT: .cfi_offset lr, 16230; LINUX64LE-NEXT: addis r3, r2, .L_MergedGlobals@toc@ha231; LINUX64LE-NEXT: addi r3, r3, .L_MergedGlobals@toc@l232; LINUX64LE-NEXT: addi r3, r3, 16233; LINUX64LE-NEXT: bl callee2234; LINUX64LE-NEXT: nop235; LINUX64LE-NEXT: addi r1, r1, 32236; LINUX64LE-NEXT: ld r0, 16(r1)237; LINUX64LE-NEXT: mtlr r0238; LINUX64LE-NEXT: blr239;240; LINUX64BE-LABEL: test_func2:241; LINUX64BE: # %bb.0: # %entry242; LINUX64BE-NEXT: mflr r0243; LINUX64BE-NEXT: stdu r1, -112(r1)244; LINUX64BE-NEXT: std r0, 128(r1)245; LINUX64BE-NEXT: .cfi_def_cfa_offset 112246; LINUX64BE-NEXT: .cfi_offset lr, 16247; LINUX64BE-NEXT: addis r3, r2, .L_MergedGlobals@toc@ha248; LINUX64BE-NEXT: addi r3, r3, .L_MergedGlobals@toc@l249; LINUX64BE-NEXT: addi r3, r3, 16250; LINUX64BE-NEXT: bl callee2251; LINUX64BE-NEXT: nop252; LINUX64BE-NEXT: addi r1, r1, 112253; LINUX64BE-NEXT: ld r0, 16(r1)254; LINUX64BE-NEXT: mtlr r0255; LINUX64BE-NEXT: blr256entry:257 tail call void @callee2(ptr noundef nonnull @e) #4258 ret void259}260 261; Check the contents of the TLS data and the _MergedGlobals structure to262; check that TLS data has been skipped during global merge.263 264; CHECK64: .csect a[TL],2265; CHECK64-NEXT: .lglobl a[TL]266; CHECK64-NEXT: .string "tls1"267; CHECK64: .csect b[TL],2268; CHECK64-NEXT: .lglobl b[TL]269; CHECK64-NEXT: .string "tls2"270; CHECK64: .csect L.._MergedGlobals[RO],2271; CHECK64: .align 2272; CHECK64-LABEL: c:273; CHECK64: .string "Regular global"274; CHECK64-LABEL: e:275; CHECK64: .vbyte 4, 0x42af999a276; CHECK64-NEXT: .vbyte 4, 0x42b1999a277; CHECK64-NEXT: .vbyte 4, 0x42b3cccd278; CHECK64-NEXT: .vbyte 4, 0x42b5999a279; CHECK64-LABEL: d:280; CHECK64: .vbyte 4, 1281; CHECK64-NEXT: .vbyte 4, 2282; CHECK64-NEXT: .vbyte 4, 3283; CHECK64-NEXT: .vbyte 4, 4284; CHECK64-NEXT: .vbyte 4, 5285; CHECK64-NEXT: .vbyte 4, 6286; CHECK64-NEXT: .vbyte 4, 7287; CHECK64-NEXT: .vbyte 4, 8288; CHECK64-NEXT: .vbyte 4, 9289; CHECK64-NEXT: .vbyte 4, 10290; CHECK64-LABEL: L...str291; CHECK64: .byte 'T,'L,'S,' ,'v,'a,'r,'i,'a,'b,'l,'e,' ,'1,',,' ,'2,' ,'a,'n,'d,' ,'n,'o,'n,'-,'T,'L,'S,' ,'v,'a,'r,':,' ,'%,'s,',,' ,'%,'s,',,' ,'%,'s,0012,0000292; CHECK64: L..C1:293; CHECK64-NEXT: .tc L.._MergedGlobals[TC],L.._MergedGlobals[RO]294; CHECK64: L..C2:295; CHECK64-NEXT: .tc a[TC],a[TL]@ld296; CHECK64: L..C3:297; CHECK64-NEXT: .tc b[TC],b[TL]@ld298 299; CHECK32: .csect a[TL],2300; CHECK32-NEXT: .lglobl a[TL]301; CHECK32-NEXT: .string "tls1"302; CHECK32: .csect b[TL],2303; CHECK32-NEXT: .lglobl b[TL]304; CHECK32-NEXT: .string "tls2"305; CHECK32: .csect L.._MergedGlobals[RO],2306; CHECK32: .align 2307; CHECK32-LABEL: c:308; CHECK32: .string "Regular global"309; CHECK32-LABEL: e:310; CHECK32: .vbyte 4, 0x42af999a311; CHECK32-NEXT: .vbyte 4, 0x42b1999a312; CHECK32-NEXT: .vbyte 4, 0x42b3cccd313; CHECK32-NEXT: .vbyte 4, 0x42b5999a314; CHECK32-LABEL: d:315; CHECK32: .vbyte 4, 1316; CHECK32-NEXT: .vbyte 4, 2317; CHECK32-NEXT: .vbyte 4, 3318; CHECK32-NEXT: .vbyte 4, 4319; CHECK32-NEXT: .vbyte 4, 5320; CHECK32-NEXT: .vbyte 4, 6321; CHECK32-NEXT: .vbyte 4, 7322; CHECK32-NEXT: .vbyte 4, 8323; CHECK32-NEXT: .vbyte 4, 9324; CHECK32-NEXT: .vbyte 4, 10325; CHECK32-LABEL: L...str:326; CHECK32: .byte 'T,'L,'S,' ,'v,'a,'r,'i,'a,'b,'l,'e,' ,'1,',,' ,'2,' ,'a,'n,'d,' ,'n,'o,'n,'-,'T,'L,'S,' ,'v,'a,'r,':,' ,'%,'s,',,' ,'%,'s,',,' ,'%,'s,0012,0000327; CHECK32: L..C1:328; CHECK32-NEXT: .tc L.._MergedGlobals[TC],L.._MergedGlobals[RO]329; CHECK32: L..C2:330; CHECK32-NEXT: .tc a[TC],a[TL]@ld331; CHECK32: L..C3:332; CHECK32-NEXT: .tc b[TC],b[TL]@ld333 334; LINUX64LE: a:335; LINUX64LE-NEXT: .asciz "tls1"336; LINUX64LE-NEXT: .size a, 5337; LINUX64LE: b:338; LINUX64LE-NEXT: .asciz "tls2"339; LINUX64LE-NEXT: .size b, 5340; LINUX64LE: .L_MergedGlobals:341; LINUX64LE-NEXT: .asciz "Regular global"342; LINUX64LE-NEXT: .space 1343; LINUX64LE-NEXT: .long 0x42af999a344; LINUX64LE-NEXT: .long 0x42b1999a345; LINUX64LE-NEXT: .long 0x42b3cccd346; LINUX64LE-NEXT: .long 0x42b5999a347; LINUX64LE-NEXT: .long 1348; LINUX64LE-NEXT: .long 2349; LINUX64LE-NEXT: .long 3350; LINUX64LE-NEXT: .long 4351; LINUX64LE-NEXT: .long 5352; LINUX64LE-NEXT: .long 6353; LINUX64LE-NEXT: .long 7354; LINUX64LE-NEXT: .long 8355; LINUX64LE-NEXT: .long 9356; LINUX64LE-NEXT: .long 10357; LINUX64LE-NEXT: .asciz "TLS variable 1, 2 and non-TLS var: %s, %s, %s\n"358 359; LINUX64BE: a:360; LINUX64BE-NEXT: .asciz "tls1"361; LINUX64BE-NEXT: .size a, 5362; LINUX64BE: b:363; LINUX64BE-NEXT: .asciz "tls2"364; LINUX64BE-NEXT: .size b, 5365; LINUX64BE: .L_MergedGlobals:366; LINUX64BE-NEXT: .asciz "Regular global"367; LINUX64BE-NEXT: .space 1368; LINUX64BE-NEXT: .long 0x42af999a369; LINUX64BE-NEXT: .long 0x42b1999a370; LINUX64BE-NEXT: .long 0x42b3cccd371; LINUX64BE-NEXT: .long 0x42b5999a372; LINUX64BE-NEXT: .long 1373; LINUX64BE-NEXT: .long 2374; LINUX64BE-NEXT: .long 3375; LINUX64BE-NEXT: .long 4376; LINUX64BE-NEXT: .long 5377; LINUX64BE-NEXT: .long 6378; LINUX64BE-NEXT: .long 7379; LINUX64BE-NEXT: .long 8380; LINUX64BE-NEXT: .long 9381; LINUX64BE-NEXT: .long 10382; LINUX64BE-NEXT: .asciz "TLS variable 1, 2 and non-TLS var: %s, %s, %s\n"383