266 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 -mattr=-32s,+d --verify-machineinstrs < %s \3; RUN: | FileCheck %s --check-prefix=LA32R4; RUN: llc --mtriple=loongarch32 -mattr=+32s,+d --verify-machineinstrs < %s \5; RUN: | FileCheck %s --check-prefix=LA32S6; RUN: llc --mtriple=loongarch64 -mattr=+d --verify-machineinstrs < %s \7; RUN: | FileCheck %s --check-prefix=LA648 9declare void @notdead(ptr)10 11;; These tests must ensure the stack pointer is restored using the frame12;; pointer13 14define void @simple_alloca(i32 %n) nounwind {15; LA32R-LABEL: simple_alloca:16; LA32R: # %bb.0:17; LA32R-NEXT: addi.w $sp, $sp, -1618; LA32R-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill19; LA32R-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill20; LA32R-NEXT: addi.w $fp, $sp, 1621; LA32R-NEXT: addi.w $a0, $a0, 1522; LA32R-NEXT: addi.w $a1, $zero, -1623; LA32R-NEXT: and $a0, $a0, $a124; LA32R-NEXT: sub.w $a0, $sp, $a025; LA32R-NEXT: move $sp, $a026; LA32R-NEXT: bl notdead27; LA32R-NEXT: addi.w $sp, $fp, -1628; LA32R-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload29; LA32R-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload30; LA32R-NEXT: addi.w $sp, $sp, 1631; LA32R-NEXT: ret32;33; LA32S-LABEL: simple_alloca:34; LA32S: # %bb.0:35; LA32S-NEXT: addi.w $sp, $sp, -1636; LA32S-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill37; LA32S-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill38; LA32S-NEXT: addi.w $fp, $sp, 1639; LA32S-NEXT: addi.w $a0, $a0, 1540; LA32S-NEXT: bstrins.w $a0, $zero, 3, 041; LA32S-NEXT: sub.w $a0, $sp, $a042; LA32S-NEXT: move $sp, $a043; LA32S-NEXT: bl notdead44; LA32S-NEXT: addi.w $sp, $fp, -1645; LA32S-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload46; LA32S-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload47; LA32S-NEXT: addi.w $sp, $sp, 1648; LA32S-NEXT: ret49;50; LA64-LABEL: simple_alloca:51; LA64: # %bb.0:52; LA64-NEXT: addi.d $sp, $sp, -1653; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill54; LA64-NEXT: st.d $fp, $sp, 0 # 8-byte Folded Spill55; LA64-NEXT: addi.d $fp, $sp, 1656; LA64-NEXT: bstrpick.d $a0, $a0, 31, 057; LA64-NEXT: addi.d $a0, $a0, 1558; LA64-NEXT: bstrpick.d $a0, $a0, 32, 459; LA64-NEXT: slli.d $a0, $a0, 460; LA64-NEXT: sub.d $a0, $sp, $a061; LA64-NEXT: move $sp, $a062; LA64-NEXT: pcaddu18i $ra, %call36(notdead)63; LA64-NEXT: jirl $ra, $ra, 064; LA64-NEXT: addi.d $sp, $fp, -1665; LA64-NEXT: ld.d $fp, $sp, 0 # 8-byte Folded Reload66; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload67; LA64-NEXT: addi.d $sp, $sp, 1668; LA64-NEXT: ret69 %1 = alloca i8, i32 %n70 call void @notdead(ptr %1)71 ret void72}73 74declare ptr @llvm.stacksave()75declare void @llvm.stackrestore(ptr)76 77define void @scoped_alloca(i32 %n) nounwind {78; LA32R-LABEL: scoped_alloca:79; LA32R: # %bb.0:80; LA32R-NEXT: addi.w $sp, $sp, -1681; LA32R-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill82; LA32R-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill83; LA32R-NEXT: st.w $s0, $sp, 4 # 4-byte Folded Spill84; LA32R-NEXT: addi.w $fp, $sp, 1685; LA32R-NEXT: move $s0, $sp86; LA32R-NEXT: addi.w $a0, $a0, 1587; LA32R-NEXT: addi.w $a1, $zero, -1688; LA32R-NEXT: and $a0, $a0, $a189; LA32R-NEXT: sub.w $a0, $sp, $a090; LA32R-NEXT: move $sp, $a091; LA32R-NEXT: bl notdead92; LA32R-NEXT: move $sp, $s093; LA32R-NEXT: addi.w $sp, $fp, -1694; LA32R-NEXT: ld.w $s0, $sp, 4 # 4-byte Folded Reload95; LA32R-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload96; LA32R-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload97; LA32R-NEXT: addi.w $sp, $sp, 1698; LA32R-NEXT: ret99;100; LA32S-LABEL: scoped_alloca:101; LA32S: # %bb.0:102; LA32S-NEXT: addi.w $sp, $sp, -16103; LA32S-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill104; LA32S-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill105; LA32S-NEXT: st.w $s0, $sp, 4 # 4-byte Folded Spill106; LA32S-NEXT: addi.w $fp, $sp, 16107; LA32S-NEXT: move $s0, $sp108; LA32S-NEXT: addi.w $a0, $a0, 15109; LA32S-NEXT: bstrins.w $a0, $zero, 3, 0110; LA32S-NEXT: sub.w $a0, $sp, $a0111; LA32S-NEXT: move $sp, $a0112; LA32S-NEXT: bl notdead113; LA32S-NEXT: move $sp, $s0114; LA32S-NEXT: addi.w $sp, $fp, -16115; LA32S-NEXT: ld.w $s0, $sp, 4 # 4-byte Folded Reload116; LA32S-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload117; LA32S-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload118; LA32S-NEXT: addi.w $sp, $sp, 16119; LA32S-NEXT: ret120;121; LA64-LABEL: scoped_alloca:122; LA64: # %bb.0:123; LA64-NEXT: addi.d $sp, $sp, -32124; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill125; LA64-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill126; LA64-NEXT: st.d $s0, $sp, 8 # 8-byte Folded Spill127; LA64-NEXT: addi.d $fp, $sp, 32128; LA64-NEXT: move $s0, $sp129; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0130; LA64-NEXT: addi.d $a0, $a0, 15131; LA64-NEXT: bstrpick.d $a0, $a0, 32, 4132; LA64-NEXT: slli.d $a0, $a0, 4133; LA64-NEXT: sub.d $a0, $sp, $a0134; LA64-NEXT: move $sp, $a0135; LA64-NEXT: pcaddu18i $ra, %call36(notdead)136; LA64-NEXT: jirl $ra, $ra, 0137; LA64-NEXT: move $sp, $s0138; LA64-NEXT: addi.d $sp, $fp, -32139; LA64-NEXT: ld.d $s0, $sp, 8 # 8-byte Folded Reload140; LA64-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload141; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload142; LA64-NEXT: addi.d $sp, $sp, 32143; LA64-NEXT: ret144 %sp = call ptr @llvm.stacksave()145 %addr = alloca i8, i32 %n146 call void @notdead(ptr %addr)147 call void @llvm.stackrestore(ptr %sp)148 ret void149}150 151declare void @func(ptr, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32)152 153;; Check that outgoing arguments passed on the stack do not corrupt a154;; variable-sized stack object.155define void @alloca_callframe(i32 %n) nounwind {156; LA32R-LABEL: alloca_callframe:157; LA32R: # %bb.0:158; LA32R-NEXT: addi.w $sp, $sp, -16159; LA32R-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill160; LA32R-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill161; LA32R-NEXT: addi.w $fp, $sp, 16162; LA32R-NEXT: addi.w $a0, $a0, 15163; LA32R-NEXT: addi.w $a1, $zero, -16164; LA32R-NEXT: and $a0, $a0, $a1165; LA32R-NEXT: sub.w $a0, $sp, $a0166; LA32R-NEXT: move $sp, $a0167; LA32R-NEXT: addi.w $sp, $sp, -16168; LA32R-NEXT: ori $a1, $zero, 12169; LA32R-NEXT: st.w $a1, $sp, 12170; LA32R-NEXT: ori $a1, $zero, 11171; LA32R-NEXT: st.w $a1, $sp, 8172; LA32R-NEXT: ori $a1, $zero, 10173; LA32R-NEXT: st.w $a1, $sp, 4174; LA32R-NEXT: ori $t0, $zero, 9175; LA32R-NEXT: ori $a1, $zero, 2176; LA32R-NEXT: ori $a2, $zero, 3177; LA32R-NEXT: ori $a3, $zero, 4178; LA32R-NEXT: ori $a4, $zero, 5179; LA32R-NEXT: ori $a5, $zero, 6180; LA32R-NEXT: ori $a6, $zero, 7181; LA32R-NEXT: ori $a7, $zero, 8182; LA32R-NEXT: st.w $t0, $sp, 0183; LA32R-NEXT: bl func184; LA32R-NEXT: addi.w $sp, $sp, 16185; LA32R-NEXT: addi.w $sp, $fp, -16186; LA32R-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload187; LA32R-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload188; LA32R-NEXT: addi.w $sp, $sp, 16189; LA32R-NEXT: ret190;191; LA32S-LABEL: alloca_callframe:192; LA32S: # %bb.0:193; LA32S-NEXT: addi.w $sp, $sp, -16194; LA32S-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill195; LA32S-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill196; LA32S-NEXT: addi.w $fp, $sp, 16197; LA32S-NEXT: addi.w $a0, $a0, 15198; LA32S-NEXT: bstrins.w $a0, $zero, 3, 0199; LA32S-NEXT: sub.w $a0, $sp, $a0200; LA32S-NEXT: move $sp, $a0201; LA32S-NEXT: addi.w $sp, $sp, -16202; LA32S-NEXT: ori $a1, $zero, 12203; LA32S-NEXT: st.w $a1, $sp, 12204; LA32S-NEXT: ori $a1, $zero, 11205; LA32S-NEXT: st.w $a1, $sp, 8206; LA32S-NEXT: ori $a1, $zero, 10207; LA32S-NEXT: st.w $a1, $sp, 4208; LA32S-NEXT: ori $t0, $zero, 9209; LA32S-NEXT: ori $a1, $zero, 2210; LA32S-NEXT: ori $a2, $zero, 3211; LA32S-NEXT: ori $a3, $zero, 4212; LA32S-NEXT: ori $a4, $zero, 5213; LA32S-NEXT: ori $a5, $zero, 6214; LA32S-NEXT: ori $a6, $zero, 7215; LA32S-NEXT: ori $a7, $zero, 8216; LA32S-NEXT: st.w $t0, $sp, 0217; LA32S-NEXT: bl func218; LA32S-NEXT: addi.w $sp, $sp, 16219; LA32S-NEXT: addi.w $sp, $fp, -16220; LA32S-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload221; LA32S-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload222; LA32S-NEXT: addi.w $sp, $sp, 16223; LA32S-NEXT: ret224;225; LA64-LABEL: alloca_callframe:226; LA64: # %bb.0:227; LA64-NEXT: addi.d $sp, $sp, -16228; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill229; LA64-NEXT: st.d $fp, $sp, 0 # 8-byte Folded Spill230; LA64-NEXT: addi.d $fp, $sp, 16231; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0232; LA64-NEXT: addi.d $a0, $a0, 15233; LA64-NEXT: bstrpick.d $a0, $a0, 32, 4234; LA64-NEXT: slli.d $a0, $a0, 4235; LA64-NEXT: sub.d $a0, $sp, $a0236; LA64-NEXT: move $sp, $a0237; LA64-NEXT: addi.d $sp, $sp, -32238; LA64-NEXT: ori $a1, $zero, 12239; LA64-NEXT: st.d $a1, $sp, 24240; LA64-NEXT: ori $a1, $zero, 11241; LA64-NEXT: st.d $a1, $sp, 16242; LA64-NEXT: ori $a1, $zero, 10243; LA64-NEXT: st.d $a1, $sp, 8244; LA64-NEXT: ori $t0, $zero, 9245; LA64-NEXT: ori $a1, $zero, 2246; LA64-NEXT: ori $a2, $zero, 3247; LA64-NEXT: ori $a3, $zero, 4248; LA64-NEXT: ori $a4, $zero, 5249; LA64-NEXT: ori $a5, $zero, 6250; LA64-NEXT: ori $a6, $zero, 7251; LA64-NEXT: ori $a7, $zero, 8252; LA64-NEXT: st.d $t0, $sp, 0253; LA64-NEXT: pcaddu18i $ra, %call36(func)254; LA64-NEXT: jirl $ra, $ra, 0255; LA64-NEXT: addi.d $sp, $sp, 32256; LA64-NEXT: addi.d $sp, $fp, -16257; LA64-NEXT: ld.d $fp, $sp, 0 # 8-byte Folded Reload258; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload259; LA64-NEXT: addi.d $sp, $sp, 16260; LA64-NEXT: ret261 %1 = alloca i8, i32 %n262 call void @func(ptr %1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8,263 i32 9, i32 10, i32 11, i32 12)264 ret void265}266