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