415 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \3; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s \4; RUN: | FileCheck %s --check-prefix=LE5; RUN: llc -verify-machineinstrs -target-abi=elfv2 -mtriple=powerpc64-- \6; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s \7; RUN: | FileCheck %s --check-prefix=BE8 9 10%struct.Struct = type { i8, i16, i32 }11 12@valChar = external local_unnamed_addr global i8, align 113@valShort = external local_unnamed_addr global i16, align 214@valInt = external global i32, align 415@valUnsigned = external local_unnamed_addr global i32, align 416@valLong = external local_unnamed_addr global i64, align 817@ptr = external local_unnamed_addr global ptr, align 818@array = external local_unnamed_addr global [10 x i32], align 419@structure = external local_unnamed_addr global %struct.Struct, align 420@ptrfunc = external local_unnamed_addr global ptr, align 821 22define dso_local signext i32 @ReadGlobalVarChar() local_unnamed_addr {23; LE-LABEL: ReadGlobalVarChar:24; LE: # %bb.0: # %entry25; LE-NEXT: pld r3, valChar@got@pcrel(0), 126; LE-NEXT: .Lpcrel0:27; LE-NEXT: .reloc .Lpcrel0-8,R_PPC64_PCREL_OPT,.-(.Lpcrel0-8)28; LE-NEXT: lbz r3, 0(r3)29; LE-NEXT: blr30;31; BE-LABEL: ReadGlobalVarChar:32; BE: # %bb.0: # %entry33; BE-NEXT: pld r3, valChar@got@pcrel(0), 134; BE-NEXT: .Lpcrel0:35; BE-NEXT: .reloc .Lpcrel0-8,R_PPC64_PCREL_OPT,.-(.Lpcrel0-8)36; BE-NEXT: lbz r3, 0(r3)37; BE-NEXT: blr38entry:39 %0 = load i8, ptr @valChar, align 140 %conv = zext i8 %0 to i3241 ret i32 %conv42}43 44define dso_local void @WriteGlobalVarChar() local_unnamed_addr {45; LE-LABEL: WriteGlobalVarChar:46; LE: # %bb.0: # %entry47; LE-NEXT: pld r3, valChar@got@pcrel(0), 148; LE-NEXT: li r4, 349; LE-NEXT: stb r4, 0(r3)50; LE-NEXT: blr51;52; BE-LABEL: WriteGlobalVarChar:53; BE: # %bb.0: # %entry54; BE-NEXT: pld r3, valChar@got@pcrel(0), 155; BE-NEXT: li r4, 356; BE-NEXT: stb r4, 0(r3)57; BE-NEXT: blr58entry:59 store i8 3, ptr @valChar, align 160 ret void61}62 63define dso_local signext i32 @ReadGlobalVarShort() local_unnamed_addr {64; LE-LABEL: ReadGlobalVarShort:65; LE: # %bb.0: # %entry66; LE-NEXT: pld r3, valShort@got@pcrel(0), 167; LE-NEXT: .Lpcrel1:68; LE-NEXT: .reloc .Lpcrel1-8,R_PPC64_PCREL_OPT,.-(.Lpcrel1-8)69; LE-NEXT: lha r3, 0(r3)70; LE-NEXT: blr71;72; BE-LABEL: ReadGlobalVarShort:73; BE: # %bb.0: # %entry74; BE-NEXT: pld r3, valShort@got@pcrel(0), 175; BE-NEXT: .Lpcrel1:76; BE-NEXT: .reloc .Lpcrel1-8,R_PPC64_PCREL_OPT,.-(.Lpcrel1-8)77; BE-NEXT: lha r3, 0(r3)78; BE-NEXT: blr79entry:80 %0 = load i16, ptr @valShort, align 281 %conv = sext i16 %0 to i3282 ret i32 %conv83}84 85define dso_local void @WriteGlobalVarShort() local_unnamed_addr {86; LE-LABEL: WriteGlobalVarShort:87; LE: # %bb.0: # %entry88; LE-NEXT: pld r3, valShort@got@pcrel(0), 189; LE-NEXT: li r4, 390; LE-NEXT: sth r4, 0(r3)91; LE-NEXT: blr92;93; BE-LABEL: WriteGlobalVarShort:94; BE: # %bb.0: # %entry95; BE-NEXT: pld r3, valShort@got@pcrel(0), 196; BE-NEXT: li r4, 397; BE-NEXT: sth r4, 0(r3)98; BE-NEXT: blr99entry:100 store i16 3, ptr @valShort, align 2101 ret void102}103 104define dso_local signext i32 @ReadGlobalVarInt() local_unnamed_addr {105; LE-LABEL: ReadGlobalVarInt:106; LE: # %bb.0: # %entry107; LE-NEXT: pld r3, valInt@got@pcrel(0), 1108; LE-NEXT: .Lpcrel2:109; LE-NEXT: .reloc .Lpcrel2-8,R_PPC64_PCREL_OPT,.-(.Lpcrel2-8)110; LE-NEXT: lwa r3, 0(r3)111; LE-NEXT: blr112;113; BE-LABEL: ReadGlobalVarInt:114; BE: # %bb.0: # %entry115; BE-NEXT: pld r3, valInt@got@pcrel(0), 1116; BE-NEXT: .Lpcrel2:117; BE-NEXT: .reloc .Lpcrel2-8,R_PPC64_PCREL_OPT,.-(.Lpcrel2-8)118; BE-NEXT: lwa r3, 0(r3)119; BE-NEXT: blr120entry:121 %0 = load i32, ptr @valInt, align 4122 ret i32 %0123}124 125define dso_local void @WriteGlobalVarInt() local_unnamed_addr {126; LE-LABEL: WriteGlobalVarInt:127; LE: # %bb.0: # %entry128; LE-NEXT: pld r3, valInt@got@pcrel(0), 1129; LE-NEXT: li r4, 33130; LE-NEXT: stw r4, 0(r3)131; LE-NEXT: blr132;133; BE-LABEL: WriteGlobalVarInt:134; BE: # %bb.0: # %entry135; BE-NEXT: pld r3, valInt@got@pcrel(0), 1136; BE-NEXT: li r4, 33137; BE-NEXT: stw r4, 0(r3)138; BE-NEXT: blr139entry:140 store i32 33, ptr @valInt, align 4141 ret void142}143 144define dso_local signext i32 @ReadGlobalVarUnsigned() local_unnamed_addr {145; LE-LABEL: ReadGlobalVarUnsigned:146; LE: # %bb.0: # %entry147; LE-NEXT: pld r3, valUnsigned@got@pcrel(0), 1148; LE-NEXT: .Lpcrel3:149; LE-NEXT: .reloc .Lpcrel3-8,R_PPC64_PCREL_OPT,.-(.Lpcrel3-8)150; LE-NEXT: lwa r3, 0(r3)151; LE-NEXT: blr152;153; BE-LABEL: ReadGlobalVarUnsigned:154; BE: # %bb.0: # %entry155; BE-NEXT: pld r3, valUnsigned@got@pcrel(0), 1156; BE-NEXT: .Lpcrel3:157; BE-NEXT: .reloc .Lpcrel3-8,R_PPC64_PCREL_OPT,.-(.Lpcrel3-8)158; BE-NEXT: lwa r3, 0(r3)159; BE-NEXT: blr160entry:161 %0 = load i32, ptr @valUnsigned, align 4162 ret i32 %0163}164 165define dso_local void @WriteGlobalVarUnsigned() local_unnamed_addr {166; LE-LABEL: WriteGlobalVarUnsigned:167; LE: # %bb.0: # %entry168; LE-NEXT: pld r3, valUnsigned@got@pcrel(0), 1169; LE-NEXT: li r4, 33170; LE-NEXT: stw r4, 0(r3)171; LE-NEXT: blr172;173; BE-LABEL: WriteGlobalVarUnsigned:174; BE: # %bb.0: # %entry175; BE-NEXT: pld r3, valUnsigned@got@pcrel(0), 1176; BE-NEXT: li r4, 33177; BE-NEXT: stw r4, 0(r3)178; BE-NEXT: blr179entry:180 store i32 33, ptr @valUnsigned, align 4181 ret void182}183 184define dso_local signext i32 @ReadGlobalVarLong() local_unnamed_addr {185; LE-LABEL: ReadGlobalVarLong:186; LE: # %bb.0: # %entry187; LE-NEXT: pld r3, valLong@got@pcrel(0), 1188; LE-NEXT: .Lpcrel4:189; LE-NEXT: .reloc .Lpcrel4-8,R_PPC64_PCREL_OPT,.-(.Lpcrel4-8)190; LE-NEXT: lwa r3, 0(r3)191; LE-NEXT: blr192;193; BE-LABEL: ReadGlobalVarLong:194; BE: # %bb.0: # %entry195; BE-NEXT: pld r3, valLong@got@pcrel(0), 1196; BE-NEXT: .Lpcrel4:197; BE-NEXT: .reloc .Lpcrel4-8,R_PPC64_PCREL_OPT,.-(.Lpcrel4-8)198; BE-NEXT: lwa r3, 4(r3)199; BE-NEXT: blr200entry:201 %0 = load i64, ptr @valLong, align 8202 %conv = trunc i64 %0 to i32203 ret i32 %conv204}205 206define dso_local void @WriteGlobalVarLong() local_unnamed_addr {207; LE-LABEL: WriteGlobalVarLong:208; LE: # %bb.0: # %entry209; LE-NEXT: pld r3, valLong@got@pcrel(0), 1210; LE-NEXT: li r4, 3333211; LE-NEXT: std r4, 0(r3)212; LE-NEXT: blr213;214; BE-LABEL: WriteGlobalVarLong:215; BE: # %bb.0: # %entry216; BE-NEXT: pld r3, valLong@got@pcrel(0), 1217; BE-NEXT: li r4, 3333218; BE-NEXT: std r4, 0(r3)219; BE-NEXT: blr220entry:221 store i64 3333, ptr @valLong, align 8222 ret void223}224 225define dso_local ptr @ReadGlobalPtr() local_unnamed_addr {226; LE-LABEL: ReadGlobalPtr:227; LE: # %bb.0: # %entry228; LE-NEXT: pld r3, ptr@got@pcrel(0), 1229; LE-NEXT: .Lpcrel5:230; LE-NEXT: .reloc .Lpcrel5-8,R_PPC64_PCREL_OPT,.-(.Lpcrel5-8)231; LE-NEXT: ld r3, 0(r3)232; LE-NEXT: blr233;234; BE-LABEL: ReadGlobalPtr:235; BE: # %bb.0: # %entry236; BE-NEXT: pld r3, ptr@got@pcrel(0), 1237; BE-NEXT: .Lpcrel5:238; BE-NEXT: .reloc .Lpcrel5-8,R_PPC64_PCREL_OPT,.-(.Lpcrel5-8)239; BE-NEXT: ld r3, 0(r3)240; BE-NEXT: blr241entry:242 %0 = load ptr, ptr @ptr, align 8243 ret ptr %0244}245 246define dso_local void @WriteGlobalPtr() local_unnamed_addr {247; LE-LABEL: WriteGlobalPtr:248; LE: # %bb.0: # %entry249; LE-NEXT: pld r3, ptr@got@pcrel(0), 1250; LE-NEXT: .Lpcrel6:251; LE-NEXT: li r4, 3252; LE-NEXT: .reloc .Lpcrel6-8,R_PPC64_PCREL_OPT,.-(.Lpcrel6-8)253; LE-NEXT: ld r3, 0(r3)254; LE-NEXT: stw r4, 0(r3)255; LE-NEXT: blr256;257; BE-LABEL: WriteGlobalPtr:258; BE: # %bb.0: # %entry259; BE-NEXT: pld r3, ptr@got@pcrel(0), 1260; BE-NEXT: .Lpcrel6:261; BE-NEXT: li r4, 3262; BE-NEXT: .reloc .Lpcrel6-8,R_PPC64_PCREL_OPT,.-(.Lpcrel6-8)263; BE-NEXT: ld r3, 0(r3)264; BE-NEXT: stw r4, 0(r3)265; BE-NEXT: blr266entry:267 %0 = load ptr, ptr @ptr, align 8268 store i32 3, ptr %0, align 4269 ret void270}271 272define dso_local nonnull ptr @GlobalVarAddr() local_unnamed_addr {273; LE-LABEL: GlobalVarAddr:274; LE: # %bb.0: # %entry275; LE-NEXT: pld r3, valInt@got@pcrel(0), 1276; LE-NEXT: blr277;278; BE-LABEL: GlobalVarAddr:279; BE: # %bb.0: # %entry280; BE-NEXT: pld r3, valInt@got@pcrel(0), 1281; BE-NEXT: blr282entry:283 ret ptr @valInt284}285 286define dso_local signext i32 @ReadGlobalArray() local_unnamed_addr {287; LE-LABEL: ReadGlobalArray:288; LE: # %bb.0: # %entry289; LE-NEXT: pld r3, array@got@pcrel(0), 1290; LE-NEXT: .Lpcrel7:291; LE-NEXT: .reloc .Lpcrel7-8,R_PPC64_PCREL_OPT,.-(.Lpcrel7-8)292; LE-NEXT: lwa r3, 12(r3)293; LE-NEXT: blr294;295; BE-LABEL: ReadGlobalArray:296; BE: # %bb.0: # %entry297; BE-NEXT: pld r3, array@got@pcrel(0), 1298; BE-NEXT: .Lpcrel7:299; BE-NEXT: .reloc .Lpcrel7-8,R_PPC64_PCREL_OPT,.-(.Lpcrel7-8)300; BE-NEXT: lwa r3, 12(r3)301; BE-NEXT: blr302entry:303 %0 = load i32, ptr getelementptr inbounds ([10 x i32], ptr @array, i64 0, i64 3), align 4304 ret i32 %0305}306 307define dso_local void @WriteGlobalArray() local_unnamed_addr {308; LE-LABEL: WriteGlobalArray:309; LE: # %bb.0: # %entry310; LE-NEXT: pld r3, array@got@pcrel(0), 1311; LE-NEXT: li r4, 5312; LE-NEXT: stw r4, 12(r3)313; LE-NEXT: blr314;315; BE-LABEL: WriteGlobalArray:316; BE: # %bb.0: # %entry317; BE-NEXT: pld r3, array@got@pcrel(0), 1318; BE-NEXT: li r4, 5319; BE-NEXT: stw r4, 12(r3)320; BE-NEXT: blr321entry:322 store i32 5, ptr getelementptr inbounds ([10 x i32], ptr @array, i64 0, i64 3), align 4323 ret void324}325 326define dso_local signext i32 @ReadGlobalStruct() local_unnamed_addr {327; LE-LABEL: ReadGlobalStruct:328; LE: # %bb.0: # %entry329; LE-NEXT: pld r3, structure@got@pcrel(0), 1330; LE-NEXT: .Lpcrel8:331; LE-NEXT: .reloc .Lpcrel8-8,R_PPC64_PCREL_OPT,.-(.Lpcrel8-8)332; LE-NEXT: lwa r3, 4(r3)333; LE-NEXT: blr334;335; BE-LABEL: ReadGlobalStruct:336; BE: # %bb.0: # %entry337; BE-NEXT: pld r3, structure@got@pcrel(0), 1338; BE-NEXT: .Lpcrel8:339; BE-NEXT: .reloc .Lpcrel8-8,R_PPC64_PCREL_OPT,.-(.Lpcrel8-8)340; BE-NEXT: lwa r3, 4(r3)341; BE-NEXT: blr342entry:343 %0 = load i32, ptr getelementptr inbounds (%struct.Struct, ptr @structure, i64 0, i32 2), align 4344 ret i32 %0345}346 347define dso_local void @WriteGlobalStruct() local_unnamed_addr {348; LE-LABEL: WriteGlobalStruct:349; LE: # %bb.0: # %entry350; LE-NEXT: pld r3, structure@got@pcrel(0), 1351; LE-NEXT: li r4, 3352; LE-NEXT: stw r4, 4(r3)353; LE-NEXT: blr354;355; BE-LABEL: WriteGlobalStruct:356; BE: # %bb.0: # %entry357; BE-NEXT: pld r3, structure@got@pcrel(0), 1358; BE-NEXT: li r4, 3359; BE-NEXT: stw r4, 4(r3)360; BE-NEXT: blr361entry:362 store i32 3, ptr getelementptr inbounds (%struct.Struct, ptr @structure, i64 0, i32 2), align 4363 ret void364}365 366define dso_local void @ReadFuncPtr() local_unnamed_addr {367; LE-LABEL: ReadFuncPtr:368; LE: .localentry ReadFuncPtr, 1369; LE-NEXT: # %bb.0: # %entry370; LE-NEXT: pld r3, ptrfunc@got@pcrel(0), 1371; LE-NEXT: .Lpcrel9:372; LE-NEXT: .reloc .Lpcrel9-8,R_PPC64_PCREL_OPT,.-(.Lpcrel9-8)373; LE-NEXT: ld r12, 0(r3)374; LE-NEXT: mtctr r12375; LE-NEXT: bctr376; LE-NEXT: #TC_RETURNr8 ctr 0377;378; BE-LABEL: ReadFuncPtr:379; BE: .localentry ReadFuncPtr, 1380; BE-NEXT: # %bb.0: # %entry381; BE-NEXT: pld r3, ptrfunc@got@pcrel(0), 1382; BE-NEXT: .Lpcrel9:383; BE-NEXT: .reloc .Lpcrel9-8,R_PPC64_PCREL_OPT,.-(.Lpcrel9-8)384; BE-NEXT: ld r12, 0(r3)385; BE-NEXT: mtctr r12386; BE-NEXT: bctr387; BE-NEXT: #TC_RETURNr8 ctr 0388entry:389 %0 = load ptr, ptr @ptrfunc, align 8390 tail call void %0()391 ret void392}393 394define dso_local void @WriteFuncPtr() local_unnamed_addr {395; LE-LABEL: WriteFuncPtr:396; LE: # %bb.0: # %entry397; LE-NEXT: pld r3, ptrfunc@got@pcrel(0), 1398; LE-NEXT: pld r4, function@got@pcrel(0), 1399; LE-NEXT: std r4, 0(r3)400; LE-NEXT: blr401;402; BE-LABEL: WriteFuncPtr:403; BE: # %bb.0: # %entry404; BE-NEXT: pld r3, ptrfunc@got@pcrel(0), 1405; BE-NEXT: pld r4, function@got@pcrel(0), 1406; BE-NEXT: std r4, 0(r3)407; BE-NEXT: blr408entry:409 store ptr @function, ptr @ptrfunc, align 8410 ret void411}412 413declare void @function(...)414 415