brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · 22e8b24 Raw
133 lines · plain
1; RUN: opt -mtriple=amdgcn-- -passes='loop-unroll,simplifycfg,sroa' %s -S -o - | FileCheck %s2; RUN: opt -mtriple=r600-- -passes='loop-unroll,simplifycfg,sroa' %s -S -o - | FileCheck %s3 4; This test contains a simple loop that initializes an array declared in5; private memory.  We want to make sure these kinds of loops are always6; unrolled, because private memory is slow.7 8; CHECK-LABEL: @private_memory9; CHECK-NOT: alloca10; CHECK: store i32 5, ptr addrspace(1) %out11define amdgpu_kernel void @private_memory(ptr addrspace(1) %out) {12entry:13  %0 = alloca [32 x i32], addrspace(5)14  br label %loop.header15 16loop.header:17  %counter = phi i32 [0, %entry], [%inc, %loop.inc]18  br label %loop.body19 20loop.body:21  %ptr = getelementptr [32 x i32], ptr addrspace(5) %0, i32 0, i32 %counter22  store i32 %counter, ptr addrspace(5) %ptr23  br label %loop.inc24 25loop.inc:26  %inc = add i32 %counter, 127  %1 = icmp sge i32 %counter, 3228  br i1 %1, label  %exit, label %loop.header29 30exit:31  %2 = getelementptr [32 x i32], ptr addrspace(5) %0, i32 0, i32 532  %3 = load i32, ptr addrspace(5) %233  store i32 %3, ptr addrspace(1) %out34  ret void35}36 37; Check that loop is unrolled for local memory references38 39; CHECK-LABEL: @local_memory40; CHECK: getelementptr i32, ptr addrspace(1) %out, i32 12841; CHECK-NEXT: store42; CHECK-NEXT: ret43define amdgpu_kernel void @local_memory(ptr addrspace(1) %out, ptr addrspace(3) %lds) {44entry:45  br label %loop.header46 47loop.header:48  %counter = phi i32 [0, %entry], [%inc, %loop.inc]49  br label %loop.body50 51loop.body:52  %ptr_lds = getelementptr i32, ptr addrspace(3) %lds, i32 %counter53  %val = load i32, ptr addrspace(3) %ptr_lds54  %ptr_out = getelementptr i32, ptr addrspace(1) %out, i32 %counter55  store i32 %val, ptr addrspace(1) %ptr_out56  br label %loop.inc57 58loop.inc:59  %inc = add i32 %counter, 160  %cond = icmp sge i32 %counter, 12861  br i1 %cond, label  %exit, label %loop.header62 63exit:64  ret void65}66 67; Check that a loop with if inside completely unrolled to eliminate phi and if68 69; CHECK-LABEL: @unroll_for_if70; CHECK: entry:71; CHECK-NEXT: getelementptr72; CHECK-NEXT: store73; CHECK-NEXT: getelementptr74; CHECK-NEXT: store75; CHECK-NOT: br76define amdgpu_kernel void @unroll_for_if(ptr addrspace(5) %a) {77entry:78  br label %for.body79 80for.body:                                         ; preds = %entry, %for.inc81  %i1 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]82  %tobool = icmp eq i32 %i1, 083  br i1 %tobool, label %for.inc, label %if.then84 85if.then:                                          ; preds = %for.body86  %0 = sext i32 %i1 to i6487  %arrayidx = getelementptr inbounds i32, ptr addrspace(5) %a, i64 %088  store i32 0, ptr addrspace(5) %arrayidx, align 489  br label %for.inc90 91for.inc:                                          ; preds = %for.body, %if.then92  %inc = add nuw nsw i32 %i1, 193  %cmp = icmp ult i32 %inc, 3894  br i1 %cmp, label %for.body, label %for.end95 96for.end:                                          ; preds = %for.cond97  ret void98}99 100; Check that runtime unroll is enabled for local memory references101 102; CHECK-LABEL: @local_memory_runtime103; CHECK: loop.header:104; CHECK: load i32, ptr addrspace(3)105; CHECK: load i32, ptr addrspace(3)106; CHECK: br i1107; CHECK: loop.header.epil108; CHECK: load i32, ptr addrspace(3)109; CHECK: ret110define amdgpu_kernel void @local_memory_runtime(ptr addrspace(1) %out, ptr addrspace(3) %lds, i32 %n) {111entry:112  br label %loop.header113 114loop.header:115  %counter = phi i32 [0, %entry], [%inc, %loop.inc]116  br label %loop.body117 118loop.body:119  %ptr_lds = getelementptr i32, ptr addrspace(3) %lds, i32 %counter120  %val = load i32, ptr addrspace(3) %ptr_lds121  %ptr_out = getelementptr i32, ptr addrspace(1) %out, i32 %counter122  store i32 %val, ptr addrspace(1) %ptr_out123  br label %loop.inc124 125loop.inc:126  %inc = add i32 %counter, 1127  %cond = icmp sge i32 %counter, %n128  br i1 %cond, label  %exit, label %loop.header129 130exit:131  ret void132}133