1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch64 -mattr=+d -O0 < %s | FileCheck %s --check-prefix=NOSHRINKW 3; RUN: llc --mtriple=loongarch64 -mattr=+d -O2 < %s | FileCheck %s --check-prefix=SHRINKW 4 5declare void @abort() 6 7define void @eliminate_restore(i32 %n) nounwind { 8; NOSHRINKW-LABEL: eliminate_restore: 9; NOSHRINKW: # %bb.0: 10; NOSHRINKW-NEXT: addi.d $sp, $sp, -16 11; NOSHRINKW-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 12; NOSHRINKW-NEXT: addi.w $a1, $a0, 0 13; NOSHRINKW-NEXT: ori $a0, $zero, 32 14; NOSHRINKW-NEXT: bltu $a0, $a1, .LBB0_2 15; NOSHRINKW-NEXT: b .LBB0_1 16; NOSHRINKW-NEXT: .LBB0_1: # %if.then 17; NOSHRINKW-NEXT: bl %plt(abort) 18; NOSHRINKW-NEXT: .LBB0_2: # %if.end 19; NOSHRINKW-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 20; NOSHRINKW-NEXT: addi.d $sp, $sp, 16 21; NOSHRINKW-NEXT: ret 22; 23; SHRINKW-LABEL: eliminate_restore: 24; SHRINKW: # %bb.0: 25; SHRINKW-NEXT: addi.w $a0, $a0, 0 26; SHRINKW-NEXT: ori $a1, $zero, 32 27; SHRINKW-NEXT: bgeu $a1, $a0, .LBB0_2 28; SHRINKW-NEXT: # %bb.1: # %if.end 29; SHRINKW-NEXT: ret 30; SHRINKW-NEXT: .LBB0_2: # %if.then 31; SHRINKW-NEXT: addi.d $sp, $sp, -16 32; SHRINKW-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 33; SHRINKW-NEXT: bl %plt(abort) 34 %cmp = icmp ule i32 %n, 32 35 br i1 %cmp, label %if.then, label %if.end 36 37if.then: 38 call void @abort() 39 unreachable 40 41if.end: 42 ret void 43} 44 45declare void @notdead(ptr) 46 47define void @conditional_alloca(i32 %n) nounwind { 48; NOSHRINKW-LABEL: conditional_alloca: 49; NOSHRINKW: # %bb.0: 50; NOSHRINKW-NEXT: addi.d $sp, $sp, -32 51; NOSHRINKW-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill 52; NOSHRINKW-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill 53; NOSHRINKW-NEXT: addi.d $fp, $sp, 32 54; NOSHRINKW-NEXT: addi.w $a1, $a0, 0 55; NOSHRINKW-NEXT: st.d $a0, $fp, -24 # 8-byte Folded Spill 56; NOSHRINKW-NEXT: ori $a0, $zero, 32 57; NOSHRINKW-NEXT: bltu $a0, $a1, .LBB1_2 58; NOSHRINKW-NEXT: b .LBB1_1 59; NOSHRINKW-NEXT: .LBB1_1: # %if.then 60; NOSHRINKW-NEXT: ld.d $a0, $fp, -24 # 8-byte Folded Reload 61; NOSHRINKW-NEXT: bstrpick.d $a0, $a0, 31, 0 62; NOSHRINKW-NEXT: addi.d $a0, $a0, 15 63; NOSHRINKW-NEXT: bstrpick.d $a0, $a0, 32, 4 64; NOSHRINKW-NEXT: slli.d $a1, $a0, 4 65; NOSHRINKW-NEXT: move $a0, $sp 66; NOSHRINKW-NEXT: sub.d $a0, $a0, $a1 67; NOSHRINKW-NEXT: move $sp, $a0 68; NOSHRINKW-NEXT: bl %plt(notdead) 69; NOSHRINKW-NEXT: b .LBB1_2 70; NOSHRINKW-NEXT: .LBB1_2: # %if.end 71; NOSHRINKW-NEXT: addi.d $sp, $fp, -32 72; NOSHRINKW-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload 73; NOSHRINKW-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload 74; NOSHRINKW-NEXT: addi.d $sp, $sp, 32 75; NOSHRINKW-NEXT: ret 76; 77; SHRINKW-LABEL: conditional_alloca: 78; SHRINKW: # %bb.0: 79; SHRINKW-NEXT: addi.w $a1, $a0, 0 80; SHRINKW-NEXT: ori $a2, $zero, 32 81; SHRINKW-NEXT: bltu $a2, $a1, .LBB1_2 82; SHRINKW-NEXT: # %bb.1: # %if.then 83; SHRINKW-NEXT: addi.d $sp, $sp, -16 84; SHRINKW-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 85; SHRINKW-NEXT: st.d $fp, $sp, 0 # 8-byte Folded Spill 86; SHRINKW-NEXT: addi.d $fp, $sp, 16 87; SHRINKW-NEXT: bstrpick.d $a0, $a0, 31, 0 88; SHRINKW-NEXT: addi.d $a0, $a0, 15 89; SHRINKW-NEXT: bstrpick.d $a0, $a0, 32, 4 90; SHRINKW-NEXT: slli.d $a0, $a0, 4 91; SHRINKW-NEXT: sub.d $a0, $sp, $a0 92; SHRINKW-NEXT: move $sp, $a0 93; SHRINKW-NEXT: bl %plt(notdead) 94; SHRINKW-NEXT: addi.d $sp, $fp, -16 95; SHRINKW-NEXT: ld.d $fp, $sp, 0 # 8-byte Folded Reload 96; SHRINKW-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 97; SHRINKW-NEXT: addi.d $sp, $sp, 16 98; SHRINKW-NEXT: .LBB1_2: # %if.end 99; SHRINKW-NEXT: ret 100 %cmp = icmp ule i32 %n, 32 101 br i1 %cmp, label %if.then, label %if.end 102 103if.then: 104 %addr = alloca i8, i32 %n 105 call void @notdead(ptr %addr) 106 br label %if.end 107 108if.end: 109 ret void 110} 111