118 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+zdinx,+zilsd -verify-machineinstrs \3; RUN: -code-model=medium < %s | FileCheck %s4 5@g_0 = global double 0.06 7define double @load_g_0() nounwind {8; CHECK-LABEL: load_g_0:9; CHECK: # %bb.0: # %entry10; CHECK-NEXT: .Lpcrel_hi0:11; CHECK-NEXT: auipc a0, %pcrel_hi(g_0)12; CHECK-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi0)(a0)13; CHECK-NEXT: ret14entry:15 %0 = load double, ptr @g_016 ret double %017}18 19define void @store_g_0() nounwind {20; CHECK-LABEL: store_g_0:21; CHECK: # %bb.0: # %entry22; CHECK-NEXT: .Lpcrel_hi1:23; CHECK-NEXT: auipc a0, %pcrel_hi(g_0)24; CHECK-NEXT: sd zero, %pcrel_lo(.Lpcrel_hi1)(a0)25; CHECK-NEXT: ret26entry:27 store double 0.0, ptr @g_028 ret void29}30 31%struct.S = type { double, double }32 33define double @fold_addi_from_different_bb(i32 %k, i32 %n, ptr %a) nounwind {34; CHECK-LABEL: fold_addi_from_different_bb:35; CHECK: # %bb.0: # %entry36; CHECK-NEXT: addi sp, sp, -3237; CHECK-NEXT: sw ra, 28(sp) # 4-byte Folded Spill38; CHECK-NEXT: sw s0, 24(sp) # 4-byte Folded Spill39; CHECK-NEXT: sw s1, 20(sp) # 4-byte Folded Spill40; CHECK-NEXT: sw s2, 16(sp) # 4-byte Folded Spill41; CHECK-NEXT: sw s3, 12(sp) # 4-byte Folded Spill42; CHECK-NEXT: sw s4, 8(sp) # 4-byte Folded Spill43; CHECK-NEXT: blez a1, .LBB2_344; CHECK-NEXT: # %bb.1: # %for.body.lr.ph45; CHECK-NEXT: mv s2, a246; CHECK-NEXT: mv s3, a147; CHECK-NEXT: fmv.d s0, zero48; CHECK-NEXT: slli a0, a0, 449; CHECK-NEXT: add s4, a2, a050; CHECK-NEXT: .LBB2_2: # %for.body51; CHECK-NEXT: # =>This Inner Loop Header: Depth=152; CHECK-NEXT: mv a0, s253; CHECK-NEXT: call f54; CHECK-NEXT: ld a0, 8(s4)55; CHECK-NEXT: addi s3, s3, -156; CHECK-NEXT: fadd.d s0, a0, s057; CHECK-NEXT: bnez s3, .LBB2_258; CHECK-NEXT: j .LBB2_459; CHECK-NEXT: .LBB2_3:60; CHECK-NEXT: fmv.d s0, zero61; CHECK-NEXT: .LBB2_4: # %for.cond.cleanup62; CHECK-NEXT: mv a0, s063; CHECK-NEXT: mv a1, s164; CHECK-NEXT: lw ra, 28(sp) # 4-byte Folded Reload65; CHECK-NEXT: lw s0, 24(sp) # 4-byte Folded Reload66; CHECK-NEXT: lw s1, 20(sp) # 4-byte Folded Reload67; CHECK-NEXT: lw s2, 16(sp) # 4-byte Folded Reload68; CHECK-NEXT: lw s3, 12(sp) # 4-byte Folded Reload69; CHECK-NEXT: lw s4, 8(sp) # 4-byte Folded Reload70; CHECK-NEXT: addi sp, sp, 3271; CHECK-NEXT: ret72entry:73 %cmp4 = icmp sgt i32 %n, 074 br i1 %cmp4, label %for.body.lr.ph, label %for.cond.cleanup75 76for.body.lr.ph: ; preds = %entry77 %y = getelementptr inbounds %struct.S, ptr %a, i32 %k, i32 178 br label %for.body79 80for.cond.cleanup: ; preds = %for.body, %entry81 %s.0.lcssa = phi double [ 0.0, %entry ], [ %add, %for.body ]82 ret double %s.0.lcssa83 84for.body: ; preds = %for.body.lr.ph, %for.body85 %i.06 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]86 %s.05 = phi double [ 0.0, %for.body.lr.ph ], [ %add, %for.body ]87 call void @f(ptr %a)88 %0 = load double, ptr %y, align 889 %add = fadd double %0, %s.0590 %inc = add nuw nsw i32 %i.06, 191 %exitcond.not = icmp eq i32 %inc, %n92 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body93}94 95declare void @f(ptr)96 97define void @split_offset(ptr %dest, double %x) {98; CHECK-LABEL: split_offset:99; CHECK: # %bb.0:100; CHECK-NEXT: mv a3, a2101; CHECK-NEXT: addi a0, a0, 2047102; CHECK-NEXT: mv a2, a1103; CHECK-NEXT: sd a2, 1(a0)104; CHECK-NEXT: sd a2, 9(a0)105; CHECK-NEXT: sd a2, 17(a0)106; CHECK-NEXT: sd a2, 25(a0)107; CHECK-NEXT: ret108 %p1 = getelementptr double, ptr %dest, i32 256109 store double %x, ptr %p1110 %p2 = getelementptr double, ptr %dest, i32 257111 store double %x, ptr %p2112 %p3 = getelementptr double, ptr %dest, i32 258113 store double %x, ptr %p3114 %p4 = getelementptr double, ptr %dest, i32 259115 store double %x, ptr %p4116 ret void117}118