brintos

brintos / llvm-project-archived public Read only

0
0
Text · 29.4 KiB · 93f73e5 Raw
747 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 62; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx --verify-machineinstrs < %s \3; RUN:   | FileCheck --check-prefix=LA32 %s4; RUN: llc --mtriple=loongarch64 --mattr=+lasx --verify-machineinstrs < %s \5; RUN:   | FileCheck --check-prefix=LA64 %s6 7%struct.S = type { i64, i64, i8 }8%struct.F = type { float, double, float }9%struct.V = type { <4 x i32>, <4 x i32>, <16 x i16> }10 11define void @sink_fold_i64(i64 %k, i64 %n, ptr %a) nounwind {12; LA32-LABEL: sink_fold_i64:13; LA32:       # %bb.0: # %entry14; LA32-NEXT:    addi.w $sp, $sp, -4815; LA32-NEXT:    st.w $ra, $sp, 44 # 4-byte Folded Spill16; LA32-NEXT:    st.w $fp, $sp, 40 # 4-byte Folded Spill17; LA32-NEXT:    st.w $s0, $sp, 36 # 4-byte Folded Spill18; LA32-NEXT:    st.w $s1, $sp, 32 # 4-byte Folded Spill19; LA32-NEXT:    st.w $s2, $sp, 28 # 4-byte Folded Spill20; LA32-NEXT:    st.w $s3, $sp, 24 # 4-byte Folded Spill21; LA32-NEXT:    st.w $s4, $sp, 20 # 4-byte Folded Spill22; LA32-NEXT:    st.w $s5, $sp, 16 # 4-byte Folded Spill23; LA32-NEXT:    st.w $s6, $sp, 12 # 4-byte Folded Spill24; LA32-NEXT:    move $s0, $a325; LA32-NEXT:    move $s1, $a226; LA32-NEXT:    slli.w $a1, $a0, 427; LA32-NEXT:    alsl.w $a0, $a0, $a1, 328; LA32-NEXT:    sltui $a1, $a3, 129; LA32-NEXT:    slti $a2, $a3, 030; LA32-NEXT:    masknez $a2, $a2, $a131; LA32-NEXT:    sltui $a3, $s1, 132; LA32-NEXT:    maskeqz $a1, $a3, $a133; LA32-NEXT:    or $a1, $a1, $a234; LA32-NEXT:    add.w $s2, $a4, $a035; LA32-NEXT:    bnez $a1, .LBB0_336; LA32-NEXT:  # %bb.1: # %for.body.preheader37; LA32-NEXT:    move $fp, $a438; LA32-NEXT:    move $s4, $zero39; LA32-NEXT:    move $s5, $zero40; LA32-NEXT:    move $s3, $zero41; LA32-NEXT:    move $s6, $zero42; LA32-NEXT:    .p2align 4, , 1643; LA32-NEXT:  .LBB0_2: # %for.body44; LA32-NEXT:    # =>This Inner Loop Header: Depth=145; LA32-NEXT:    move $a0, $fp46; LA32-NEXT:    bl f47; LA32-NEXT:    ld.w $a0, $s2, 1248; LA32-NEXT:    ld.w $a1, $s2, 849; LA32-NEXT:    add.w $a0, $a0, $s650; LA32-NEXT:    add.w $s3, $a1, $s351; LA32-NEXT:    sltu $a1, $s3, $a152; LA32-NEXT:    addi.w $s4, $s4, 153; LA32-NEXT:    sltui $a2, $s4, 154; LA32-NEXT:    add.w $s5, $s5, $a255; LA32-NEXT:    xor $a2, $s4, $s156; LA32-NEXT:    xor $a3, $s5, $s057; LA32-NEXT:    or $a2, $a2, $a358; LA32-NEXT:    add.w $s6, $a0, $a159; LA32-NEXT:    bnez $a2, .LBB0_260; LA32-NEXT:    b .LBB0_461; LA32-NEXT:  .LBB0_3:62; LA32-NEXT:    move $s3, $zero63; LA32-NEXT:    move $s6, $zero64; LA32-NEXT:  .LBB0_4: # %for.cond.cleanup65; LA32-NEXT:    st.w $s3, $s2, 866; LA32-NEXT:    st.w $s6, $s2, 1267; LA32-NEXT:    ld.w $s6, $sp, 12 # 4-byte Folded Reload68; LA32-NEXT:    ld.w $s5, $sp, 16 # 4-byte Folded Reload69; LA32-NEXT:    ld.w $s4, $sp, 20 # 4-byte Folded Reload70; LA32-NEXT:    ld.w $s3, $sp, 24 # 4-byte Folded Reload71; LA32-NEXT:    ld.w $s2, $sp, 28 # 4-byte Folded Reload72; LA32-NEXT:    ld.w $s1, $sp, 32 # 4-byte Folded Reload73; LA32-NEXT:    ld.w $s0, $sp, 36 # 4-byte Folded Reload74; LA32-NEXT:    ld.w $fp, $sp, 40 # 4-byte Folded Reload75; LA32-NEXT:    ld.w $ra, $sp, 44 # 4-byte Folded Reload76; LA32-NEXT:    addi.w $sp, $sp, 4877; LA32-NEXT:    ret78;79; LA64-LABEL: sink_fold_i64:80; LA64:       # %bb.0: # %entry81; LA64-NEXT:    addi.d $sp, $sp, -4882; LA64-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill83; LA64-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill84; LA64-NEXT:    st.d $s0, $sp, 24 # 8-byte Folded Spill85; LA64-NEXT:    st.d $s1, $sp, 16 # 8-byte Folded Spill86; LA64-NEXT:    st.d $s2, $sp, 8 # 8-byte Folded Spill87; LA64-NEXT:    move $s0, $a188; LA64-NEXT:    slli.d $a1, $a0, 489; LA64-NEXT:    alsl.d $a0, $a0, $a1, 390; LA64-NEXT:    add.d $s1, $a2, $a091; LA64-NEXT:    blez $s0, .LBB0_392; LA64-NEXT:  # %bb.1: # %for.body.preheader93; LA64-NEXT:    move $fp, $a294; LA64-NEXT:    move $s2, $zero95; LA64-NEXT:    .p2align 4, , 1696; LA64-NEXT:  .LBB0_2: # %for.body97; LA64-NEXT:    # =>This Inner Loop Header: Depth=198; LA64-NEXT:    move $a0, $fp99; LA64-NEXT:    pcaddu18i $ra, %call36(f)100; LA64-NEXT:    jirl $ra, $ra, 0101; LA64-NEXT:    ld.d $a0, $s1, 8102; LA64-NEXT:    addi.d $s0, $s0, -1103; LA64-NEXT:    add.d $s2, $a0, $s2104; LA64-NEXT:    bnez $s0, .LBB0_2105; LA64-NEXT:    b .LBB0_4106; LA64-NEXT:  .LBB0_3:107; LA64-NEXT:    move $s2, $zero108; LA64-NEXT:  .LBB0_4: # %for.cond.cleanup109; LA64-NEXT:    st.d $s2, $s1, 8110; LA64-NEXT:    ld.d $s2, $sp, 8 # 8-byte Folded Reload111; LA64-NEXT:    ld.d $s1, $sp, 16 # 8-byte Folded Reload112; LA64-NEXT:    ld.d $s0, $sp, 24 # 8-byte Folded Reload113; LA64-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload114; LA64-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload115; LA64-NEXT:    addi.d $sp, $sp, 48116; LA64-NEXT:    ret117entry:118  %y = getelementptr inbounds %struct.S, ptr %a, i64 %k, i32 1119  %cmp4 = icmp sgt i64 %n, 0120  br i1 %cmp4, label %for.body, label %for.cond.cleanup121 122for.body:                                         ; preds = %entry, %for.body123  %i.06 = phi i64 [ 0, %entry ], [ %inc, %for.body ]124  %s.05 = phi i64 [ 0, %entry ], [ %add, %for.body ]125  call void @f(ptr %a)126  %0 = load i64, ptr %y127  %add = add nsw i64 %0, %s.05128  %inc = add nuw nsw i64 %i.06, 1129  %exitcond.not = icmp eq i64 %inc, %n130  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body131 132for.cond.cleanup:                                 ; preds = %for.body, %entry133  %s.0.lcssa = phi i64 [ 0, %entry ], [ %add, %for.body ]134  store i64 %s.0.lcssa, ptr %y135  ret void136}137 138define void @sink_fold_f32(i64 %k, i64 %n, ptr %a) nounwind {139; LA32-LABEL: sink_fold_f32:140; LA32:       # %bb.0: # %entry141; LA32-NEXT:    addi.w $sp, $sp, -48142; LA32-NEXT:    st.w $ra, $sp, 44 # 4-byte Folded Spill143; LA32-NEXT:    st.w $fp, $sp, 40 # 4-byte Folded Spill144; LA32-NEXT:    st.w $s0, $sp, 36 # 4-byte Folded Spill145; LA32-NEXT:    st.w $s1, $sp, 32 # 4-byte Folded Spill146; LA32-NEXT:    st.w $s2, $sp, 28 # 4-byte Folded Spill147; LA32-NEXT:    st.w $s3, $sp, 24 # 4-byte Folded Spill148; LA32-NEXT:    st.w $s4, $sp, 20 # 4-byte Folded Spill149; LA32-NEXT:    fst.d $fs0, $sp, 8 # 8-byte Folded Spill150; LA32-NEXT:    move $s0, $a3151; LA32-NEXT:    move $s1, $a2152; LA32-NEXT:    slli.w $a1, $a0, 4153; LA32-NEXT:    alsl.w $a0, $a0, $a1, 3154; LA32-NEXT:    sltui $a1, $a3, 1155; LA32-NEXT:    slti $a2, $a3, 0156; LA32-NEXT:    masknez $a2, $a2, $a1157; LA32-NEXT:    sltui $a3, $s1, 1158; LA32-NEXT:    maskeqz $a1, $a3, $a1159; LA32-NEXT:    or $a1, $a1, $a2160; LA32-NEXT:    add.w $s2, $a4, $a0161; LA32-NEXT:    bnez $a1, .LBB1_3162; LA32-NEXT:  # %bb.1: # %for.body.preheader163; LA32-NEXT:    move $fp, $a4164; LA32-NEXT:    move $s3, $zero165; LA32-NEXT:    move $s4, $zero166; LA32-NEXT:    movgr2fr.w $fs0, $zero167; LA32-NEXT:    .p2align 4, , 16168; LA32-NEXT:  .LBB1_2: # %for.body169; LA32-NEXT:    # =>This Inner Loop Header: Depth=1170; LA32-NEXT:    move $a0, $fp171; LA32-NEXT:    bl f172; LA32-NEXT:    fld.s $fa0, $s2, 16173; LA32-NEXT:    addi.w $s3, $s3, 1174; LA32-NEXT:    sltui $a0, $s3, 1175; LA32-NEXT:    add.w $s4, $s4, $a0176; LA32-NEXT:    xor $a0, $s3, $s1177; LA32-NEXT:    xor $a1, $s4, $s0178; LA32-NEXT:    or $a0, $a0, $a1179; LA32-NEXT:    fadd.s $fs0, $fa0, $fs0180; LA32-NEXT:    bnez $a0, .LBB1_2181; LA32-NEXT:    b .LBB1_4182; LA32-NEXT:  .LBB1_3:183; LA32-NEXT:    movgr2fr.w $fs0, $zero184; LA32-NEXT:  .LBB1_4: # %for.cond.cleanup185; LA32-NEXT:    fst.s $fs0, $s2, 16186; LA32-NEXT:    fld.d $fs0, $sp, 8 # 8-byte Folded Reload187; LA32-NEXT:    ld.w $s4, $sp, 20 # 4-byte Folded Reload188; LA32-NEXT:    ld.w $s3, $sp, 24 # 4-byte Folded Reload189; LA32-NEXT:    ld.w $s2, $sp, 28 # 4-byte Folded Reload190; LA32-NEXT:    ld.w $s1, $sp, 32 # 4-byte Folded Reload191; LA32-NEXT:    ld.w $s0, $sp, 36 # 4-byte Folded Reload192; LA32-NEXT:    ld.w $fp, $sp, 40 # 4-byte Folded Reload193; LA32-NEXT:    ld.w $ra, $sp, 44 # 4-byte Folded Reload194; LA32-NEXT:    addi.w $sp, $sp, 48195; LA32-NEXT:    ret196;197; LA64-LABEL: sink_fold_f32:198; LA64:       # %bb.0: # %entry199; LA64-NEXT:    addi.d $sp, $sp, -48200; LA64-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill201; LA64-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill202; LA64-NEXT:    st.d $s0, $sp, 24 # 8-byte Folded Spill203; LA64-NEXT:    st.d $s1, $sp, 16 # 8-byte Folded Spill204; LA64-NEXT:    fst.d $fs0, $sp, 8 # 8-byte Folded Spill205; LA64-NEXT:    move $s0, $a1206; LA64-NEXT:    slli.d $a1, $a0, 4207; LA64-NEXT:    alsl.d $a0, $a0, $a1, 3208; LA64-NEXT:    add.d $s1, $a2, $a0209; LA64-NEXT:    blez $s0, .LBB1_3210; LA64-NEXT:  # %bb.1: # %for.body.preheader211; LA64-NEXT:    move $fp, $a2212; LA64-NEXT:    movgr2fr.w $fs0, $zero213; LA64-NEXT:    .p2align 4, , 16214; LA64-NEXT:  .LBB1_2: # %for.body215; LA64-NEXT:    # =>This Inner Loop Header: Depth=1216; LA64-NEXT:    move $a0, $fp217; LA64-NEXT:    pcaddu18i $ra, %call36(f)218; LA64-NEXT:    jirl $ra, $ra, 0219; LA64-NEXT:    fld.s $fa0, $s1, 16220; LA64-NEXT:    addi.d $s0, $s0, -1221; LA64-NEXT:    fadd.s $fs0, $fa0, $fs0222; LA64-NEXT:    bnez $s0, .LBB1_2223; LA64-NEXT:    b .LBB1_4224; LA64-NEXT:  .LBB1_3:225; LA64-NEXT:    movgr2fr.w $fs0, $zero226; LA64-NEXT:  .LBB1_4: # %for.cond.cleanup227; LA64-NEXT:    fst.s $fs0, $s1, 16228; LA64-NEXT:    fld.d $fs0, $sp, 8 # 8-byte Folded Reload229; LA64-NEXT:    ld.d $s1, $sp, 16 # 8-byte Folded Reload230; LA64-NEXT:    ld.d $s0, $sp, 24 # 8-byte Folded Reload231; LA64-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload232; LA64-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload233; LA64-NEXT:    addi.d $sp, $sp, 48234; LA64-NEXT:    ret235entry:236  %y = getelementptr inbounds %struct.F, ptr %a, i64 %k, i32 2237  %cmp4 = icmp sgt i64 %n, 0238  br i1 %cmp4, label %for.body, label %for.cond.cleanup239 240for.body:                                         ; preds = %entry, %for.body241  %i.06 = phi i64 [ 0, %entry ], [ %inc, %for.body ]242  %s.05 = phi float [ 0.0, %entry ], [ %add, %for.body ]243  call void @f(ptr %a)244  %0 = load float, ptr %y245  %add = fadd float %0, %s.05246  %inc = add nuw nsw i64 %i.06, 1247  %exitcond.not = icmp eq i64 %inc, %n248  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body249 250for.cond.cleanup:                                 ; preds = %for.body, %entry251  %s.0.lcssa = phi float [ 0.0, %entry ], [ %add, %for.body ]252  store float %s.0.lcssa, ptr %y253  ret void254}255 256define void @sink_fold_v4i32(i64 %k, i64 %n, ptr %a) nounwind {257; LA32-LABEL: sink_fold_v4i32:258; LA32:       # %bb.0: # %entry259; LA32-NEXT:    addi.w $sp, $sp, -48260; LA32-NEXT:    st.w $ra, $sp, 44 # 4-byte Folded Spill261; LA32-NEXT:    st.w $fp, $sp, 40 # 4-byte Folded Spill262; LA32-NEXT:    st.w $s0, $sp, 36 # 4-byte Folded Spill263; LA32-NEXT:    st.w $s1, $sp, 32 # 4-byte Folded Spill264; LA32-NEXT:    st.w $s2, $sp, 28 # 4-byte Folded Spill265; LA32-NEXT:    st.w $s3, $sp, 24 # 4-byte Folded Spill266; LA32-NEXT:    st.w $s4, $sp, 20 # 4-byte Folded Spill267; LA32-NEXT:    move $s0, $a3268; LA32-NEXT:    move $s1, $a2269; LA32-NEXT:    slli.w $a0, $a0, 6270; LA32-NEXT:    sltui $a1, $a3, 1271; LA32-NEXT:    slti $a2, $a3, 0272; LA32-NEXT:    masknez $a2, $a2, $a1273; LA32-NEXT:    sltui $a3, $s1, 1274; LA32-NEXT:    maskeqz $a1, $a3, $a1275; LA32-NEXT:    or $a1, $a1, $a2276; LA32-NEXT:    add.w $s2, $a4, $a0277; LA32-NEXT:    bnez $a1, .LBB2_3278; LA32-NEXT:  # %bb.1: # %for.body.preheader279; LA32-NEXT:    move $fp, $a4280; LA32-NEXT:    move $s3, $zero281; LA32-NEXT:    move $s4, $zero282; LA32-NEXT:    vrepli.b $vr0, 0283; LA32-NEXT:    .p2align 4, , 16284; LA32-NEXT:  .LBB2_2: # %for.body285; LA32-NEXT:    # =>This Inner Loop Header: Depth=1286; LA32-NEXT:    vst $vr0, $sp, 0 # 16-byte Folded Spill287; LA32-NEXT:    move $a0, $fp288; LA32-NEXT:    bl f289; LA32-NEXT:    vld $vr0, $s2, 16290; LA32-NEXT:    addi.w $s3, $s3, 1291; LA32-NEXT:    sltui $a0, $s3, 1292; LA32-NEXT:    add.w $s4, $s4, $a0293; LA32-NEXT:    xor $a0, $s3, $s1294; LA32-NEXT:    xor $a1, $s4, $s0295; LA32-NEXT:    or $a0, $a0, $a1296; LA32-NEXT:    vld $vr1, $sp, 0 # 16-byte Folded Reload297; LA32-NEXT:    vadd.w $vr1, $vr0, $vr1298; LA32-NEXT:    vst $vr1, $sp, 0 # 16-byte Folded Spill299; LA32-NEXT:    vld $vr0, $sp, 0 # 16-byte Folded Reload300; LA32-NEXT:    bnez $a0, .LBB2_2301; LA32-NEXT:    b .LBB2_4302; LA32-NEXT:  .LBB2_3:303; LA32-NEXT:    vrepli.b $vr0, 0304; LA32-NEXT:  .LBB2_4: # %for.cond.cleanup305; LA32-NEXT:    vst $vr0, $s2, 16306; LA32-NEXT:    ld.w $s4, $sp, 20 # 4-byte Folded Reload307; LA32-NEXT:    ld.w $s3, $sp, 24 # 4-byte Folded Reload308; LA32-NEXT:    ld.w $s2, $sp, 28 # 4-byte Folded Reload309; LA32-NEXT:    ld.w $s1, $sp, 32 # 4-byte Folded Reload310; LA32-NEXT:    ld.w $s0, $sp, 36 # 4-byte Folded Reload311; LA32-NEXT:    ld.w $fp, $sp, 40 # 4-byte Folded Reload312; LA32-NEXT:    ld.w $ra, $sp, 44 # 4-byte Folded Reload313; LA32-NEXT:    addi.w $sp, $sp, 48314; LA32-NEXT:    ret315;316; LA64-LABEL: sink_fold_v4i32:317; LA64:       # %bb.0: # %entry318; LA64-NEXT:    addi.d $sp, $sp, -48319; LA64-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill320; LA64-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill321; LA64-NEXT:    st.d $s0, $sp, 24 # 8-byte Folded Spill322; LA64-NEXT:    st.d $s1, $sp, 16 # 8-byte Folded Spill323; LA64-NEXT:    slli.d $a0, $a0, 6324; LA64-NEXT:    add.d $s1, $a2, $a0325; LA64-NEXT:    blez $a1, .LBB2_3326; LA64-NEXT:  # %bb.1: # %for.body.preheader327; LA64-NEXT:    move $fp, $a2328; LA64-NEXT:    move $s0, $a1329; LA64-NEXT:    vrepli.b $vr0, 0330; LA64-NEXT:    .p2align 4, , 16331; LA64-NEXT:  .LBB2_2: # %for.body332; LA64-NEXT:    # =>This Inner Loop Header: Depth=1333; LA64-NEXT:    vst $vr0, $sp, 0 # 16-byte Folded Spill334; LA64-NEXT:    move $a0, $fp335; LA64-NEXT:    pcaddu18i $ra, %call36(f)336; LA64-NEXT:    jirl $ra, $ra, 0337; LA64-NEXT:    vld $vr0, $s1, 16338; LA64-NEXT:    addi.d $s0, $s0, -1339; LA64-NEXT:    vld $vr1, $sp, 0 # 16-byte Folded Reload340; LA64-NEXT:    vadd.w $vr1, $vr0, $vr1341; LA64-NEXT:    vst $vr1, $sp, 0 # 16-byte Folded Spill342; LA64-NEXT:    vld $vr0, $sp, 0 # 16-byte Folded Reload343; LA64-NEXT:    bnez $s0, .LBB2_2344; LA64-NEXT:    b .LBB2_4345; LA64-NEXT:  .LBB2_3:346; LA64-NEXT:    vrepli.b $vr0, 0347; LA64-NEXT:  .LBB2_4: # %for.cond.cleanup348; LA64-NEXT:    vst $vr0, $s1, 16349; LA64-NEXT:    ld.d $s1, $sp, 16 # 8-byte Folded Reload350; LA64-NEXT:    ld.d $s0, $sp, 24 # 8-byte Folded Reload351; LA64-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload352; LA64-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload353; LA64-NEXT:    addi.d $sp, $sp, 48354; LA64-NEXT:    ret355entry:356  %y = getelementptr inbounds %struct.V, ptr %a, i64 %k, i32 1357  %cmp = icmp sgt i64 %n, 0358  br i1 %cmp, label %for.body, label %for.cond.cleanup359 360for.body:                                         ; preds = %entry, %for.body361  %i.0 = phi i64 [ 0, %entry ], [ %inc, %for.body ]362  %sum.0 = phi <4 x i32> [ zeroinitializer, %entry ], [ %addv, %for.body ]363  call void @f(ptr %a)364  %v = load <4 x i32>, ptr %y365  %addv = add <4 x i32> %v, %sum.0366  %inc = add nuw nsw i64 %i.0, 1367  %exitcond = icmp eq i64 %inc, %n368  br i1 %exitcond, label %for.cond.cleanup, label %for.body369 370for.cond.cleanup:                                 ; preds = %for.body, %entry371  %sum.lcssa = phi <4 x i32> [ zeroinitializer, %entry ], [ %addv, %for.body ]372  store <4 x i32> %sum.lcssa, ptr %y373  ret void374}375 376define void @sink_fold_v16i16(i64 %k, i64 %n, ptr %a) nounwind {377; LA32-LABEL: sink_fold_v16i16:378; LA32:       # %bb.0: # %entry379; LA32-NEXT:    addi.w $sp, $sp, -80380; LA32-NEXT:    st.w $ra, $sp, 76 # 4-byte Folded Spill381; LA32-NEXT:    st.w $fp, $sp, 72 # 4-byte Folded Spill382; LA32-NEXT:    st.w $s0, $sp, 68 # 4-byte Folded Spill383; LA32-NEXT:    st.w $s1, $sp, 64 # 4-byte Folded Spill384; LA32-NEXT:    st.w $s2, $sp, 60 # 4-byte Folded Spill385; LA32-NEXT:    st.w $s3, $sp, 56 # 4-byte Folded Spill386; LA32-NEXT:    st.w $s4, $sp, 52 # 4-byte Folded Spill387; LA32-NEXT:    move $s0, $a3388; LA32-NEXT:    move $s1, $a2389; LA32-NEXT:    slli.w $a0, $a0, 6390; LA32-NEXT:    sltui $a1, $a3, 1391; LA32-NEXT:    slti $a2, $a3, 0392; LA32-NEXT:    masknez $a2, $a2, $a1393; LA32-NEXT:    sltui $a3, $s1, 1394; LA32-NEXT:    maskeqz $a1, $a3, $a1395; LA32-NEXT:    or $a1, $a1, $a2396; LA32-NEXT:    add.w $s2, $a4, $a0397; LA32-NEXT:    bnez $a1, .LBB3_3398; LA32-NEXT:  # %bb.1: # %for.body.preheader399; LA32-NEXT:    move $fp, $a4400; LA32-NEXT:    move $s3, $zero401; LA32-NEXT:    move $s4, $zero402; LA32-NEXT:    xvrepli.b $xr0, 0403; LA32-NEXT:    .p2align 4, , 16404; LA32-NEXT:  .LBB3_2: # %for.body405; LA32-NEXT:    # =>This Inner Loop Header: Depth=1406; LA32-NEXT:    xvst $xr0, $sp, 16 # 32-byte Folded Spill407; LA32-NEXT:    move $a0, $fp408; LA32-NEXT:    bl f409; LA32-NEXT:    xvld $xr0, $s2, 32410; LA32-NEXT:    addi.w $s3, $s3, 1411; LA32-NEXT:    sltui $a0, $s3, 1412; LA32-NEXT:    add.w $s4, $s4, $a0413; LA32-NEXT:    xor $a0, $s3, $s1414; LA32-NEXT:    xor $a1, $s4, $s0415; LA32-NEXT:    or $a0, $a0, $a1416; LA32-NEXT:    xvld $xr1, $sp, 16 # 32-byte Folded Reload417; LA32-NEXT:    xvadd.h $xr1, $xr0, $xr1418; LA32-NEXT:    xvst $xr1, $sp, 16 # 32-byte Folded Spill419; LA32-NEXT:    xvld $xr0, $sp, 16 # 32-byte Folded Reload420; LA32-NEXT:    bnez $a0, .LBB3_2421; LA32-NEXT:    b .LBB3_4422; LA32-NEXT:  .LBB3_3:423; LA32-NEXT:    xvrepli.b $xr0, 0424; LA32-NEXT:  .LBB3_4: # %for.cond.cleanup425; LA32-NEXT:    xvst $xr0, $s2, 32426; LA32-NEXT:    ld.w $s4, $sp, 52 # 4-byte Folded Reload427; LA32-NEXT:    ld.w $s3, $sp, 56 # 4-byte Folded Reload428; LA32-NEXT:    ld.w $s2, $sp, 60 # 4-byte Folded Reload429; LA32-NEXT:    ld.w $s1, $sp, 64 # 4-byte Folded Reload430; LA32-NEXT:    ld.w $s0, $sp, 68 # 4-byte Folded Reload431; LA32-NEXT:    ld.w $fp, $sp, 72 # 4-byte Folded Reload432; LA32-NEXT:    ld.w $ra, $sp, 76 # 4-byte Folded Reload433; LA32-NEXT:    addi.w $sp, $sp, 80434; LA32-NEXT:    ret435;436; LA64-LABEL: sink_fold_v16i16:437; LA64:       # %bb.0: # %entry438; LA64-NEXT:    addi.d $sp, $sp, -80439; LA64-NEXT:    st.d $ra, $sp, 72 # 8-byte Folded Spill440; LA64-NEXT:    st.d $fp, $sp, 64 # 8-byte Folded Spill441; LA64-NEXT:    st.d $s0, $sp, 56 # 8-byte Folded Spill442; LA64-NEXT:    st.d $s1, $sp, 48 # 8-byte Folded Spill443; LA64-NEXT:    slli.d $a0, $a0, 6444; LA64-NEXT:    add.d $s1, $a2, $a0445; LA64-NEXT:    blez $a1, .LBB3_3446; LA64-NEXT:  # %bb.1: # %for.body.preheader447; LA64-NEXT:    move $fp, $a2448; LA64-NEXT:    move $s0, $a1449; LA64-NEXT:    xvrepli.b $xr0, 0450; LA64-NEXT:    .p2align 4, , 16451; LA64-NEXT:  .LBB3_2: # %for.body452; LA64-NEXT:    # =>This Inner Loop Header: Depth=1453; LA64-NEXT:    xvst $xr0, $sp, 16 # 32-byte Folded Spill454; LA64-NEXT:    move $a0, $fp455; LA64-NEXT:    pcaddu18i $ra, %call36(f)456; LA64-NEXT:    jirl $ra, $ra, 0457; LA64-NEXT:    xvld $xr0, $s1, 32458; LA64-NEXT:    addi.d $s0, $s0, -1459; LA64-NEXT:    xvld $xr1, $sp, 16 # 32-byte Folded Reload460; LA64-NEXT:    xvadd.h $xr1, $xr0, $xr1461; LA64-NEXT:    xvst $xr1, $sp, 16 # 32-byte Folded Spill462; LA64-NEXT:    xvld $xr0, $sp, 16 # 32-byte Folded Reload463; LA64-NEXT:    bnez $s0, .LBB3_2464; LA64-NEXT:    b .LBB3_4465; LA64-NEXT:  .LBB3_3:466; LA64-NEXT:    xvrepli.b $xr0, 0467; LA64-NEXT:  .LBB3_4: # %for.cond.cleanup468; LA64-NEXT:    xvst $xr0, $s1, 32469; LA64-NEXT:    ld.d $s1, $sp, 48 # 8-byte Folded Reload470; LA64-NEXT:    ld.d $s0, $sp, 56 # 8-byte Folded Reload471; LA64-NEXT:    ld.d $fp, $sp, 64 # 8-byte Folded Reload472; LA64-NEXT:    ld.d $ra, $sp, 72 # 8-byte Folded Reload473; LA64-NEXT:    addi.d $sp, $sp, 80474; LA64-NEXT:    ret475entry:476  %y = getelementptr inbounds %struct.V, ptr %a, i64 %k, i32 2477  %cmp = icmp sgt i64 %n, 0478  br i1 %cmp, label %for.body, label %for.cond.cleanup479 480for.body:                                         ; preds = %entry, %for.body481  %i.0 = phi i64 [ 0, %entry ], [ %inc, %for.body ]482  %sum.0 = phi <16 x i16> [ zeroinitializer, %entry ], [ %addv, %for.body ]483  call void @f(ptr %a)484  %v = load <16 x i16>, ptr %y485  %addv = add <16 x i16> %v, %sum.0486  %inc = add nuw nsw i64 %i.0, 1487  %exitcond = icmp eq i64 %inc, %n488  br i1 %exitcond, label %for.cond.cleanup, label %for.body489 490for.cond.cleanup:                                 ; preds = %for.body, %entry491  %sum.lcssa = phi <16 x i16> [ zeroinitializer, %entry ], [ %addv, %for.body ]492  store <16 x i16> %sum.lcssa, ptr %y493  ret void494}495 496define void @sink_fold_extracti8(i64 %k, i64 %n, ptr %a) nounwind {497; LA32-LABEL: sink_fold_extracti8:498; LA32:       # %bb.0: # %entry499; LA32-NEXT:    addi.w $sp, $sp, -48500; LA32-NEXT:    st.w $ra, $sp, 44 # 4-byte Folded Spill501; LA32-NEXT:    st.w $fp, $sp, 40 # 4-byte Folded Spill502; LA32-NEXT:    st.w $s0, $sp, 36 # 4-byte Folded Spill503; LA32-NEXT:    st.w $s1, $sp, 32 # 4-byte Folded Spill504; LA32-NEXT:    st.w $s2, $sp, 28 # 4-byte Folded Spill505; LA32-NEXT:    st.w $s3, $sp, 24 # 4-byte Folded Spill506; LA32-NEXT:    st.w $s4, $sp, 20 # 4-byte Folded Spill507; LA32-NEXT:    move $s0, $a3508; LA32-NEXT:    move $s1, $a2509; LA32-NEXT:    slli.w $a1, $a0, 4510; LA32-NEXT:    alsl.w $a0, $a0, $a1, 3511; LA32-NEXT:    sltui $a1, $a3, 1512; LA32-NEXT:    slti $a2, $a3, 0513; LA32-NEXT:    masknez $a2, $a2, $a1514; LA32-NEXT:    sltui $a3, $s1, 1515; LA32-NEXT:    maskeqz $a1, $a3, $a1516; LA32-NEXT:    or $a1, $a1, $a2517; LA32-NEXT:    add.w $s2, $a4, $a0518; LA32-NEXT:    bnez $a1, .LBB4_3519; LA32-NEXT:  # %bb.1: # %for.body.preheader520; LA32-NEXT:    move $fp, $a4521; LA32-NEXT:    move $s3, $zero522; LA32-NEXT:    move $s4, $zero523; LA32-NEXT:    vrepli.b $vr0, 0524; LA32-NEXT:    .p2align 4, , 16525; LA32-NEXT:  .LBB4_2: # %for.body526; LA32-NEXT:    # =>This Inner Loop Header: Depth=1527; LA32-NEXT:    vst $vr0, $sp, 0 # 16-byte Folded Spill528; LA32-NEXT:    move $a0, $fp529; LA32-NEXT:    bl f530; LA32-NEXT:    vldrepl.b $vr0, $s2, 16531; LA32-NEXT:    addi.w $s3, $s3, 1532; LA32-NEXT:    sltui $a0, $s3, 1533; LA32-NEXT:    add.w $s4, $s4, $a0534; LA32-NEXT:    xor $a0, $s3, $s1535; LA32-NEXT:    xor $a1, $s4, $s0536; LA32-NEXT:    or $a0, $a0, $a1537; LA32-NEXT:    vld $vr1, $sp, 0 # 16-byte Folded Reload538; LA32-NEXT:    vadd.b $vr1, $vr0, $vr1539; LA32-NEXT:    vst $vr1, $sp, 0 # 16-byte Folded Spill540; LA32-NEXT:    vld $vr0, $sp, 0 # 16-byte Folded Reload541; LA32-NEXT:    bnez $a0, .LBB4_2542; LA32-NEXT:    b .LBB4_4543; LA32-NEXT:  .LBB4_3:544; LA32-NEXT:    vrepli.b $vr0, 0545; LA32-NEXT:  .LBB4_4: # %for.cond.cleanup546; LA32-NEXT:    vstelm.b $vr0, $s2, 16, 1547; LA32-NEXT:    ld.w $s4, $sp, 20 # 4-byte Folded Reload548; LA32-NEXT:    ld.w $s3, $sp, 24 # 4-byte Folded Reload549; LA32-NEXT:    ld.w $s2, $sp, 28 # 4-byte Folded Reload550; LA32-NEXT:    ld.w $s1, $sp, 32 # 4-byte Folded Reload551; LA32-NEXT:    ld.w $s0, $sp, 36 # 4-byte Folded Reload552; LA32-NEXT:    ld.w $fp, $sp, 40 # 4-byte Folded Reload553; LA32-NEXT:    ld.w $ra, $sp, 44 # 4-byte Folded Reload554; LA32-NEXT:    addi.w $sp, $sp, 48555; LA32-NEXT:    ret556;557; LA64-LABEL: sink_fold_extracti8:558; LA64:       # %bb.0: # %entry559; LA64-NEXT:    addi.d $sp, $sp, -48560; LA64-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill561; LA64-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill562; LA64-NEXT:    st.d $s0, $sp, 24 # 8-byte Folded Spill563; LA64-NEXT:    st.d $s1, $sp, 16 # 8-byte Folded Spill564; LA64-NEXT:    move $s0, $a1565; LA64-NEXT:    slli.d $a1, $a0, 4566; LA64-NEXT:    alsl.d $a0, $a0, $a1, 3567; LA64-NEXT:    add.d $s1, $a2, $a0568; LA64-NEXT:    blez $s0, .LBB4_3569; LA64-NEXT:  # %bb.1: # %for.body.preheader570; LA64-NEXT:    move $fp, $a2571; LA64-NEXT:    vrepli.b $vr0, 0572; LA64-NEXT:    .p2align 4, , 16573; LA64-NEXT:  .LBB4_2: # %for.body574; LA64-NEXT:    # =>This Inner Loop Header: Depth=1575; LA64-NEXT:    vst $vr0, $sp, 0 # 16-byte Folded Spill576; LA64-NEXT:    move $a0, $fp577; LA64-NEXT:    pcaddu18i $ra, %call36(f)578; LA64-NEXT:    jirl $ra, $ra, 0579; LA64-NEXT:    vldrepl.b $vr0, $s1, 16580; LA64-NEXT:    addi.d $s0, $s0, -1581; LA64-NEXT:    vld $vr1, $sp, 0 # 16-byte Folded Reload582; LA64-NEXT:    vadd.b $vr1, $vr0, $vr1583; LA64-NEXT:    vst $vr1, $sp, 0 # 16-byte Folded Spill584; LA64-NEXT:    vld $vr0, $sp, 0 # 16-byte Folded Reload585; LA64-NEXT:    bnez $s0, .LBB4_2586; LA64-NEXT:    b .LBB4_4587; LA64-NEXT:  .LBB4_3:588; LA64-NEXT:    vrepli.b $vr0, 0589; LA64-NEXT:  .LBB4_4: # %for.cond.cleanup590; LA64-NEXT:    vstelm.b $vr0, $s1, 16, 1591; LA64-NEXT:    ld.d $s1, $sp, 16 # 8-byte Folded Reload592; LA64-NEXT:    ld.d $s0, $sp, 24 # 8-byte Folded Reload593; LA64-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload594; LA64-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload595; LA64-NEXT:    addi.d $sp, $sp, 48596; LA64-NEXT:    ret597entry:598  %y = getelementptr inbounds %struct.S, ptr %a, i64 %k, i32 2599  %cmp = icmp sgt i64 %n, 0600  br i1 %cmp, label %for.body, label %for.cond.cleanup601 602for.body:                                         ; preds = %entry, %for.body603  %i.0 = phi i64 [ 0, %entry ], [ %inc, %for.body ]604  %sum.0 = phi <16 x i8> [ zeroinitializer, %entry ], [ %addv, %for.body ]605  call void @f(ptr %a)606  %e = load i8, ptr %y607  %ins0 = insertelement <16 x i8> poison, i8 %e, i32 0608  %v = shufflevector <16 x i8> %ins0, <16 x i8> poison, <16 x i32> zeroinitializer609  %addv = add <16 x i8> %v, %sum.0610  %inc = add nuw nsw i64 %i.0, 1611  %exitcond = icmp eq i64 %inc, %n612  br i1 %exitcond, label %for.cond.cleanup, label %for.body613 614for.cond.cleanup:                                 ; preds = %for.body, %entry615  %sum.lcssa = phi <16 x i8> [ zeroinitializer, %entry ], [ %addv, %for.body ]616  %res = extractelement <16 x i8> %sum.lcssa, i32 1617  store i8 %res, ptr %y618  ret void619}620 621define void @sink_fold_extractf64(i64 %k, i64 %n, ptr %a) nounwind {622; LA32-LABEL: sink_fold_extractf64:623; LA32:       # %bb.0: # %entry624; LA32-NEXT:    addi.w $sp, $sp, -80625; LA32-NEXT:    st.w $ra, $sp, 76 # 4-byte Folded Spill626; LA32-NEXT:    st.w $fp, $sp, 72 # 4-byte Folded Spill627; LA32-NEXT:    st.w $s0, $sp, 68 # 4-byte Folded Spill628; LA32-NEXT:    st.w $s1, $sp, 64 # 4-byte Folded Spill629; LA32-NEXT:    st.w $s2, $sp, 60 # 4-byte Folded Spill630; LA32-NEXT:    st.w $s3, $sp, 56 # 4-byte Folded Spill631; LA32-NEXT:    st.w $s4, $sp, 52 # 4-byte Folded Spill632; LA32-NEXT:    move $s0, $a3633; LA32-NEXT:    move $s1, $a2634; LA32-NEXT:    slli.w $a1, $a0, 4635; LA32-NEXT:    alsl.w $a0, $a0, $a1, 3636; LA32-NEXT:    sltui $a1, $a3, 1637; LA32-NEXT:    slti $a2, $a3, 0638; LA32-NEXT:    masknez $a2, $a2, $a1639; LA32-NEXT:    sltui $a3, $s1, 1640; LA32-NEXT:    maskeqz $a1, $a3, $a1641; LA32-NEXT:    or $a1, $a1, $a2642; LA32-NEXT:    add.w $s2, $a4, $a0643; LA32-NEXT:    bnez $a1, .LBB5_3644; LA32-NEXT:  # %bb.1: # %for.body.preheader645; LA32-NEXT:    move $fp, $a4646; LA32-NEXT:    move $s3, $zero647; LA32-NEXT:    move $s4, $zero648; LA32-NEXT:    xvrepli.b $xr0, 0649; LA32-NEXT:    .p2align 4, , 16650; LA32-NEXT:  .LBB5_2: # %for.body651; LA32-NEXT:    # =>This Inner Loop Header: Depth=1652; LA32-NEXT:    xvst $xr0, $sp, 16 # 32-byte Folded Spill653; LA32-NEXT:    move $a0, $fp654; LA32-NEXT:    bl f655; LA32-NEXT:    xvldrepl.d $xr0, $s2, 8656; LA32-NEXT:    addi.w $s3, $s3, 1657; LA32-NEXT:    sltui $a0, $s3, 1658; LA32-NEXT:    add.w $s4, $s4, $a0659; LA32-NEXT:    xor $a0, $s3, $s1660; LA32-NEXT:    xor $a1, $s4, $s0661; LA32-NEXT:    or $a0, $a0, $a1662; LA32-NEXT:    xvld $xr1, $sp, 16 # 32-byte Folded Reload663; LA32-NEXT:    xvfadd.d $xr1, $xr0, $xr1664; LA32-NEXT:    xvst $xr1, $sp, 16 # 32-byte Folded Spill665; LA32-NEXT:    xvld $xr0, $sp, 16 # 32-byte Folded Reload666; LA32-NEXT:    bnez $a0, .LBB5_2667; LA32-NEXT:    b .LBB5_4668; LA32-NEXT:  .LBB5_3:669; LA32-NEXT:    xvrepli.b $xr0, 0670; LA32-NEXT:  .LBB5_4: # %for.cond.cleanup671; LA32-NEXT:    xvstelm.d $xr0, $s2, 8, 1672; LA32-NEXT:    ld.w $s4, $sp, 52 # 4-byte Folded Reload673; LA32-NEXT:    ld.w $s3, $sp, 56 # 4-byte Folded Reload674; LA32-NEXT:    ld.w $s2, $sp, 60 # 4-byte Folded Reload675; LA32-NEXT:    ld.w $s1, $sp, 64 # 4-byte Folded Reload676; LA32-NEXT:    ld.w $s0, $sp, 68 # 4-byte Folded Reload677; LA32-NEXT:    ld.w $fp, $sp, 72 # 4-byte Folded Reload678; LA32-NEXT:    ld.w $ra, $sp, 76 # 4-byte Folded Reload679; LA32-NEXT:    addi.w $sp, $sp, 80680; LA32-NEXT:    ret681;682; LA64-LABEL: sink_fold_extractf64:683; LA64:       # %bb.0: # %entry684; LA64-NEXT:    addi.d $sp, $sp, -80685; LA64-NEXT:    st.d $ra, $sp, 72 # 8-byte Folded Spill686; LA64-NEXT:    st.d $fp, $sp, 64 # 8-byte Folded Spill687; LA64-NEXT:    st.d $s0, $sp, 56 # 8-byte Folded Spill688; LA64-NEXT:    st.d $s1, $sp, 48 # 8-byte Folded Spill689; LA64-NEXT:    move $s0, $a1690; LA64-NEXT:    slli.d $a1, $a0, 4691; LA64-NEXT:    alsl.d $a0, $a0, $a1, 3692; LA64-NEXT:    add.d $s1, $a2, $a0693; LA64-NEXT:    blez $s0, .LBB5_3694; LA64-NEXT:  # %bb.1: # %for.body.preheader695; LA64-NEXT:    move $fp, $a2696; LA64-NEXT:    xvrepli.b $xr0, 0697; LA64-NEXT:    .p2align 4, , 16698; LA64-NEXT:  .LBB5_2: # %for.body699; LA64-NEXT:    # =>This Inner Loop Header: Depth=1700; LA64-NEXT:    xvst $xr0, $sp, 16 # 32-byte Folded Spill701; LA64-NEXT:    move $a0, $fp702; LA64-NEXT:    pcaddu18i $ra, %call36(f)703; LA64-NEXT:    jirl $ra, $ra, 0704; LA64-NEXT:    xvldrepl.d $xr0, $s1, 8705; LA64-NEXT:    addi.d $s0, $s0, -1706; LA64-NEXT:    xvld $xr1, $sp, 16 # 32-byte Folded Reload707; LA64-NEXT:    xvfadd.d $xr1, $xr0, $xr1708; LA64-NEXT:    xvst $xr1, $sp, 16 # 32-byte Folded Spill709; LA64-NEXT:    xvld $xr0, $sp, 16 # 32-byte Folded Reload710; LA64-NEXT:    bnez $s0, .LBB5_2711; LA64-NEXT:    b .LBB5_4712; LA64-NEXT:  .LBB5_3:713; LA64-NEXT:    xvrepli.b $xr0, 0714; LA64-NEXT:  .LBB5_4: # %for.cond.cleanup715; LA64-NEXT:    xvstelm.d $xr0, $s1, 8, 1716; LA64-NEXT:    ld.d $s1, $sp, 48 # 8-byte Folded Reload717; LA64-NEXT:    ld.d $s0, $sp, 56 # 8-byte Folded Reload718; LA64-NEXT:    ld.d $fp, $sp, 64 # 8-byte Folded Reload719; LA64-NEXT:    ld.d $ra, $sp, 72 # 8-byte Folded Reload720; LA64-NEXT:    addi.d $sp, $sp, 80721; LA64-NEXT:    ret722entry:723  %y = getelementptr inbounds %struct.F, ptr %a, i64 %k, i32 1724  %cmp = icmp sgt i64 %n, 0725  br i1 %cmp, label %for.body, label %for.cond.cleanup726 727for.body:                                         ; preds = %entry, %for.body728  %i.0 = phi i64 [ 0, %entry ], [ %inc, %for.body ]729  %sum.0 = phi <4 x double> [ zeroinitializer, %entry ], [ %addv, %for.body ]730  call void @f(ptr %a)731  %e = load double, ptr %y732  %ins0 = insertelement <4 x double> poison, double %e, i32 0733  %v = shufflevector <4 x double> %ins0, <4 x double> poison, <4 x i32> zeroinitializer734  %addv = fadd <4 x double> %v, %sum.0735  %inc = add nuw nsw i64 %i.0, 1736  %exitcond = icmp eq i64 %inc, %n737  br i1 %exitcond, label %for.cond.cleanup, label %for.body738 739for.cond.cleanup:                                 ; preds = %for.body, %entry740  %sum.lcssa = phi <4 x double> [ zeroinitializer, %entry ], [ %addv, %for.body ]741  %res = extractelement <4 x double> %sum.lcssa, i32 1742  store double %res, ptr %y743  ret void744}745 746declare void @f(ptr)747