265 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv64 -mattr=+v,+d -mattr=+d -O0 < %s \3; RUN: | FileCheck --check-prefix=SPILL-O0 %s4; RUN: llc -mtriple=riscv64 -mattr=+v,+d -mattr=+d -O2 < %s \5; RUN: | FileCheck --check-prefix=SPILL-O2 %s6; RUN: llc -mtriple=riscv64 -mattr=+v,+d -mattr=+d -riscv-v-vector-bits-max=128 -O2 < %s \7; RUN: | FileCheck --check-prefix=SPILL-O2-VLEN128 %s8; RUN: llc -mtriple=riscv64 -mattr=+v,+d,+zcmp -O2 < %s \9; RUN: | FileCheck --check-prefix=SPILL-O2-ZCMP %s10; RUN: llc -mtriple=riscv64 -mattr=+v,+d,+prefer-vsetvli-over-read-vlenb -O0 < %s \11; RUN: | FileCheck --check-prefix=SPILL-O0-VSETVLI %s12; RUN: llc -mtriple=riscv64 -mattr=+v,+d,+prefer-vsetvli-over-read-vlenb -O2 < %s \13; RUN: | FileCheck --check-prefix=SPILL-O2-VSETVLI %s14; RUN: llc -mtriple=riscv64 -mattr=+v,+d,+zcmp,+prefer-vsetvli-over-read-vlenb -O2 < %s \15; RUN: | FileCheck --check-prefix=SPILL-O2-ZCMP-VSETVLI %s16 17@.str = private unnamed_addr constant [6 x i8] c"hello\00", align 118 19define <vscale x 1 x double> @foo(<vscale x 1 x double> %a, <vscale x 1 x double> %b, <vscale x 1 x double> %c, i64 %gvl) nounwind20; SPILL-O0-LABEL: foo:21; SPILL-O0: # %bb.0:22; SPILL-O0-NEXT: addi sp, sp, -4823; SPILL-O0-NEXT: sd ra, 40(sp) # 8-byte Folded Spill24; SPILL-O0-NEXT: csrr a1, vlenb25; SPILL-O0-NEXT: slli a1, a1, 126; SPILL-O0-NEXT: sub sp, sp, a127; SPILL-O0-NEXT: sd a0, 16(sp) # 8-byte Folded Spill28; SPILL-O0-NEXT: vsetivli zero, 1, e8, m1, ta, ma29; SPILL-O0-NEXT: vmv1r.v v10, v930; SPILL-O0-NEXT: vmv1r.v v9, v831; SPILL-O0-NEXT: csrr a1, vlenb32; SPILL-O0-NEXT: add a1, sp, a133; SPILL-O0-NEXT: addi a1, a1, 3234; SPILL-O0-NEXT: vs1r.v v9, (a1) # vscale x 8-byte Folded Spill35; SPILL-O0-NEXT: # implicit-def: $v836; SPILL-O0-NEXT: vsetvli zero, a0, e64, m1, tu, ma37; SPILL-O0-NEXT: vfadd.vv v8, v9, v1038; SPILL-O0-NEXT: addi a0, sp, 3239; SPILL-O0-NEXT: vs1r.v v8, (a0) # vscale x 8-byte Folded Spill40; SPILL-O0-NEXT: lui a0, %hi(.L.str)41; SPILL-O0-NEXT: addi a0, a0, %lo(.L.str)42; SPILL-O0-NEXT: call puts43; SPILL-O0-NEXT: addi a1, sp, 3244; SPILL-O0-NEXT: vl1r.v v10, (a1) # vscale x 8-byte Folded Reload45; SPILL-O0-NEXT: csrr a1, vlenb46; SPILL-O0-NEXT: add a1, sp, a147; SPILL-O0-NEXT: addi a1, a1, 3248; SPILL-O0-NEXT: vl1r.v v9, (a1) # vscale x 8-byte Folded Reload49; SPILL-O0-NEXT: # kill: def $x11 killed $x1050; SPILL-O0-NEXT: ld a0, 16(sp) # 8-byte Folded Reload51; SPILL-O0-NEXT: # implicit-def: $v852; SPILL-O0-NEXT: vsetvli zero, a0, e64, m1, tu, ma53; SPILL-O0-NEXT: vfadd.vv v8, v9, v1054; SPILL-O0-NEXT: csrr a0, vlenb55; SPILL-O0-NEXT: slli a0, a0, 156; SPILL-O0-NEXT: add sp, sp, a057; SPILL-O0-NEXT: ld ra, 40(sp) # 8-byte Folded Reload58; SPILL-O0-NEXT: addi sp, sp, 4859; SPILL-O0-NEXT: ret60;61; SPILL-O2-LABEL: foo:62; SPILL-O2: # %bb.0:63; SPILL-O2-NEXT: addi sp, sp, -3264; SPILL-O2-NEXT: sd ra, 24(sp) # 8-byte Folded Spill65; SPILL-O2-NEXT: sd s0, 16(sp) # 8-byte Folded Spill66; SPILL-O2-NEXT: csrr a1, vlenb67; SPILL-O2-NEXT: slli a1, a1, 168; SPILL-O2-NEXT: sub sp, sp, a169; SPILL-O2-NEXT: mv s0, a070; SPILL-O2-NEXT: addi a1, sp, 1671; SPILL-O2-NEXT: vs1r.v v8, (a1) # vscale x 8-byte Folded Spill72; SPILL-O2-NEXT: vsetvli zero, a0, e64, m1, ta, ma73; SPILL-O2-NEXT: vfadd.vv v9, v8, v974; SPILL-O2-NEXT: csrr a0, vlenb75; SPILL-O2-NEXT: add a0, sp, a076; SPILL-O2-NEXT: addi a0, a0, 1677; SPILL-O2-NEXT: vs1r.v v9, (a0) # vscale x 8-byte Folded Spill78; SPILL-O2-NEXT: lui a0, %hi(.L.str)79; SPILL-O2-NEXT: addi a0, a0, %lo(.L.str)80; SPILL-O2-NEXT: call puts81; SPILL-O2-NEXT: csrr a0, vlenb82; SPILL-O2-NEXT: add a0, sp, a083; SPILL-O2-NEXT: addi a0, a0, 1684; SPILL-O2-NEXT: vl1r.v v8, (a0) # vscale x 8-byte Folded Reload85; SPILL-O2-NEXT: addi a0, sp, 1686; SPILL-O2-NEXT: vl1r.v v9, (a0) # vscale x 8-byte Folded Reload87; SPILL-O2-NEXT: vsetvli zero, s0, e64, m1, ta, ma88; SPILL-O2-NEXT: vfadd.vv v8, v9, v889; SPILL-O2-NEXT: csrr a0, vlenb90; SPILL-O2-NEXT: slli a0, a0, 191; SPILL-O2-NEXT: add sp, sp, a092; SPILL-O2-NEXT: ld ra, 24(sp) # 8-byte Folded Reload93; SPILL-O2-NEXT: ld s0, 16(sp) # 8-byte Folded Reload94; SPILL-O2-NEXT: addi sp, sp, 3295; SPILL-O2-NEXT: ret96;97; SPILL-O2-VLEN128-LABEL: foo:98; SPILL-O2-VLEN128: # %bb.0:99; SPILL-O2-VLEN128-NEXT: addi sp, sp, -32100; SPILL-O2-VLEN128-NEXT: sd ra, 24(sp) # 8-byte Folded Spill101; SPILL-O2-VLEN128-NEXT: sd s0, 16(sp) # 8-byte Folded Spill102; SPILL-O2-VLEN128-NEXT: addi sp, sp, -32103; SPILL-O2-VLEN128-NEXT: mv s0, a0104; SPILL-O2-VLEN128-NEXT: addi a1, sp, 16105; SPILL-O2-VLEN128-NEXT: vs1r.v v8, (a1) # vscale x 8-byte Folded Spill106; SPILL-O2-VLEN128-NEXT: vsetvli zero, a0, e64, m1, ta, ma107; SPILL-O2-VLEN128-NEXT: vfadd.vv v9, v8, v9108; SPILL-O2-VLEN128-NEXT: addi a0, sp, 32109; SPILL-O2-VLEN128-NEXT: vs1r.v v9, (a0) # vscale x 8-byte Folded Spill110; SPILL-O2-VLEN128-NEXT: lui a0, %hi(.L.str)111; SPILL-O2-VLEN128-NEXT: addi a0, a0, %lo(.L.str)112; SPILL-O2-VLEN128-NEXT: call puts113; SPILL-O2-VLEN128-NEXT: addi a0, sp, 32114; SPILL-O2-VLEN128-NEXT: vl1r.v v8, (a0) # vscale x 8-byte Folded Reload115; SPILL-O2-VLEN128-NEXT: addi a0, sp, 16116; SPILL-O2-VLEN128-NEXT: vl1r.v v9, (a0) # vscale x 8-byte Folded Reload117; SPILL-O2-VLEN128-NEXT: vsetvli zero, s0, e64, m1, ta, ma118; SPILL-O2-VLEN128-NEXT: vfadd.vv v8, v9, v8119; SPILL-O2-VLEN128-NEXT: addi sp, sp, 32120; SPILL-O2-VLEN128-NEXT: ld ra, 24(sp) # 8-byte Folded Reload121; SPILL-O2-VLEN128-NEXT: ld s0, 16(sp) # 8-byte Folded Reload122; SPILL-O2-VLEN128-NEXT: addi sp, sp, 32123; SPILL-O2-VLEN128-NEXT: ret124;125; SPILL-O2-ZCMP-LABEL: foo:126; SPILL-O2-ZCMP: # %bb.0:127; SPILL-O2-ZCMP-NEXT: cm.push {ra, s0}, -32128; SPILL-O2-ZCMP-NEXT: csrr a1, vlenb129; SPILL-O2-ZCMP-NEXT: slli a1, a1, 1130; SPILL-O2-ZCMP-NEXT: sub sp, sp, a1131; SPILL-O2-ZCMP-NEXT: mv s0, a0132; SPILL-O2-ZCMP-NEXT: addi a1, sp, 16133; SPILL-O2-ZCMP-NEXT: vs1r.v v8, (a1) # vscale x 8-byte Folded Spill134; SPILL-O2-ZCMP-NEXT: vsetvli zero, a0, e64, m1, ta, ma135; SPILL-O2-ZCMP-NEXT: vfadd.vv v9, v8, v9136; SPILL-O2-ZCMP-NEXT: csrr a0, vlenb137; SPILL-O2-ZCMP-NEXT: add a0, a0, sp138; SPILL-O2-ZCMP-NEXT: addi a0, a0, 16139; SPILL-O2-ZCMP-NEXT: vs1r.v v9, (a0) # vscale x 8-byte Folded Spill140; SPILL-O2-ZCMP-NEXT: lui a0, %hi(.L.str)141; SPILL-O2-ZCMP-NEXT: addi a0, a0, %lo(.L.str)142; SPILL-O2-ZCMP-NEXT: call puts143; SPILL-O2-ZCMP-NEXT: csrr a0, vlenb144; SPILL-O2-ZCMP-NEXT: add a0, a0, sp145; SPILL-O2-ZCMP-NEXT: addi a0, a0, 16146; SPILL-O2-ZCMP-NEXT: vl1r.v v8, (a0) # vscale x 8-byte Folded Reload147; SPILL-O2-ZCMP-NEXT: addi a0, sp, 16148; SPILL-O2-ZCMP-NEXT: vl1r.v v9, (a0) # vscale x 8-byte Folded Reload149; SPILL-O2-ZCMP-NEXT: vsetvli zero, s0, e64, m1, ta, ma150; SPILL-O2-ZCMP-NEXT: vfadd.vv v8, v9, v8151; SPILL-O2-ZCMP-NEXT: csrr a0, vlenb152; SPILL-O2-ZCMP-NEXT: slli a0, a0, 1153; SPILL-O2-ZCMP-NEXT: add sp, sp, a0154; SPILL-O2-ZCMP-NEXT: cm.popret {ra, s0}, 32155;156; SPILL-O0-VSETVLI-LABEL: foo:157; SPILL-O0-VSETVLI: # %bb.0:158; SPILL-O0-VSETVLI-NEXT: addi sp, sp, -48159; SPILL-O0-VSETVLI-NEXT: sd ra, 40(sp) # 8-byte Folded Spill160; SPILL-O0-VSETVLI-NEXT: vsetvli a1, zero, e8, m2, ta, ma161; SPILL-O0-VSETVLI-NEXT: sub sp, sp, a1162; SPILL-O0-VSETVLI-NEXT: sd a0, 16(sp) # 8-byte Folded Spill163; SPILL-O0-VSETVLI-NEXT: vsetivli zero, 1, e8, m1, ta, ma164; SPILL-O0-VSETVLI-NEXT: vmv1r.v v10, v9165; SPILL-O0-VSETVLI-NEXT: vmv1r.v v9, v8166; SPILL-O0-VSETVLI-NEXT: csrr a1, vlenb167; SPILL-O0-VSETVLI-NEXT: add a1, sp, a1168; SPILL-O0-VSETVLI-NEXT: addi a1, a1, 32169; SPILL-O0-VSETVLI-NEXT: vs1r.v v9, (a1) # vscale x 8-byte Folded Spill170; SPILL-O0-VSETVLI-NEXT: # implicit-def: $v8171; SPILL-O0-VSETVLI-NEXT: vsetvli zero, a0, e64, m1, tu, ma172; SPILL-O0-VSETVLI-NEXT: vfadd.vv v8, v9, v10173; SPILL-O0-VSETVLI-NEXT: addi a0, sp, 32174; SPILL-O0-VSETVLI-NEXT: vs1r.v v8, (a0) # vscale x 8-byte Folded Spill175; SPILL-O0-VSETVLI-NEXT: lui a0, %hi(.L.str)176; SPILL-O0-VSETVLI-NEXT: addi a0, a0, %lo(.L.str)177; SPILL-O0-VSETVLI-NEXT: call puts178; SPILL-O0-VSETVLI-NEXT: addi a1, sp, 32179; SPILL-O0-VSETVLI-NEXT: vl1r.v v10, (a1) # vscale x 8-byte Folded Reload180; SPILL-O0-VSETVLI-NEXT: csrr a1, vlenb181; SPILL-O0-VSETVLI-NEXT: add a1, sp, a1182; SPILL-O0-VSETVLI-NEXT: addi a1, a1, 32183; SPILL-O0-VSETVLI-NEXT: vl1r.v v9, (a1) # vscale x 8-byte Folded Reload184; SPILL-O0-VSETVLI-NEXT: # kill: def $x11 killed $x10185; SPILL-O0-VSETVLI-NEXT: ld a0, 16(sp) # 8-byte Folded Reload186; SPILL-O0-VSETVLI-NEXT: # implicit-def: $v8187; SPILL-O0-VSETVLI-NEXT: vsetvli zero, a0, e64, m1, tu, ma188; SPILL-O0-VSETVLI-NEXT: vfadd.vv v8, v9, v10189; SPILL-O0-VSETVLI-NEXT: vsetvli a0, zero, e8, m2, ta, ma190; SPILL-O0-VSETVLI-NEXT: add sp, sp, a0191; SPILL-O0-VSETVLI-NEXT: ld ra, 40(sp) # 8-byte Folded Reload192; SPILL-O0-VSETVLI-NEXT: addi sp, sp, 48193; SPILL-O0-VSETVLI-NEXT: ret194;195; SPILL-O2-VSETVLI-LABEL: foo:196; SPILL-O2-VSETVLI: # %bb.0:197; SPILL-O2-VSETVLI-NEXT: addi sp, sp, -32198; SPILL-O2-VSETVLI-NEXT: sd ra, 24(sp) # 8-byte Folded Spill199; SPILL-O2-VSETVLI-NEXT: sd s0, 16(sp) # 8-byte Folded Spill200; SPILL-O2-VSETVLI-NEXT: vsetvli a1, zero, e8, m2, ta, ma201; SPILL-O2-VSETVLI-NEXT: sub sp, sp, a1202; SPILL-O2-VSETVLI-NEXT: mv s0, a0203; SPILL-O2-VSETVLI-NEXT: addi a1, sp, 16204; SPILL-O2-VSETVLI-NEXT: vs1r.v v8, (a1) # vscale x 8-byte Folded Spill205; SPILL-O2-VSETVLI-NEXT: vsetvli zero, a0, e64, m1, ta, ma206; SPILL-O2-VSETVLI-NEXT: vfadd.vv v9, v8, v9207; SPILL-O2-VSETVLI-NEXT: csrr a0, vlenb208; SPILL-O2-VSETVLI-NEXT: add a0, sp, a0209; SPILL-O2-VSETVLI-NEXT: addi a0, a0, 16210; SPILL-O2-VSETVLI-NEXT: vs1r.v v9, (a0) # vscale x 8-byte Folded Spill211; SPILL-O2-VSETVLI-NEXT: lui a0, %hi(.L.str)212; SPILL-O2-VSETVLI-NEXT: addi a0, a0, %lo(.L.str)213; SPILL-O2-VSETVLI-NEXT: call puts214; SPILL-O2-VSETVLI-NEXT: csrr a0, vlenb215; SPILL-O2-VSETVLI-NEXT: add a0, sp, a0216; SPILL-O2-VSETVLI-NEXT: addi a0, a0, 16217; SPILL-O2-VSETVLI-NEXT: vl1r.v v8, (a0) # vscale x 8-byte Folded Reload218; SPILL-O2-VSETVLI-NEXT: addi a0, sp, 16219; SPILL-O2-VSETVLI-NEXT: vl1r.v v9, (a0) # vscale x 8-byte Folded Reload220; SPILL-O2-VSETVLI-NEXT: vsetvli zero, s0, e64, m1, ta, ma221; SPILL-O2-VSETVLI-NEXT: vfadd.vv v8, v9, v8222; SPILL-O2-VSETVLI-NEXT: vsetvli a0, zero, e8, m2, ta, ma223; SPILL-O2-VSETVLI-NEXT: add sp, sp, a0224; SPILL-O2-VSETVLI-NEXT: ld ra, 24(sp) # 8-byte Folded Reload225; SPILL-O2-VSETVLI-NEXT: ld s0, 16(sp) # 8-byte Folded Reload226; SPILL-O2-VSETVLI-NEXT: addi sp, sp, 32227; SPILL-O2-VSETVLI-NEXT: ret228;229; SPILL-O2-ZCMP-VSETVLI-LABEL: foo:230; SPILL-O2-ZCMP-VSETVLI: # %bb.0:231; SPILL-O2-ZCMP-VSETVLI-NEXT: cm.push {ra, s0}, -32232; SPILL-O2-ZCMP-VSETVLI-NEXT: vsetvli a1, zero, e8, m2, ta, ma233; SPILL-O2-ZCMP-VSETVLI-NEXT: sub sp, sp, a1234; SPILL-O2-ZCMP-VSETVLI-NEXT: mv s0, a0235; SPILL-O2-ZCMP-VSETVLI-NEXT: addi a1, sp, 16236; SPILL-O2-ZCMP-VSETVLI-NEXT: vs1r.v v8, (a1) # vscale x 8-byte Folded Spill237; SPILL-O2-ZCMP-VSETVLI-NEXT: vsetvli zero, a0, e64, m1, ta, ma238; SPILL-O2-ZCMP-VSETVLI-NEXT: vfadd.vv v9, v8, v9239; SPILL-O2-ZCMP-VSETVLI-NEXT: csrr a0, vlenb240; SPILL-O2-ZCMP-VSETVLI-NEXT: add a0, a0, sp241; SPILL-O2-ZCMP-VSETVLI-NEXT: addi a0, a0, 16242; SPILL-O2-ZCMP-VSETVLI-NEXT: vs1r.v v9, (a0) # vscale x 8-byte Folded Spill243; SPILL-O2-ZCMP-VSETVLI-NEXT: lui a0, %hi(.L.str)244; SPILL-O2-ZCMP-VSETVLI-NEXT: addi a0, a0, %lo(.L.str)245; SPILL-O2-ZCMP-VSETVLI-NEXT: call puts246; SPILL-O2-ZCMP-VSETVLI-NEXT: csrr a0, vlenb247; SPILL-O2-ZCMP-VSETVLI-NEXT: add a0, a0, sp248; SPILL-O2-ZCMP-VSETVLI-NEXT: addi a0, a0, 16249; SPILL-O2-ZCMP-VSETVLI-NEXT: vl1r.v v8, (a0) # vscale x 8-byte Folded Reload250; SPILL-O2-ZCMP-VSETVLI-NEXT: addi a0, sp, 16251; SPILL-O2-ZCMP-VSETVLI-NEXT: vl1r.v v9, (a0) # vscale x 8-byte Folded Reload252; SPILL-O2-ZCMP-VSETVLI-NEXT: vsetvli zero, s0, e64, m1, ta, ma253; SPILL-O2-ZCMP-VSETVLI-NEXT: vfadd.vv v8, v9, v8254; SPILL-O2-ZCMP-VSETVLI-NEXT: vsetvli a0, zero, e8, m2, ta, ma255; SPILL-O2-ZCMP-VSETVLI-NEXT: add sp, sp, a0256; SPILL-O2-ZCMP-VSETVLI-NEXT: cm.popret {ra, s0}, 32257{258 %x = call <vscale x 1 x double> @llvm.riscv.vfadd.nxv1f64.nxv1f64(<vscale x 1 x double> poison, <vscale x 1 x double> %a, <vscale x 1 x double> %b, i64 7, i64 %gvl)259 %call = call signext i32 @puts(ptr @.str)260 %z = call <vscale x 1 x double> @llvm.riscv.vfadd.nxv1f64.nxv1f64(<vscale x 1 x double> poison, <vscale x 1 x double> %a, <vscale x 1 x double> %x, i64 7, i64 %gvl)261 ret <vscale x 1 x double> %z262}263 264declare i32 @puts(ptr);265