1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=powerpc64le-unknown-linux-unknown -verify-machineinstrs %s \ 3; RUN: -ppc-asm-full-reg-names -o - | FileCheck %s --check-prefix=PPC64LE 4; RUN: llc -mtriple=powerpc64-unknown-linux-unknown -verify-machineinstrs %s \ 5; RUN: -ppc-asm-full-reg-names -o - | FileCheck %s --check-prefix=PPC64BE 6 7define dso_local void @ClobberLR() local_unnamed_addr #0 { 8; PPC64LE-LABEL: ClobberLR: 9; PPC64LE: # %bb.0: # %entry 10; PPC64LE-NEXT: mflr r0 11; PPC64LE-NEXT: std r0, 16(r1) 12; PPC64LE-NEXT: stdu r1, -32(r1) 13; PPC64LE-NEXT: #APP 14; PPC64LE-NEXT: #NO_APP 15; PPC64LE-NEXT: addi r1, r1, 32 16; PPC64LE-NEXT: ld r0, 16(r1) 17; PPC64LE-NEXT: mtlr r0 18; PPC64LE-NEXT: blr 19; 20; PPC64BE-LABEL: ClobberLR: 21; PPC64BE: # %bb.0: # %entry 22; PPC64BE-NEXT: mflr r0 23; PPC64BE-NEXT: std r0, 16(r1) 24; PPC64BE-NEXT: stdu r1, -48(r1) 25; PPC64BE-NEXT: #APP 26; PPC64BE-NEXT: #NO_APP 27; PPC64BE-NEXT: addi r1, r1, 48 28; PPC64BE-NEXT: ld r0, 16(r1) 29; PPC64BE-NEXT: mtlr r0 30; PPC64BE-NEXT: blr 31entry: 32 tail call void asm sideeffect "", "~{lr}"() 33 ret void 34} 35 36define dso_local void @ClobberR5() local_unnamed_addr #0 { 37; PPC64LE-LABEL: ClobberR5: 38; PPC64LE: # %bb.0: # %entry 39; PPC64LE-NEXT: #APP 40; PPC64LE-NEXT: #NO_APP 41; PPC64LE-NEXT: blr 42; 43; PPC64BE-LABEL: ClobberR5: 44; PPC64BE: # %bb.0: # %entry 45; PPC64BE-NEXT: #APP 46; PPC64BE-NEXT: #NO_APP 47; PPC64BE-NEXT: blr 48entry: 49 tail call void asm sideeffect "", "~{r5}"() 50 ret void 51} 52 53define dso_local void @ClobberR15() local_unnamed_addr #0 { 54; PPC64LE-LABEL: ClobberR15: 55; PPC64LE: # %bb.0: # %entry 56; PPC64LE-NEXT: std r15, -136(r1) # 8-byte Folded Spill 57; PPC64LE-NEXT: #APP 58; PPC64LE-NEXT: #NO_APP 59; PPC64LE-NEXT: ld r15, -136(r1) # 8-byte Folded Reload 60; PPC64LE-NEXT: blr 61; 62; PPC64BE-LABEL: ClobberR15: 63; PPC64BE: # %bb.0: # %entry 64; PPC64BE-NEXT: std r15, -136(r1) # 8-byte Folded Spill 65; PPC64BE-NEXT: #APP 66; PPC64BE-NEXT: #NO_APP 67; PPC64BE-NEXT: ld r15, -136(r1) # 8-byte Folded Reload 68; PPC64BE-NEXT: blr 69entry: 70 tail call void asm sideeffect "", "~{r15}"() 71 ret void 72} 73 74;; Test for INLINEASM_BR 75define dso_local signext i32 @ClobberLR_BR(i32 signext %in) #0 { 76; PPC64LE-LABEL: ClobberLR_BR: 77; PPC64LE: # %bb.0: # %entry 78; PPC64LE-NEXT: #APP 79; PPC64LE-NEXT: nop 80; PPC64LE-NEXT: #NO_APP 81; PPC64LE-NEXT: # %bb.1: # %return 82; PPC64LE-NEXT: extsw r3, r3 83; PPC64LE-NEXT: blr 84; PPC64LE-NEXT: .Ltmp0: # Block address taken 85; PPC64LE-NEXT: .LBB3_2: # %return_early 86; PPC64LE-NEXT: mflr r0 87; PPC64LE-NEXT: std r0, 16(r1) 88; PPC64LE-NEXT: stdu r1, -32(r1) 89; PPC64LE-NEXT: li r3, 0 90; PPC64LE-NEXT: addi r1, r1, 32 91; PPC64LE-NEXT: ld r0, 16(r1) 92; PPC64LE-NEXT: mtlr r0 93; PPC64LE-NEXT: extsw r3, r3 94; PPC64LE-NEXT: blr 95; 96; PPC64BE-LABEL: ClobberLR_BR: 97; PPC64BE: # %bb.0: # %entry 98; PPC64BE-NEXT: #APP 99; PPC64BE-NEXT: nop 100; PPC64BE-NEXT: #NO_APP 101; PPC64BE-NEXT: # %bb.1: # %return 102; PPC64BE-NEXT: extsw r3, r3 103; PPC64BE-NEXT: blr 104; PPC64BE-NEXT: .Ltmp0: # Block address taken 105; PPC64BE-NEXT: .LBB3_2: # %return_early 106; PPC64BE-NEXT: mflr r0 107; PPC64BE-NEXT: std r0, 16(r1) 108; PPC64BE-NEXT: stdu r1, -48(r1) 109; PPC64BE-NEXT: li r3, 0 110; PPC64BE-NEXT: addi r1, r1, 48 111; PPC64BE-NEXT: ld r0, 16(r1) 112; PPC64BE-NEXT: mtlr r0 113; PPC64BE-NEXT: extsw r3, r3 114; PPC64BE-NEXT: blr 115entry: 116 callbr void asm sideeffect "nop", "X,~{lr}"(i8* blockaddress(@ClobberLR_BR, %return_early)) 117 to label %return [label %return_early] 118 119return_early: 120 br label %return 121 122return: 123 %retval.0 = phi i32 [ 0, %return_early ], [ %in, %entry ] 124 ret i32 %retval.0 125} 126 127define dso_local signext i32 @ClobberR5_BR(i32 signext %in) #0 { 128; PPC64LE-LABEL: ClobberR5_BR: 129; PPC64LE: # %bb.0: # %entry 130; PPC64LE-NEXT: #APP 131; PPC64LE-NEXT: nop 132; PPC64LE-NEXT: #NO_APP 133; PPC64LE-NEXT: # %bb.1: # %return 134; PPC64LE-NEXT: extsw r3, r3 135; PPC64LE-NEXT: blr 136; PPC64LE-NEXT: .Ltmp1: # Block address taken 137; PPC64LE-NEXT: .LBB4_2: # %return_early 138; PPC64LE-NEXT: li r3, 0 139; PPC64LE-NEXT: extsw r3, r3 140; PPC64LE-NEXT: blr 141; 142; PPC64BE-LABEL: ClobberR5_BR: 143; PPC64BE: # %bb.0: # %entry 144; PPC64BE-NEXT: #APP 145; PPC64BE-NEXT: nop 146; PPC64BE-NEXT: #NO_APP 147; PPC64BE-NEXT: # %bb.1: # %return 148; PPC64BE-NEXT: extsw r3, r3 149; PPC64BE-NEXT: blr 150; PPC64BE-NEXT: .Ltmp1: # Block address taken 151; PPC64BE-NEXT: .LBB4_2: # %return_early 152; PPC64BE-NEXT: li r3, 0 153; PPC64BE-NEXT: extsw r3, r3 154; PPC64BE-NEXT: blr 155entry: 156 callbr void asm sideeffect "nop", "X,~{r5}"(i8* blockaddress(@ClobberR5_BR, %return_early)) 157 to label %return [label %return_early] 158 159return_early: 160 br label %return 161 162return: 163 %retval.0 = phi i32 [ 0, %return_early ], [ %in, %entry ] 164 ret i32 %retval.0 165} 166 167 168 169define dso_local void @DefLR() local_unnamed_addr #0 { 170; PPC64LE-LABEL: DefLR: 171; PPC64LE: # %bb.0: # %entry 172; PPC64LE-NEXT: mflr r0 173; PPC64LE-NEXT: std r0, 16(r1) 174; PPC64LE-NEXT: stdu r1, -32(r1) 175; PPC64LE-NEXT: #APP 176; PPC64LE-NEXT: #NO_APP 177; PPC64LE-NEXT: addi r1, r1, 32 178; PPC64LE-NEXT: ld r0, 16(r1) 179; PPC64LE-NEXT: mtlr r0 180; PPC64LE-NEXT: blr 181; 182; PPC64BE-LABEL: DefLR: 183; PPC64BE: # %bb.0: # %entry 184; PPC64BE-NEXT: mflr r0 185; PPC64BE-NEXT: std r0, 16(r1) 186; PPC64BE-NEXT: stdu r1, -48(r1) 187; PPC64BE-NEXT: #APP 188; PPC64BE-NEXT: #NO_APP 189; PPC64BE-NEXT: addi r1, r1, 48 190; PPC64BE-NEXT: ld r0, 16(r1) 191; PPC64BE-NEXT: mtlr r0 192; PPC64BE-NEXT: blr 193entry: 194 tail call i64 asm sideeffect "", "={lr}"() 195 ret void 196} 197 198define dso_local void @EarlyClobberLR() local_unnamed_addr #0 { 199; PPC64LE-LABEL: EarlyClobberLR: 200; PPC64LE: # %bb.0: # %entry 201; PPC64LE-NEXT: mflr r0 202; PPC64LE-NEXT: std r0, 16(r1) 203; PPC64LE-NEXT: stdu r1, -32(r1) 204; PPC64LE-NEXT: #APP 205; PPC64LE-NEXT: #NO_APP 206; PPC64LE-NEXT: addi r1, r1, 32 207; PPC64LE-NEXT: ld r0, 16(r1) 208; PPC64LE-NEXT: mtlr r0 209; PPC64LE-NEXT: blr 210; 211; PPC64BE-LABEL: EarlyClobberLR: 212; PPC64BE: # %bb.0: # %entry 213; PPC64BE-NEXT: mflr r0 214; PPC64BE-NEXT: std r0, 16(r1) 215; PPC64BE-NEXT: stdu r1, -48(r1) 216; PPC64BE-NEXT: #APP 217; PPC64BE-NEXT: #NO_APP 218; PPC64BE-NEXT: addi r1, r1, 48 219; PPC64BE-NEXT: ld r0, 16(r1) 220; PPC64BE-NEXT: mtlr r0 221; PPC64BE-NEXT: blr 222entry: 223 tail call i64 asm sideeffect "", "=&{lr}"() 224 ret void 225} 226 227define dso_local void @ClobberMulti() local_unnamed_addr #0 { 228; PPC64LE-LABEL: ClobberMulti: 229; PPC64LE: # %bb.0: # %entry 230; PPC64LE-NEXT: mflr r0 231; PPC64LE-NEXT: std r15, -136(r1) # 8-byte Folded Spill 232; PPC64LE-NEXT: std r16, -128(r1) # 8-byte Folded Spill 233; PPC64LE-NEXT: std r0, 16(r1) 234; PPC64LE-NEXT: stdu r1, -176(r1) 235; PPC64LE-NEXT: #APP 236; PPC64LE-NEXT: #NO_APP 237; PPC64LE-NEXT: addi r1, r1, 176 238; PPC64LE-NEXT: ld r0, 16(r1) 239; PPC64LE-NEXT: ld r16, -128(r1) # 8-byte Folded Reload 240; PPC64LE-NEXT: ld r15, -136(r1) # 8-byte Folded Reload 241; PPC64LE-NEXT: mtlr r0 242; PPC64LE-NEXT: blr 243; 244; PPC64BE-LABEL: ClobberMulti: 245; PPC64BE: # %bb.0: # %entry 246; PPC64BE-NEXT: mflr r0 247; PPC64BE-NEXT: std r0, 16(r1) 248; PPC64BE-NEXT: stdu r1, -192(r1) 249; PPC64BE-NEXT: std r15, 56(r1) # 8-byte Folded Spill 250; PPC64BE-NEXT: std r16, 64(r1) # 8-byte Folded Spill 251; PPC64BE-NEXT: #APP 252; PPC64BE-NEXT: #NO_APP 253; PPC64BE-NEXT: ld r16, 64(r1) # 8-byte Folded Reload 254; PPC64BE-NEXT: ld r15, 56(r1) # 8-byte Folded Reload 255; PPC64BE-NEXT: addi r1, r1, 192 256; PPC64BE-NEXT: ld r0, 16(r1) 257; PPC64BE-NEXT: mtlr r0 258; PPC64BE-NEXT: blr 259entry: 260 tail call void asm sideeffect "", "~{lr},~{r15},~{r16}"() 261 ret void 262} 263 264attributes #0 = { nounwind } 265