brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 11dc405 Raw
99 lines · plain
1; RUN: opt %loadNPMPolly '-passes=polly-custom<flatten>' -polly-print-flatten-schedule -disable-output < %s | FileCheck %s2;3; dgemm kernel4; C := alpha*A*B + beta*C5; C[ni][nj]6; A[ni][nk]7; B[nk][nj]8 9target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"10 11define void @gemm(i32 %ni, i32 %nj, i32 %nk, double %alpha, double %beta, ptr noalias nonnull %C, ptr noalias nonnull %A, ptr noalias nonnull %B) {12entry:13  br label %ni.for14 15ni.for:16  %i = phi i32 [0, %entry], [%i.inc, %ni.inc]17  %i.cmp = icmp slt i32 %i, 318  br i1 %i.cmp, label %nj.for, label %ni.exit19 20  nj.for:21    %j = phi i32 [0, %ni.for], [%j.inc, %nj.inc]22    %j.cmp = icmp slt i32 %j, 723    br i1 %j.cmp, label %nj_beta, label %nj.exit24 25    nj_beta:26     %c_stride = mul nsw i32 %i, 3; %nj27     %c_idx_i = getelementptr inbounds double, ptr %C, i32 %c_stride28     %c_idx_ij = getelementptr inbounds double, ptr %c_idx_i, i32 %j29 30     ; C[i]ptr= beta31     %c = load double, ptr %c_idx_ij32     %c_beta = fmul double %c, %beta33     store double %c_beta, ptr %c_idx_ij34 35     br label %nk.for36 37    nk.for:38      %k = phi i32 [0, %nj_beta], [%k.inc, %nk.inc]39      %k.cmp = icmp slt i32 %k, 3 ; %nk40      br i1 %k.cmp, label %nk_alpha, label %nk.exit41 42      nk_alpha:43        %a_stride = mul nsw i32 %i, 3; %nk44        %a_idx_i = getelementptr inbounds double, ptr %A, i32 %a_stride45        %a_idx_ik = getelementptr inbounds double, ptr %a_idx_i, i32 %k46 47        %b_stride = mul nsw i32 %k, 3; %nj48        %b_idx_k = getelementptr inbounds double, ptr %B, i32 %b_stride49        %b_idx_kj = getelementptr inbounds double, ptr %b_idx_k, i32 %j50 51        ; C[i][j] += alpha * A[i]ptr B[k][j]52        %a = load double, ptr %a_idx_ik53        %b = load double, ptr %b_idx_kj54        %beta_c = load double, ptr %c_idx_ij55 56        %alpha_a = fmul double %a, %alpha57        %alpha_a_b = fmul double %alpha_a, %b58        %beta_c_alpha_a_b = fadd double %beta_c, %alpha_a_b59 60        store double %beta_c_alpha_a_b, ptr %c_idx_ij61 62        br label %nk.inc63 64    nk.inc:65      %k.inc = add nuw nsw i32 %k, 166      br label %nk.for67 68    nk.exit:69      ; store double %c, ptr %c_idx_ij70      br label %nj.inc71 72  nj.inc:73    %j.inc = add nuw nsw i32 %j, 174    br label %nj.for75 76  nj.exit:77    br label %ni.inc78 79ni.inc:80  %i.inc = add nuw nsw i32 %i, 181  br label %ni.for82 83ni.exit:84  br label %return85 86return:87  ret void88}89 90 91; CHECK:      Schedule before flattening {92; CHECK-NEXT:     { Stmt_nk_alpha[i0, i1, i2] -> [i0, i1, 1, i2] }93; CHECK-NEXT:     { Stmt_nj_beta[i0, i1] -> [i0, i1, 0, 0] }94; CHECK-NEXT: }95; CHECK:      Schedule after flattening {96; CHECK-NEXT:     { Stmt_nj_beta[i0, i1] -> [28i0 + 4i1] }97; CHECK-NEXT:     { Stmt_nk_alpha[i0, i1, i2] -> [1 + 28i0 + 4i1 + i2] }98; CHECK-NEXT: }99