brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.3 KiB · 4f770b9 Raw
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