157 lines · plain
1; RUN: opt -data-layout=A5 -mtriple=amdgcn-unknown-amdhsa -passes=loop-unroll -S %s | FileCheck %s2 3; Check that we full unroll loop to be able to eliminate alloca4; CHECK-LABEL: @non_invariant_ind5; CHECK: for.body:6; CHECK-NOT: br7; CHECK: store i32 %tmp15, ptr addrspace(1) %arrayidx7, align 48; CHECK: ret void9 10define amdgpu_kernel void @non_invariant_ind(ptr addrspace(1) nocapture %a, i32 %x) {11entry:12 %arr = alloca [64 x i32], align 4, addrspace(5)13 %tmp1 = tail call i32 @llvm.amdgcn.workitem.id.x() #114 br label %for.body15 16for.cond.cleanup: ; preds = %for.body17 %arrayidx5 = getelementptr inbounds [64 x i32], ptr addrspace(5) %arr, i32 0, i32 %x18 %tmp15 = load i32, ptr addrspace(5) %arrayidx5, align 419 %arrayidx7 = getelementptr inbounds i32, ptr addrspace(1) %a, i32 %tmp120 store i32 %tmp15, ptr addrspace(1) %arrayidx7, align 421 ret void22 23for.body: ; preds = %for.body, %entry24 %i.015 = phi i32 [ 0, %entry ], [ %inc, %for.body ]25 %idxprom = sext i32 %i.015 to i6426 %arrayidx = getelementptr inbounds i32, ptr addrspace(1) %a, i64 %idxprom27 %tmp16 = load i32, ptr addrspace(1) %arrayidx, align 428 %add = add nsw i32 %i.015, %tmp129 %rem = srem i32 %add, 6430 %arrayidx3 = getelementptr inbounds [64 x i32], ptr addrspace(5) %arr, i32 0, i32 %rem31 store i32 %tmp16, ptr addrspace(5) %arrayidx3, align 432 %inc = add nuw nsw i32 %i.015, 133 %exitcond = icmp eq i32 %inc, 10034 br i1 %exitcond, label %for.cond.cleanup, label %for.body35}36 37declare i32 @func()38 39; Check that we unroll inner loop but not outer40; CHECK-LABEL: @invariant_ind41; CHECK: %[[exitcond:[^ ]+]] = icmp eq i32 %{{.*}}, 3242; CHECK: br i1 %[[exitcond]]43; CHECK-NOT: icmp eq i32 %{{.*}}, 10044 45define amdgpu_kernel void @invariant_ind(ptr addrspace(1) nocapture %a, i32 %x) {46entry:47 %arr = alloca [64 x i32], align 4, addrspace(5)48 %tmp1 = tail call i32 @func()49 br label %for.cond2.preheader50 51for.cond2.preheader: ; preds = %for.cond.cleanup5, %entry52 %i.026 = phi i32 [ 0, %entry ], [ %inc10, %for.cond.cleanup5 ]53 %idxprom = sext i32 %i.026 to i6454 %arrayidx = getelementptr inbounds i32, ptr addrspace(1) %a, i64 %idxprom55 %tmp15 = load i32, ptr addrspace(1) %arrayidx, align 456 br label %for.body657 58for.cond.cleanup: ; preds = %for.cond.cleanup559 %arrayidx13 = getelementptr inbounds [64 x i32], ptr addrspace(5) %arr, i32 0, i32 %x60 %tmp16 = load i32, ptr addrspace(5) %arrayidx13, align 461 %arrayidx15 = getelementptr inbounds i32, ptr addrspace(1) %a, i32 %tmp162 store i32 %tmp16, ptr addrspace(1) %arrayidx15, align 463 ret void64 65for.cond.cleanup5: ; preds = %for.body666 %inc10 = add nuw nsw i32 %i.026, 167 %exitcond27 = icmp eq i32 %inc10, 3268 br i1 %exitcond27, label %for.cond.cleanup, label %for.cond2.preheader69 70for.body6: ; preds = %for.body6, %for.cond2.preheader71 %j.025 = phi i32 [ 0, %for.cond2.preheader ], [ %inc, %for.body6 ]72 %add = add nsw i32 %j.025, %tmp173 %rem = srem i32 %add, 6474 %arrayidx8 = getelementptr inbounds [64 x i32], ptr addrspace(5) %arr, i32 0, i32 %rem75 store i32 %tmp15, ptr addrspace(5) %arrayidx8, align 476 %inc = add nuw nsw i32 %j.025, 177 %exitcond = icmp eq i32 %inc, 10078 br i1 %exitcond, label %for.cond.cleanup5, label %for.body679}80 81; Check we do not enforce unroll if alloca is too big82; CHECK-LABEL: @too_big83; CHECK: for.body:84; CHECK: icmp eq i32 %{{.*}}, 10085; CHECK: br86 87define amdgpu_kernel void @too_big(ptr addrspace(1) nocapture %a, i32 %x) {88entry:89 %arr = alloca [256 x i32], align 4, addrspace(5)90 %tmp1 = tail call i32 @llvm.amdgcn.workitem.id.x() #191 br label %for.body92 93for.cond.cleanup: ; preds = %for.body94 %arrayidx5 = getelementptr inbounds [256 x i32], ptr addrspace(5) %arr, i32 0, i32 %x95 %tmp15 = load i32, ptr addrspace(5) %arrayidx5, align 496 %arrayidx7 = getelementptr inbounds i32, ptr addrspace(1) %a, i32 %tmp197 store i32 %tmp15, ptr addrspace(1) %arrayidx7, align 498 ret void99 100for.body: ; preds = %for.body, %entry101 %i.015 = phi i32 [ 0, %entry ], [ %inc, %for.body ]102 %idxprom = sext i32 %i.015 to i64103 %arrayidx = getelementptr inbounds i32, ptr addrspace(1) %a, i64 %idxprom104 %tmp16 = load i32, ptr addrspace(1) %arrayidx, align 4105 %add = add nsw i32 %i.015, %tmp1106 %rem = srem i32 %add, 64107 %arrayidx3 = getelementptr inbounds [256 x i32], ptr addrspace(5) %arr, i32 0, i32 %rem108 store i32 %tmp16, ptr addrspace(5) %arrayidx3, align 4109 %inc = add nuw nsw i32 %i.015, 1110 %exitcond = icmp eq i32 %inc, 100111 br i1 %exitcond, label %for.cond.cleanup, label %for.body112}113 114; Check we do not enforce unroll if alloca is dynamic115; CHECK-LABEL: @dynamic_size_alloca(116; CHECK: alloca i32, i32 %n117; CHECK: for.body:118; CHECK: icmp eq i32 %{{.*}}, 100119; CHECK: br120 121define amdgpu_kernel void @dynamic_size_alloca(ptr addrspace(1) nocapture %a, i32 %n, i32 %x) {122entry:123 %arr = alloca i32, i32 %n, align 4, addrspace(5)124 %tmp1 = tail call i32 @llvm.amdgcn.workitem.id.x() #1125 br label %for.body126 127for.cond.cleanup: ; preds = %for.body128 %arrayidx5 = getelementptr inbounds i32, ptr addrspace(5) %arr, i32 %x129 %tmp15 = load i32, ptr addrspace(5) %arrayidx5, align 4130 %arrayidx7 = getelementptr inbounds i32, ptr addrspace(1) %a, i32 %tmp1131 store i32 %tmp15, ptr addrspace(1) %arrayidx7, align 4132 ret void133 134for.body: ; preds = %for.body, %entry135 %i.015 = phi i32 [ 0, %entry ], [ %inc, %for.body ]136 %idxprom = sext i32 %i.015 to i64137 %arrayidx = getelementptr inbounds i32, ptr addrspace(1) %a, i64 %idxprom138 %tmp16 = load i32, ptr addrspace(1) %arrayidx, align 4139 %add = add nsw i32 %i.015, %tmp1140 %rem = srem i32 %add, 64141 %arrayidx3 = getelementptr inbounds i32, ptr addrspace(5) %arr, i32 %rem142 store i32 %tmp16, ptr addrspace(5) %arrayidx3, align 4143 %inc = add nuw nsw i32 %i.015, 1144 %exitcond = icmp eq i32 %inc, 100145 br i1 %exitcond, label %for.cond.cleanup, label %for.body146}147 148declare ptr addrspace(4) @llvm.amdgcn.dispatch.ptr() #1149 150declare i32 @llvm.amdgcn.workitem.id.x() #1151 152declare i32 @llvm.amdgcn.workgroup.id.x() #1153 154declare ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr() #1155 156attributes #1 = { nounwind readnone }157