1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv64 -mattr=+m -O2 < %s -verify-machineinstrs \ 3; RUN: | FileCheck %s -check-prefix=RV64I 4; RUN: llc -mtriple=riscv32 -mattr=+m -O2 < %s -verify-machineinstrs \ 5; RUN: | FileCheck %s -check-prefix=RV32I 6 7; Tests copied from PowerPC. 8 9; Free probe 10define i8 @f0() #0 nounwind { 11; RV64I-LABEL: f0: 12; RV64I: # %bb.0: # %entry 13; RV64I-NEXT: addi sp, sp, -64 14; RV64I-NEXT: li a0, 3 15; RV64I-NEXT: sb a0, 0(sp) 16; RV64I-NEXT: lbu a0, 0(sp) 17; RV64I-NEXT: addi sp, sp, 64 18; RV64I-NEXT: ret 19; 20; RV32I-LABEL: f0: 21; RV32I: # %bb.0: # %entry 22; RV32I-NEXT: addi sp, sp, -64 23; RV32I-NEXT: li a0, 3 24; RV32I-NEXT: sb a0, 0(sp) 25; RV32I-NEXT: lbu a0, 0(sp) 26; RV32I-NEXT: addi sp, sp, 64 27; RV32I-NEXT: ret 28entry: 29 %a = alloca i8, i64 64 30 %b = getelementptr inbounds i8, ptr %a, i64 63 31 store volatile i8 3, ptr %a 32 %c = load volatile i8, ptr %a 33 ret i8 %c 34} 35 36define i8 @f1() #0 nounwind { 37; RV64I-LABEL: f1: 38; RV64I: # %bb.0: # %entry 39; RV64I-NEXT: lui a0, 1 40; RV64I-NEXT: sub sp, sp, a0 41; RV64I-NEXT: sd zero, 0(sp) 42; RV64I-NEXT: addi sp, sp, -16 43; RV64I-NEXT: li a0, 3 44; RV64I-NEXT: sb a0, 16(sp) 45; RV64I-NEXT: lbu a0, 16(sp) 46; RV64I-NEXT: lui a1, 1 47; RV64I-NEXT: addiw a1, a1, 16 48; RV64I-NEXT: add sp, sp, a1 49; RV64I-NEXT: ret 50; 51; RV32I-LABEL: f1: 52; RV32I: # %bb.0: # %entry 53; RV32I-NEXT: lui a0, 1 54; RV32I-NEXT: sub sp, sp, a0 55; RV32I-NEXT: sw zero, 0(sp) 56; RV32I-NEXT: addi sp, sp, -16 57; RV32I-NEXT: li a0, 3 58; RV32I-NEXT: sb a0, 16(sp) 59; RV32I-NEXT: lbu a0, 16(sp) 60; RV32I-NEXT: lui a1, 1 61; RV32I-NEXT: addi a1, a1, 16 62; RV32I-NEXT: add sp, sp, a1 63; RV32I-NEXT: ret 64entry: 65 %a = alloca i8, i64 4096 66 %b = getelementptr inbounds i8, ptr %a, i64 63 67 store volatile i8 3, ptr %a 68 %c = load volatile i8, ptr %a 69 ret i8 %c 70} 71 72define i8 @f2() #0 nounwind { 73; RV64I-LABEL: f2: 74; RV64I: # %bb.0: # %entry 75; RV64I-NEXT: lui a0, 16 76; RV64I-NEXT: sub t1, sp, a0 77; RV64I-NEXT: lui t2, 1 78; RV64I-NEXT: .LBB2_1: # %entry 79; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 80; RV64I-NEXT: sub sp, sp, t2 81; RV64I-NEXT: sd zero, 0(sp) 82; RV64I-NEXT: bne sp, t1, .LBB2_1 83; RV64I-NEXT: # %bb.2: # %entry 84; RV64I-NEXT: addi sp, sp, -16 85; RV64I-NEXT: li a0, 3 86; RV64I-NEXT: sb a0, 16(sp) 87; RV64I-NEXT: lbu a0, 16(sp) 88; RV64I-NEXT: lui a1, 16 89; RV64I-NEXT: addiw a1, a1, 16 90; RV64I-NEXT: add sp, sp, a1 91; RV64I-NEXT: ret 92; 93; RV32I-LABEL: f2: 94; RV32I: # %bb.0: # %entry 95; RV32I-NEXT: lui a0, 16 96; RV32I-NEXT: sub t1, sp, a0 97; RV32I-NEXT: lui t2, 1 98; RV32I-NEXT: .LBB2_1: # %entry 99; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 100; RV32I-NEXT: sub sp, sp, t2 101; RV32I-NEXT: sw zero, 0(sp) 102; RV32I-NEXT: bne sp, t1, .LBB2_1 103; RV32I-NEXT: # %bb.2: # %entry 104; RV32I-NEXT: addi sp, sp, -16 105; RV32I-NEXT: li a0, 3 106; RV32I-NEXT: sb a0, 16(sp) 107; RV32I-NEXT: lbu a0, 16(sp) 108; RV32I-NEXT: lui a1, 16 109; RV32I-NEXT: addi a1, a1, 16 110; RV32I-NEXT: add sp, sp, a1 111; RV32I-NEXT: ret 112entry: 113 %a = alloca i8, i64 65536 114 %b = getelementptr inbounds i8, ptr %a, i64 63 115 store volatile i8 3, ptr %a 116 %c = load volatile i8, ptr %a 117 ret i8 %c 118} 119 120define i8 @f3() #0 "stack-probe-size"="32768" nounwind { 121; RV64I-LABEL: f3: 122; RV64I: # %bb.0: # %entry 123; RV64I-NEXT: lui a0, 8 124; RV64I-NEXT: sub sp, sp, a0 125; RV64I-NEXT: sd zero, 0(sp) 126; RV64I-NEXT: lui a0, 8 127; RV64I-NEXT: sub sp, sp, a0 128; RV64I-NEXT: sd zero, 0(sp) 129; RV64I-NEXT: addi sp, sp, -16 130; RV64I-NEXT: li a0, 3 131; RV64I-NEXT: sb a0, 16(sp) 132; RV64I-NEXT: lbu a0, 16(sp) 133; RV64I-NEXT: lui a1, 16 134; RV64I-NEXT: addiw a1, a1, 16 135; RV64I-NEXT: add sp, sp, a1 136; RV64I-NEXT: ret 137; 138; RV32I-LABEL: f3: 139; RV32I: # %bb.0: # %entry 140; RV32I-NEXT: lui a0, 8 141; RV32I-NEXT: sub sp, sp, a0 142; RV32I-NEXT: sw zero, 0(sp) 143; RV32I-NEXT: lui a0, 8 144; RV32I-NEXT: sub sp, sp, a0 145; RV32I-NEXT: sw zero, 0(sp) 146; RV32I-NEXT: addi sp, sp, -16 147; RV32I-NEXT: li a0, 3 148; RV32I-NEXT: sb a0, 16(sp) 149; RV32I-NEXT: lbu a0, 16(sp) 150; RV32I-NEXT: lui a1, 16 151; RV32I-NEXT: addi a1, a1, 16 152; RV32I-NEXT: add sp, sp, a1 153; RV32I-NEXT: ret 154entry: 155 %a = alloca i8, i64 65536 156 %b = getelementptr inbounds i8, ptr %a, i64 63 157 store volatile i8 3, ptr %a 158 %c = load volatile i8, ptr %a 159 ret i8 %c 160} 161 162; Same as f2, but without protection. 163define i8 @f4() nounwind { 164; RV64I-LABEL: f4: 165; RV64I: # %bb.0: # %entry 166; RV64I-NEXT: lui a0, 16 167; RV64I-NEXT: addiw a0, a0, 16 168; RV64I-NEXT: sub sp, sp, a0 169; RV64I-NEXT: li a0, 3 170; RV64I-NEXT: sb a0, 16(sp) 171; RV64I-NEXT: lbu a0, 16(sp) 172; RV64I-NEXT: lui a1, 16 173; RV64I-NEXT: addiw a1, a1, 16 174; RV64I-NEXT: add sp, sp, a1 175; RV64I-NEXT: ret 176; 177; RV32I-LABEL: f4: 178; RV32I: # %bb.0: # %entry 179; RV32I-NEXT: lui a0, 16 180; RV32I-NEXT: addi a0, a0, 16 181; RV32I-NEXT: sub sp, sp, a0 182; RV32I-NEXT: li a0, 3 183; RV32I-NEXT: sb a0, 16(sp) 184; RV32I-NEXT: lbu a0, 16(sp) 185; RV32I-NEXT: lui a1, 16 186; RV32I-NEXT: addi a1, a1, 16 187; RV32I-NEXT: add sp, sp, a1 188; RV32I-NEXT: ret 189entry: 190 %a = alloca i8, i64 65536 191 %b = getelementptr inbounds i8, ptr %a, i64 63 192 store volatile i8 3, ptr %a 193 %c = load volatile i8, ptr %a 194 ret i8 %c 195} 196 197define i8 @f5() #0 "stack-probe-size"="65536" nounwind { 198; RV64I-LABEL: f5: 199; RV64I: # %bb.0: # %entry 200; RV64I-NEXT: lui a0, 256 201; RV64I-NEXT: sub t1, sp, a0 202; RV64I-NEXT: lui t2, 16 203; RV64I-NEXT: .LBB5_1: # %entry 204; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 205; RV64I-NEXT: sub sp, sp, t2 206; RV64I-NEXT: sd zero, 0(sp) 207; RV64I-NEXT: bne sp, t1, .LBB5_1 208; RV64I-NEXT: # %bb.2: # %entry 209; RV64I-NEXT: addi sp, sp, -16 210; RV64I-NEXT: li a0, 3 211; RV64I-NEXT: sb a0, 16(sp) 212; RV64I-NEXT: lbu a0, 16(sp) 213; RV64I-NEXT: lui a1, 256 214; RV64I-NEXT: addiw a1, a1, 16 215; RV64I-NEXT: add sp, sp, a1 216; RV64I-NEXT: ret 217; 218; RV32I-LABEL: f5: 219; RV32I: # %bb.0: # %entry 220; RV32I-NEXT: lui a0, 256 221; RV32I-NEXT: sub t1, sp, a0 222; RV32I-NEXT: lui t2, 16 223; RV32I-NEXT: .LBB5_1: # %entry 224; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 225; RV32I-NEXT: sub sp, sp, t2 226; RV32I-NEXT: sw zero, 0(sp) 227; RV32I-NEXT: bne sp, t1, .LBB5_1 228; RV32I-NEXT: # %bb.2: # %entry 229; RV32I-NEXT: addi sp, sp, -16 230; RV32I-NEXT: li a0, 3 231; RV32I-NEXT: sb a0, 16(sp) 232; RV32I-NEXT: lbu a0, 16(sp) 233; RV32I-NEXT: lui a1, 256 234; RV32I-NEXT: addi a1, a1, 16 235; RV32I-NEXT: add sp, sp, a1 236; RV32I-NEXT: ret 237entry: 238 %a = alloca i8, i64 1048576 239 %b = getelementptr inbounds i8, ptr %a, i64 63 240 store volatile i8 3, ptr %a 241 %c = load volatile i8, ptr %a 242 ret i8 %c 243} 244 245define i8 @f6() #0 nounwind { 246; RV64I-LABEL: f6: 247; RV64I: # %bb.0: # %entry 248; RV64I-NEXT: lui a0, 262144 249; RV64I-NEXT: sub t1, sp, a0 250; RV64I-NEXT: lui t2, 1 251; RV64I-NEXT: .LBB6_1: # %entry 252; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 253; RV64I-NEXT: sub sp, sp, t2 254; RV64I-NEXT: sd zero, 0(sp) 255; RV64I-NEXT: bne sp, t1, .LBB6_1 256; RV64I-NEXT: # %bb.2: # %entry 257; RV64I-NEXT: addi sp, sp, -16 258; RV64I-NEXT: li a0, 3 259; RV64I-NEXT: sb a0, 16(sp) 260; RV64I-NEXT: lbu a0, 16(sp) 261; RV64I-NEXT: lui a1, 262144 262; RV64I-NEXT: addiw a1, a1, 16 263; RV64I-NEXT: add sp, sp, a1 264; RV64I-NEXT: ret 265; 266; RV32I-LABEL: f6: 267; RV32I: # %bb.0: # %entry 268; RV32I-NEXT: lui a0, 262144 269; RV32I-NEXT: sub t1, sp, a0 270; RV32I-NEXT: lui t2, 1 271; RV32I-NEXT: .LBB6_1: # %entry 272; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 273; RV32I-NEXT: sub sp, sp, t2 274; RV32I-NEXT: sw zero, 0(sp) 275; RV32I-NEXT: bne sp, t1, .LBB6_1 276; RV32I-NEXT: # %bb.2: # %entry 277; RV32I-NEXT: addi sp, sp, -16 278; RV32I-NEXT: li a0, 3 279; RV32I-NEXT: sb a0, 16(sp) 280; RV32I-NEXT: lbu a0, 16(sp) 281; RV32I-NEXT: lui a1, 262144 282; RV32I-NEXT: addi a1, a1, 16 283; RV32I-NEXT: add sp, sp, a1 284; RV32I-NEXT: ret 285entry: 286 %a = alloca i8, i64 1073741824 287 %b = getelementptr inbounds i8, ptr %a, i64 63 288 store volatile i8 3, ptr %a 289 %c = load volatile i8, ptr %a 290 ret i8 %c 291} 292 293define i8 @f7() #0 "stack-probe-size"="65536" nounwind { 294; RV64I-LABEL: f7: 295; RV64I: # %bb.0: # %entry 296; RV64I-NEXT: lui a0, 244128 297; RV64I-NEXT: sub t1, sp, a0 298; RV64I-NEXT: lui t2, 16 299; RV64I-NEXT: .LBB7_1: # %entry 300; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 301; RV64I-NEXT: sub sp, sp, t2 302; RV64I-NEXT: sd zero, 0(sp) 303; RV64I-NEXT: bne sp, t1, .LBB7_1 304; RV64I-NEXT: # %bb.2: # %entry 305; RV64I-NEXT: lui a0, 13 306; RV64I-NEXT: addiw a0, a0, -1520 307; RV64I-NEXT: sub sp, sp, a0 308; RV64I-NEXT: li a0, 3 309; RV64I-NEXT: sb a0, 9(sp) 310; RV64I-NEXT: lbu a0, 9(sp) 311; RV64I-NEXT: lui a1, 244141 312; RV64I-NEXT: addiw a1, a1, -1520 313; RV64I-NEXT: add sp, sp, a1 314; RV64I-NEXT: ret 315; 316; RV32I-LABEL: f7: 317; RV32I: # %bb.0: # %entry 318; RV32I-NEXT: lui a0, 244128 319; RV32I-NEXT: sub t1, sp, a0 320; RV32I-NEXT: lui t2, 16 321; RV32I-NEXT: .LBB7_1: # %entry 322; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 323; RV32I-NEXT: sub sp, sp, t2 324; RV32I-NEXT: sw zero, 0(sp) 325; RV32I-NEXT: bne sp, t1, .LBB7_1 326; RV32I-NEXT: # %bb.2: # %entry 327; RV32I-NEXT: lui a0, 13 328; RV32I-NEXT: addi a0, a0, -1520 329; RV32I-NEXT: sub sp, sp, a0 330; RV32I-NEXT: li a0, 3 331; RV32I-NEXT: sb a0, 9(sp) 332; RV32I-NEXT: lbu a0, 9(sp) 333; RV32I-NEXT: lui a1, 244141 334; RV32I-NEXT: addi a1, a1, -1520 335; RV32I-NEXT: add sp, sp, a1 336; RV32I-NEXT: ret 337entry: 338 %a = alloca i8, i64 1000000007 339 %b = getelementptr inbounds i8, ptr %a, i64 101 340 store volatile i8 3, ptr %a 341 %c = load volatile i8, ptr %a 342 ret i8 %c 343} 344 345attributes #0 = { "probe-stack"="inline-asm" } 346