308 lines · plain
1; RUN: llc -mcpu=ppc -mtriple powerpc-ibm-aix-xcoff -verify-machineinstrs < %s \2; RUN: -stop-before=ppc-vsx-copy | FileCheck %s --check-prefix CHECK323; RUN: llc -mcpu=ppc -mtriple powerpc64-ibm-aix-xcoff -verify-machineinstrs < %s \4; RUN: -stop-before=ppc-vsx-copy | FileCheck %s --check-prefix CHECK645; RUN: llc -mcpu=ppc -mtriple powerpc-ibm-aix-xcoff -verify-machineinstrs < %s | FileCheck %s --check-prefix TEST326; RUN: llc -mcpu=ppc -mtriple powerpc64-ibm-aix-xcoff -verify-machineinstrs < %s | FileCheck %s --check-prefix TEST647 8; RUN: llc -mcpu=ppc -mtriple powerpc-ibm-aix-xcoff -verify-machineinstrs < %s \9; RUN: -stop-before=ppc-vsx-copy -O0 | FileCheck %s --check-prefix CHECK3210; RUN: llc -mcpu=ppc -mtriple powerpc64-ibm-aix-xcoff -verify-machineinstrs < %s \11; RUN: -stop-before=ppc-vsx-copy -O0 | FileCheck %s --check-prefix CHECK64-NOOPT12; RUN: llc -mcpu=ppc -mtriple powerpc-ibm-aix-xcoff -verify-machineinstrs -O0 < %s | FileCheck %s --check-prefix TEST3213; RUN: llc -mcpu=ppc -mtriple powerpc64-ibm-aix-xcoff -verify-machineinstrs -O0 < %s | FileCheck %s --check-prefix TEST6414 15; RUN: llc -mcpu=ppc -mtriple powerpc-ibm-aix-xcoff -code-model=large -verify-machineinstrs < %s \16; RUN: -stop-before=ppc-vsx-copy | FileCheck %s --check-prefix CHECK32LARGE17; RUN: llc -mcpu=ppc -mtriple powerpc-ibm-aix-xcoff -code-model=large -verify-machineinstrs < %s | FileCheck %s --check-prefix TEST32LARGE18 19; RUN: llc -mcpu=ppc -mtriple powerpc64-ibm-aix-xcoff -code-model=large -verify-machineinstrs < %s \20; RUN: -stop-before=ppc-vsx-copy | FileCheck %s --check-prefix CHECK64LARGE21; RUN: llc -mcpu=ppc -mtriple powerpc64-ibm-aix-xcoff -code-model=large -verify-machineinstrs < %s | FileCheck %s --check-prefix TEST64LARGE22 23; Global variables i and f have the toc-data attribute.24; In the following functions, those writing to or reading from25; variables i and f should use the toc-data access pattern.26; All remaining variables should use the regular toc access sequence.27@i = dso_local global i32 0, align 4 #028@d = dso_local local_unnamed_addr global double 3.141590e+00, align 829@f = dso_local local_unnamed_addr global float 0x4005BE76C0000000, align 4 #030@ll = dso_local local_unnamed_addr global i64 55, align 831@ilocal = internal global i32 0, align 432 33define dso_local void @write_int(i32 signext %in) {34 entry:35 store i32 %in, ptr @i, align 436 ret void37}38; CHECK32: name: write_int39; CHECK32: %[[SCRATCH:[0-9]+]]:gprc_and_gprc_nor0 = ADDItoc $r2, @i40; CHECK32-NEXT: STW %{{[0-9]+}}, 0, killed %[[SCRATCH]] :: (store (s32) into @i)41 42; TEST32: .write_int:43; TEST32: la 4, i[TD](2)44; TEST32-NEXT: stw 3, 0(4)45 46; CHECK64: name: write_int47; CHECK64: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDItoc8 $x2, @i48; CHECK64-NEXT: STW8 %{{[0-9]+}}, 0, killed %[[SCRATCH]] :: (store (s32) into @i)49 50; CHECK64-NOOPT: name: write_int51; CHECK64-NOOPT: %[[SUBREG:[0-9]+]]:gprc = COPY %{{[0-9]}}.sub_3252; CHECK64-NOOPT: %[[ADDR:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDItoc8 $x2, @i53; CHECK64-NOOPT: STW %[[SUBREG]], 0, %[[ADDR]]54 55; TEST64: .write_int:56; TEST64: la 4, i[TD](2)57; TEST64-NEXT: stw 3, 0(4)58 59; CHECK32LARGE: name: write_int60; CHECK32LARGE: %[[SCRATCH1:[0-9]+]]:gprc_and_gprc_nor0 = ADDIStocHA $r2, @i61; CHECK32LARGE-NEXT: %[[SCRATCH2:[0-9]+]]:gprc_and_gprc_nor0 = ADDItocL killed %[[SCRATCH1]], @i62; CHECK32LARGE-NEXT: STW %{{[0-9]+}}, 0, killed %[[SCRATCH2]] :: (store (s32) into @i)63 64; FIXME: peephole optimization opportunity for lower part relocation @l to the consuming stw65; TEST32LARGE: .write_int:66; TEST32LARGE: addis 4, i[TD]@u(2)67; TEST32LARGE-NEXT: la 4, i[TD]@l(4)68; TEST32LARGE-NEXT: stw 3, 0(4)69 70 71; CHECK64LARGE: name: write_int72; CHECK64LARGE: %[[SCRATCH1:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDIStocHA8 $x2, @i73; CHECK64LARGE-NEXT: %[[SCRATCH2:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDItocL8 killed %[[SCRATCH1]], @i74; CHECK64LARGE-NEXT: STW8 %{{[0-9]+}}, 0, killed %[[SCRATCH2]] :: (store (s32) into @i)75 76; TEST64LARGE: .write_int:77; TEST64LARGE: addis 4, i[TD]@u(2)78; TEST64LARGE-NEXT: la 4, i[TD]@l(4)79; TEST64LARGE-NEXT: stw 3, 0(4)80 81define dso_local i64 @read_ll() {82 entry:83 %0 = load i64, ptr @ll, align 884 ret i64 %085}86; CHECK32: name: read_ll87; CHECK32: LWZtoc @ll, $r2 :: (load (s32) from got)88 89; TEST32: .read_ll:90; TEST32: lwz 4, L..C0(2)91; TEST32-NEXT: lwz 3, 0(4)92; TEST32-NEXT: lwz 4, 4(4)93 94; CHECK64: name: read_ll95; CHECK64: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = LDtoc @ll, $x2 :: (load (s64) from got)96; CHECK64: LD 0, killed %[[SCRATCH]]97 98; CHECK64-NOOPT: name: read_ll99; CHECK64-NOOPT: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = LDtoc @ll, $x2100; CHECK64-NOOPT: LD 0, %[[SCRATCH]]101 102; TEST64: .read_ll:103; TEST64: ld 3, L..C0(2)104; TEST64-NEXT: ld 3, 0(3)105 106; CHECK32LARGE: name: read_ll107; CHECK32LARGE: %[[SCRATCH1:[0-9]+]]:gprc_and_gprc_nor0 = ADDIStocHA $r2, @ll108; CHECK32LARGE: LWZtocL @ll, killed %[[SCRATCH1]] :: (load (s32) from got)109 110; TEST32LARGE: .read_ll:111; TEST32LARGE: addis 3, L..C0@u(2)112; TEST32LARGE-NEXT: lwz 4, L..C0@l(3)113; TEST32LARGE-NEXT: lwz 3, 0(4)114; TEST32LARGE-NEXT: lwz 4, 4(4)115 116; CHECK64LARGE: name: read_ll117; CHECK64LARGE: %[[SCRATCH1:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDIStocHA8 $x2, @ll118; CHECK64LARGE: LDtocL @ll, killed %[[SCRATCH1]] :: (load (s64) from got)119 120; TEST64LARGE: .read_ll:121; TEST64LARGE: addis 3, L..C0@u(2)122; TEST64LARGE-NEXT: ld 3, L..C0@l(3)123; TEST64LARGE-NEXT: ld 3, 0(3)124 125define dso_local float @read_float() {126 entry:127 %0 = load float, ptr @f, align 4128 ret float %0129}130; CHECK32: name: read_float131; CHECK32: %[[SCRATCH:[0-9]+]]:gprc_and_gprc_nor0 = ADDItoc $r2, @f132; CHECK32: %{{[0-9]+}}:f4rc = LFS 0, killed %[[SCRATCH]] :: (dereferenceable load (s32) from @f)133 134; TEST32: .read_float:135; TEST32: la 3, f[TD](2)136; TEST32-NEXT: lfs 1, 0(3)137 138; CHECK64: name: read_float139; CHECK64: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDItoc8 $x2, @f140; CHECK64: %{{[0-9]+}}:f4rc = LFS 0, killed %[[SCRATCH]] :: (dereferenceable load (s32) from @f)141 142; CHECK64-NOOPT: name: read_float143; CHECK64-NOOPT: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDItoc8 $x2, @f144; CHECK64-NOOPT: %{{[0-9]+}}:f4rc = LFS 0, %[[SCRATCH]]145 146; TEST64: .read_float:147; TEST64: la 3, f[TD](2)148; TEST64-NEXT: lfs 1, 0(3)149 150; CHECK32LARGE: name: read_float151; CHECK32LARGE: %[[SCRATCH1:[0-9]+]]:gprc_and_gprc_nor0 = ADDIStocHA $r2, @f152; CHECK32LARGE-NEXT: %[[SCRATCH2:[0-9]+]]:gprc_and_gprc_nor0 = ADDItocL killed %[[SCRATCH1]], @f153; CHECK32LARGE-NEXT: LFS 0, killed %[[SCRATCH2]] :: (dereferenceable load (s32) from @f)154 155; FIXME: peephole optimization opportunity for lower part relocation @l to the consuming lfs156; TEST32LARGE: .read_float:157; TEST32LARGE: addis 3, f[TD]@u(2)158; TEST32LARGE-NEXT: la 3, f[TD]@l(3)159; TEST32LARGE-NEXT: lfs 1, 0(3)160 161 162; CHECK64LARGE: name: read_float163; CHECK64LARGE: %[[SCRATCH1:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDIStocHA8 $x2, @f164; CHECK64LARGE-NEXT: %[[SCRATCH2:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDItocL8 killed %[[SCRATCH1]], @f165; CHECK64LARGE-NEXT: LFS 0, killed %[[SCRATCH2]] :: (dereferenceable load (s32) from @f)166 167 168; TEST64LARGE: .read_float:169; TEST64LARGE: addis 3, f[TD]@u(2)170; TEST64LARGE-NEXT: la 3, f[TD]@l(3)171; TEST64LARGE-NEXT: lfs 1, 0(3)172 173define dso_local void @write_double(double %in) {174 entry:175 store double %in, ptr @d, align 8176 ret void177}178; CHECK32: name: write_double179; CHECK32: LWZtoc @d, $r2 :: (load (s32) from got)180 181; TEST32: .write_double182; TEST32: lwz 3, L..C1(2)183; TEST32-NEXT: stfd 1, 0(3)184 185; CHECK64: name: write_double186; CHECK64: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = LDtoc @d, $x2 :: (load (s64) from got)187; CHECK64: STFD %{{[0-9]+}}, 0, killed %[[SCRATCH]]188 189; CHECK64-NOOPT: name: write_double190; CHECK64-NOOPT: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = LDtoc @d, $x2191; CHECK64-NOOPT STFD %{{[0-9]+}}, 0 %[[SCRATCH]]192 193; TEST64: .write_double194; TEST64: ld 3, L..C1(2)195; TEST64-NEXT: stfd 1, 0(3)196 197; CHECK32LARGE: name: write_double198; CHECK32LARGE: %[[SCRATCH1:[0-9]+]]:gprc_and_gprc_nor0 = ADDIStocHA $r2, @d199; CHECK32LARGE: LWZtocL @d, killed %[[SCRATCH1]] :: (load (s32) from got)200 201; TEST32LARGE: .write_double:202; TEST32LARGE: addis 3, L..C1@u(2)203; TEST32LARGE-NEXT: lwz 3, L..C1@l(3)204; TEST32LARGE-NEXT: stfd 1, 0(3)205 206; CHECK64LARGE: name: write_double207; CHECK64LARGE: %[[SCRATCH1:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDIStocHA8 $x2, @d208; CHECK64LARGE: LDtocL @d, killed %[[SCRATCH1]] :: (load (s64) from got)209 210; TEST64LARGE: .write_double:211; TEST64LARGE: addis 3, L..C1@u(2)212; TEST64LARGE-NEXT: ld 3, L..C1@l(3)213; TEST64LARGE-NEXT: stfd 1, 0(3)214 215define dso_local nonnull ptr @addr() {216 entry:217 ret ptr @i218}219; CHECK32: name: addr220; CHECK32: %[[SCRATCH:[0-9]+]]:gprc = ADDItoc $r2, @i221; CHECK32-NEXT: $r3 = COPY %[[SCRATCH]]222 223; TEST32: .addr224; TEST32: la 3, i[TD](2)225 226; CHECK64: name: addr227; CHECK64: %[[SCRATCH:[0-9]+]]:g8rc = ADDItoc8 $x2, @i228; CHECK64-NEXT: $x3 = COPY %[[SCRATCH]]229 230; CHECK64-NOOPT: name: addr231; CHECK64-NOOPT: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDItoc8 $x2, @i232; CHECK64-NOOPT: $x3 = COPY %[[SCRATCH]]233 234; TEST64: .addr235; TEST64: la 3, i[TD](2)236 237; CHECK32LARGE: name: addr238; CHECK32LARGE: %[[SCRATCH1:[0-9]+]]:gprc_and_gprc_nor0 = ADDIStocHA $r2, @i239; CHECK32LARGE-NEXT: %[[SCRATCH2:[0-9]+]]:gprc = ADDItocL killed %[[SCRATCH1]], @i240; CHECK32LARGE-NEXT: $r3 = COPY %[[SCRATCH2]]241 242; TEST32LARGE: .addr:243; TEST32LARGE: addis 3, i[TD]@u(2)244; TEST32LARGE-NEXT: la 3, i[TD]@l(3)245 246; TEST32: .toc247; TEST32: .tc ll[TC],ll[RW]248; TEST32-NOT: .csect ll[TD]249; TEST32: .tc d[TC],d[RW]250; TEST32-NOT: .csect d[TD],2251; TEST32: .csect i[TD],2252; TEST32-NEXT: .globl i[TD]253; TEST32-NEXT: .align 2254; TEST32-NOT: .tc i[TC],i[RW]255; TEST32: .csect f[TD],2256; TEST32-NEXT: .globl f[TD]257; TEST32-NOT: .tc f[TD],f[RW]258 259; TEST64: .toc260; TEST64: .tc ll[TC],ll[RW]261; TEST64-NOT: .csect ll[TD]262; TEST64: .tc d[TC],d[RW]263; TEST64-NOT: .csect d[TD],2264; TEST64: .csect i[TD],2265; TEST64-NEXT: .globl i[TD]266; TEST64-NEXT: .align 2267; TEST64-NOT: .tc i[TC],i[RW]268; TEST64: .csect f[TD],2269; TEST64-NEXT: .globl f[TD]270; TEST64-NOT: .tc f[TD],f[RW]271 272; TEST32LARGE: .toc273; TEST32LARGE: .tc ll[TE],ll[RW]274; TEST32LARGE-NOT: .csect ll[TD]275; TEST32LARGE: .tc d[TE],d[RW]276; TEST32LARGE-NOT: .csect d[TD],2277; TEST32LARGE: .csect i[TD],2278; TEST32LARGE-NEXT: .globl i[TD]279; TEST32LARGE-NEXT: .align 2280; TEST32LARGE-NOT: .tc i[TE],i[RW]281; TEST32LARGE: .csect f[TD],2282; TEST32LARGE-NEXT: .globl f[TD]283; TEST32LARGE-NOT: .tc f[TE],f[RW]284 285; CHECK64LARGE: name: addr286; CHECK64LARGE: %[[SCRATCH1:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDIStocHA8 $x2, @i287; CHECK64LARGE-NEXT: %[[SCRATCH2:[0-9]+]]:g8rc = ADDItocL8 killed %[[SCRATCH1]], @i288; CHECK64LARGE-NEXT: $x3 = COPY %[[SCRATCH2]]289 290; TEST64LARGE: .addr:291; TEST64LARGE: addis 3, i[TD]@u(2)292; TEST64LARGE: la 3, i[TD]@l(3)293 294; TEST64LARGE: .toc295; TEST64LARGE: .tc ll[TE],ll[RW]296; TEST64LARGE-NOT: .csect ll[TD]297; TEST64LARGE: .tc d[TE],d[RW]298; TEST64LARGE-NOT: .csect d[TD],2299; TEST64LARGE: .csect i[TD],2300; TEST64LARGE-NEXT: .globl i[TD]301; TEST64LARGE-NEXT: .align 2302; TEST64LARGE-NOT: .tc i[TE],i[RW]303; TEST64LARGE: .csect f[TD],2304; TEST64LARGE-NEXT: .globl f[TD]305; TEST64LARGE-NOT: .tc f[TE],f[RW]306 307attributes #0 = { "toc-data" }308