184 lines · plain
1; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \2; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names < %s \3; RUN: | FileCheck %s --check-prefixes=CHECK-S,CHECK-ALL4; RUN: llc -verify-machineinstrs -target-abi=elfv2 -mtriple=powerpc64-- \5; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names < %s \6; RUN: | FileCheck %s --check-prefixes=CHECK-S,CHECK-ALL7; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \8; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names < %s \9; RUN: | FileCheck %s --check-prefixes=CHECK-P9,CHECK-ALL10; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \11; RUN: -mcpu=pwr9 --code-model=large -ppc-asm-full-reg-names < %s \12; RUN: | FileCheck %s --check-prefixes=CHECK-LARGE,CHECK-ALL13 14@global_int = common dso_local local_unnamed_addr global i32 0, align 415 16define dso_local signext i32 @NoTOC() local_unnamed_addr {17; CHECK-ALL-LABEL: NoTOC:18; CHECK-S-NOT: .localentry19; CHECK-S: li r3, 4220; CHECK-S-NEXT: blr21entry:22 ret i32 4223}24 25define dso_local signext i32 @AsmClobberX2(i32 signext %a, i32 signext %b) local_unnamed_addr {26; CHECK-ALL-LABEL: AsmClobberX2:27; CHECK-S: .localentry AsmClobberX2, 128; CHECK-S: add r3, r4, r329; CHECK-S: #APP30; CHECK-S-NEXT: nop31; CHECK-S-NEXT: #NO_APP32; CHECK-S: blr33entry:34 %add = add nsw i32 %b, %a35 tail call void asm sideeffect "nop", "~{r2}"()36 ret i32 %add37}38 39; FIXME: This is actually a test case that shows a bug. On power9 and earlier40; this test should not compile. On later CPUs (like this test) the @toc41; should be replaced with @pcrel and we won't need R2 and so the problem42; goes away.43define dso_local signext i32 @AsmClobberX2WithTOC(i32 signext %a, i32 signext %b) local_unnamed_addr {44; CHECK-ALL-LABEL: AsmClobberX2WithTOC:45; CHECK-LARGE: ld r2, .Lfunc_toc2-.Lfunc_gep2(r12)46; CHECK-LARGE: add r2, r2, r1247; CHECK-S: .localentry AsmClobberX2WithTOC48; CHECK-S: #APP49; CHECK-S-NEXT: li r2, 050; CHECK-S-NEXT: #NO_APP51; CHECK-S-NEXT: plwz r5, global_int@PCREL(0), 152; CHECK-S-NEXT: add r3, r4, r353; CHECK-S-NEXT: add r3, r3, r554; CHECK-S-NEXT: extsw r3, r355; CHECK-S-NEXT: blr56entry:57 %add = add nsw i32 %b, %a58 tail call void asm sideeffect "li 2, 0", "~{r2}"()59 %0 = load i32, ptr @global_int, align 460 %add1 = add nsw i32 %add, %061 ret i32 %add162}63 64define dso_local signext i32 @AsmClobberX5(i32 signext %a, i32 signext %b) local_unnamed_addr {65; CHECK-ALL-LABEL: AsmClobberX5:66; CHECK-S: .localentry AsmClobberX5, 167; CHECK-P9-NOT: .localentry68; CHECK-ALL: # %bb.0: # %entry69; CHECK-S-NEXT: add r3, r4, r370; CHECK-S-NEXT: #APP71; CHECK-S-NEXT: nop72; CHECK-S-NEXT: #NO_APP73; CHECK-S-NEXT: extsw r3, r374; CHECK-S-NEXT: blr75entry:76 %add = add nsw i32 %b, %a77 tail call void asm sideeffect "nop", "~{r5}"()78 ret i32 %add79}80 81; Clobber all GPRs except R2.82define dso_local signext i32 @AsmClobberNotR2(i32 signext %a, i32 signext %b) local_unnamed_addr {83; CHECK-ALL-LABEL: AsmClobberNotR2:84; CHECK-S: .localentry AsmClobberNotR2, 185; CHECK-P9-NOT: .localentry86; CHECK-S: add r3, r4, r387; CHECK-S: stw r3, -148(r1) # 4-byte Folded Spill88; CHECK-S-NEXT: #APP89; CHECK-S-NEXT: nop90; CHECK-S-NEXT: #NO_APP91; CHECK-S-NEXT: lwz r3, -148(r1) # 4-byte Folded Reload92; CHECK-S: blr93entry:94 %add = add nsw i32 %b, %a95 tail call void asm sideeffect "nop", "~{r0},~{r1},~{r3},~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15},~{r16},~{r17},~{r18},~{r19},~{r20},~{r21},~{r22},~{r23},~{r24},~{r25},~{r26},~{r27},~{r28},~{r29},~{r30},~{r31}"()96 ret i32 %add97}98 99; Increase register pressure enough to force the register allocator to100; make use of R2.101define dso_local signext i32 @X2IsCallerSaved(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d, i32 signext %e, i32 signext %f, i32 signext %g, i32 signext %h) local_unnamed_addr {102; CHECK-ALL-LABEL: X2IsCallerSaved:103; CHECK-S: .localentry X2IsCallerSaved, 1104; CHECK-P9-NOT: .localentry105; CHECK-ALL: # %bb.0: # %entry106; CHECK-S-NEXT: std r29, -24(r1) # 8-byte Folded Spill107; CHECK-S-NEXT: std r30, -16(r1) # 8-byte Folded Spill108; CHECK-S-NEXT: add r11, r4, r3109; CHECK-S-NEXT: sub r29, r8, r9110; CHECK-S-NEXT: add r9, r10, r9111; CHECK-S-NEXT: sub r10, r10, r3112; CHECK-S-NEXT: mullw r3, r4, r3113; CHECK-S-NEXT: sub r12, r4, r5114; CHECK-S-NEXT: add r0, r6, r5115; CHECK-S-NEXT: sub r2, r6, r7116; CHECK-S-NEXT: add r30, r8, r7117; CHECK-S-NEXT: mullw r3, r3, r11118; CHECK-S-NEXT: mullw r3, r3, r5119; CHECK-S-NEXT: mullw r3, r3, r6120; CHECK-S-NEXT: mullw r3, r3, r12121; CHECK-S-NEXT: mullw r3, r3, r0122; CHECK-S-NEXT: mullw r3, r3, r7123; CHECK-S-NEXT: mullw r3, r3, r8124; CHECK-S-NEXT: mullw r3, r3, r2125; CHECK-S-NEXT: mullw r3, r3, r30126; CHECK-S-NEXT: ld r30, -16(r1) # 8-byte Folded Reload127; CHECK-S-NEXT: mullw r3, r3, r29128; CHECK-S-NEXT: ld r29, -24(r1) # 8-byte Folded Reload129; CHECK-S-NEXT: mullw r3, r3, r9130; CHECK-S-NEXT: mullw r3, r3, r10131; CHECK-S-NEXT: extsw r3, r3132; CHECK-S-NEXT: blr133entry:134 %add = add nsw i32 %b, %a135 %sub = sub nsw i32 %b, %c136 %add1 = add nsw i32 %d, %c137 %sub2 = sub nsw i32 %d, %e138 %add3 = add nsw i32 %f, %e139 %sub4 = sub nsw i32 %f, %g140 %add5 = add nsw i32 %h, %g141 %sub6 = sub nsw i32 %h, %a142 %mul = mul i32 %b, %a143 %mul7 = mul i32 %mul, %add144 %mul8 = mul i32 %mul7, %c145 %mul9 = mul i32 %mul8, %d146 %mul10 = mul i32 %mul9, %sub147 %mul11 = mul i32 %mul10, %add1148 %mul12 = mul i32 %mul11, %e149 %mul13 = mul i32 %mul12, %f150 %mul14 = mul i32 %mul13, %sub2151 %mul15 = mul i32 %mul14, %add3152 %mul16 = mul i32 %mul15, %sub4153 %mul17 = mul i32 %mul16, %add5154 %mul18 = mul i32 %mul17, %sub6155 ret i32 %mul18156}157 158 159define dso_local signext i32 @UsesX2AsTOC() local_unnamed_addr {160; CHECK-ALL-LABEL: UsesX2AsTOC:161; CHECK-LARGE: ld r2, .Lfunc_toc6-.Lfunc_gep6(r12)162; CHECK-LARGE: add r2, r2, r12163; CHECK-ALL: # %bb.0: # %entry164entry:165 %0 = load i32, ptr @global_int, align 4166 ret i32 %0167}168 169 170define dso_local double @UsesX2AsConstPoolTOC() local_unnamed_addr {171; CHECK-ALL-LABEL: UsesX2AsConstPoolTOC:172; CHECK-LARGE: ld r2, .Lfunc_toc7-.Lfunc_gep7(r12)173; CHECK-LARGE: add r2, r2, r12174; CHECK-S-NOT: .localentry175; CHECK-ALL: # %bb.0: # %entry176; CHECK-S-NEXT: xxsplti32dx vs1, 0, 1078011044177; CHECK-S-NEXT: xxsplti32dx vs1, 1, -337824948178; CHECK-S-NEXT: blr179entry:180 ret double 0x404124A4EBDD334C181}182 183 184