brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.8 KiB · 268a897 Raw
226 lines · plain
1; Reproducer for a bad performance regression triggered by switch to the new PM.2; `barney` ended up with the local variables not being optimized away and that3; had rather dramatic effect on some GPU code. See4; https://bugs.llvm.org/show_bug.cgi?id=52037 for the gory details.5;6; RUN: llc -mtriple=nvptx64-nvidia-cuda -mcpu=sm_70 -O3 -o - %s | FileCheck %s7; RUN: %if ptxas-sm_70 %{ llc -mtriple=nvptx64-nvidia-cuda -mcpu=sm_70 -O3 -o - %s | %ptxas-verify -arch=sm_70 %}8 9; CHECK-LABEL: .visible .entry barney(10; CHECK-NOT:  .local{{.*}}__local_depot11; CHECK: ret;12 13source_filename = "reduced.1.ll"14target triple = "nvptx64-nvidia-cuda"15 16%char3 = type { i8, i8, i8 }17%float4 = type { float, float, float, float }18%float3 = type { float, float, float }19%int3 = type { i32, i32, i32 }20%struct.spam.2 = type { %struct.foo.3, ptr, float, float, i32, float }21%struct.foo.3 = type <{ ptr, ptr, ptr, ptr, ptr, i32, i32, float }>22%struct.zot = type { %struct.bar, [8 x i8], %struct.foo, [12 x i8] }23%struct.bar = type { ptr }24%struct.foo = type <{ ptr, %float4, %int3, i32, %float3, [4 x i8], i64, i32, i8, [3 x i8], i32 }>25 26@global = external local_unnamed_addr addrspace(4) externally_initialized global [27 x %char3], align 127@global_1 = linkonce_odr unnamed_addr constant { [3 x ptr] } { [3 x ptr] [ptr inttoptr (i64 16 to ptr), ptr null, ptr null] }, align 828 29; Function Attrs: argmemonly mustprogress nofree nounwind willreturn30declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #031 32declare %float4 @snork(float) local_unnamed_addr33 34declare %float3 @bar_2(float, float) local_unnamed_addr35 36declare %float3 @zot() local_unnamed_addr37 38declare %int3 @hoge(i32, i32, i32) local_unnamed_addr39 40declare i64 @foo() local_unnamed_addr41 42define ptx_kernel void @barney(ptr nocapture readonly %arg) local_unnamed_addr {43bb:44  tail call void asm sideeffect "// KEEP", ""() #145  %tmp = alloca %struct.zot, align 1646  %tmp4 = getelementptr inbounds %struct.spam.2, ptr %arg, i64 0, i32 147  %tmp5 = load ptr, ptr %tmp4, align 848  %tmp9 = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2, i32 149  store ptr %tmp5, ptr %tmp9, align 850  store ptr getelementptr inbounds ({ [3 x ptr] }, ptr @global_1, i64 0, i32 0, i64 3), ptr %tmp, align 1651  %tmp.i1 = tail call i64 @foo()52  %tmp44.i16 = getelementptr inbounds i16, ptr %tmp5, i64 undef53  %tmp45.i17 = load i16, ptr %tmp44.i16, align 254  %tmp47.i18 = icmp eq i16 %tmp45.i17, -155  br i1 %tmp47.i18, label %bb14, label %bb49.i.lr.ph56 57bb49.i.lr.ph:                                     ; preds = %bb58  %tmp7.i6 = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 259  %extract = lshr i16 %tmp45.i17, 1160  %extract.t = trunc i16 %extract to i861  %0 = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 262  %tmp58.i = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2, i32 1, i32 263  %tmp59.i = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2, i32 4, i32 264  %tmp62.i = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2, i32 2, i32 265  %1 = getelementptr inbounds %struct.foo, ptr %0, i64 166  %tmp64.i = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2, i32 1067  %tmp19.i.i = load float, ptr %tmp58.i, align 1668  %tmp23.i.i = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2, i32 269  %tmp24.i.i = load float, ptr %tmp23.i.i, align 870  %2 = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2, i32 5, i64 071  %.repack3.i = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2, i32 672  %tmp41.i.i = load i32, ptr %tmp62.i, align 1673  %tmp48.i.i = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2, i32 374  %tmp49.i.i = load i32, ptr %tmp48.i.i, align 475  %tmp54.i.i = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2, i32 476  %tmp55.i.i = load i32, ptr %tmp54.i.i, align 877  %tmp9.i = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2, i32 778  %tmp40.i = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2, i32 4, i32 179  %tmp41.i = load i32, ptr %tmp40.i, align 480  %tmp42.i = zext i32 %tmp41.i to i6481  %tmp7.i = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 282  %tmp17.pre = load ptr, ptr %tmp, align 1683  %tmp61.i.peel = load ptr, ptr %tmp7.i6, align 1684  %tmp10.i.i.peel = add nsw i8 %extract.t, -185  store i8 %tmp10.i.i.peel, ptr %1, align 486  %tmp13.i.i.peel = tail call %float3 @zot() #187  %tmp15.i.i.peel = extractvalue %float3 %tmp13.i.i.peel, 088  %tmp22.i.i.peel = fsub contract float %tmp19.i.i, %tmp15.i.i.peel89  %tmp17.i.i.peel = extractvalue %float3 %tmp13.i.i.peel, 290  %tmp27.i.i.peel = fsub contract float %tmp24.i.i, %tmp17.i.i.peel91  %tmp28.i.i.peel = tail call %float3 @bar_2(float %tmp22.i.i.peel, float %tmp27.i.i.peel) #192  %tmp28.i.elt.i.peel = extractvalue %float3 %tmp28.i.i.peel, 093  store float %tmp28.i.elt.i.peel, ptr %tmp59.i, align 1694  %tmp28.i.elt2.i.peel = extractvalue %float3 %tmp28.i.i.peel, 195  store float %tmp28.i.elt2.i.peel, ptr %2, align 496  %tmp28.i.elt4.i.peel = extractvalue %float3 %tmp28.i.i.peel, 297  store float %tmp28.i.elt4.i.peel, ptr %.repack3.i, align 898  %tmp38.i.i.peel = zext i8 %tmp10.i.i.peel to i6499  %tmp39.i5.i.peel = getelementptr inbounds [27 x %char3], ptr addrspace(4) @global, i64 0, i64 %tmp38.i.i.peel100  %tmp39.i.i.peel = addrspacecast ptr addrspace(4) %tmp39.i5.i.peel to ptr101  %tmp43.i.i.peel = load i8, ptr %tmp39.i.i.peel, align 1102  %tmp44.i.i.peel = sext i8 %tmp43.i.i.peel to i32103  %tmp45.i.i.peel = add nsw i32 %tmp41.i.i, %tmp44.i.i.peel104  %tmp50.i.i.peel = getelementptr inbounds %char3, ptr %tmp39.i.i.peel, i64 0, i32 1105  %tmp51.i.i.peel = load i8, ptr %tmp50.i.i.peel, align 1106  %tmp52.i.i.peel = sext i8 %tmp51.i.i.peel to i32107  %tmp53.i.i.peel = add nsw i32 %tmp49.i.i, %tmp52.i.i.peel108  %tmp56.i.i.peel = getelementptr inbounds %char3, ptr %tmp39.i.i.peel, i64 0, i32 2109  %tmp57.i.i.peel = load i8, ptr %tmp56.i.i.peel, align 1110  %tmp58.i.i.peel = sext i8 %tmp57.i.i.peel to i32111  %tmp59.i.i.peel = add nsw i32 %tmp55.i.i, %tmp58.i.i.peel112  %tmp60.i.i.peel = tail call %int3 @hoge(i32 %tmp45.i.i.peel, i32 %tmp53.i.i.peel, i32 %tmp59.i.i.peel) #1113  %tmp61.i.i.peel = getelementptr inbounds i32, ptr %tmp61.i.peel, i64 undef114  %tmp62.i.i.peel = load i32, ptr %tmp61.i.i.peel, align 4115  store i32 %tmp62.i.i.peel, ptr %tmp64.i, align 8116  %tmp22.peel = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2117  %tmp24.peel = getelementptr inbounds i8, ptr %tmp22.peel, i64 80118  %tmp25.peel = load i32, ptr %tmp24.peel, align 16119  %tmp36.peel = load ptr, ptr %arg, align 8120  %tmp37.peel = zext i32 %tmp25.peel to i64121  %tmp38.peel = getelementptr inbounds %float4, ptr %tmp36.peel, i64 %tmp37.peel122  tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 undef, ptr align 1 %tmp38.peel, i64 undef, i1 false)123  %tmp40.peel = getelementptr inbounds %struct.zot, ptr %tmp, i64 0, i32 2, i32 4, i32 2124  %tmp41.peel25 = getelementptr inbounds float, ptr %tmp40.peel, i64 2125  %tmp42.peel = load float, ptr %tmp41.peel25, align 8126  %tmp44.peel = load float, ptr inttoptr (i64 8 to ptr), align 8127  %tmp45.peel = fsub contract float %tmp42.peel, %tmp44.peel128  %tmp46.peel = tail call %float4 @snork(float %tmp45.peel)129  %tmp.i.peel = tail call i64 @foo()130  %tmp10.i.peel = load i64, ptr %tmp9.i, align 16131  %tmp11.i.peel = add i64 %tmp10.i.peel, %tmp.i.peel132  store i64 %tmp11.i.peel, ptr %tmp9.i, align 16, !tbaa !1133  %tmp43.i.peel = add i64 %tmp11.i.peel, %tmp42.i134  %tmp44.i.peel = getelementptr inbounds i16, ptr %tmp5, i64 %tmp43.i.peel135  %tmp45.i.peel = load i16, ptr %tmp44.i.peel, align 2136  %tmp47.i.peel = icmp eq i16 %tmp45.i.peel, -1137  %extract21.peel = lshr i16 %tmp45.i.peel, 11138  %extract.t22.peel = trunc i16 %extract21.peel to i8139  br i1 %tmp47.i.peel, label %bb14, label %bb49.i.lr.ph.peel.newph140 141bb49.i.lr.ph.peel.newph:                          ; preds = %bb49.i.lr.ph142  %tmp61.i = load ptr, ptr %tmp7.i, align 16143  %tmp61.i.i = getelementptr inbounds i32, ptr %tmp61.i, i64 undef144  %tmp18 = getelementptr i8, ptr %tmp17.pre, i64 -24145  br label %bb49.i146 147bb49.i:                                           ; preds = %bb49.i, %bb49.i.lr.ph.peel.newph148  %tmp45.i20.off11 = phi i8 [ %extract.t22.peel, %bb49.i.lr.ph.peel.newph ], [ %extract.t22, %bb49.i ]149  %tmp10.i.i = add nsw i8 %tmp45.i20.off11, -1150  store i8 %tmp10.i.i, ptr %1, align 4151  %tmp13.i.i = tail call %float3 @zot() #1152  %tmp15.i.i = extractvalue %float3 %tmp13.i.i, 0153  %tmp22.i.i = fsub contract float %tmp19.i.i, %tmp15.i.i154  %tmp17.i.i = extractvalue %float3 %tmp13.i.i, 2155  %tmp27.i.i = fsub contract float %tmp24.i.i, %tmp17.i.i156  %tmp28.i.i = tail call %float3 @bar_2(float %tmp22.i.i, float %tmp27.i.i) #1157  %tmp28.i.elt.i = extractvalue %float3 %tmp28.i.i, 0158  store float %tmp28.i.elt.i, ptr %tmp59.i, align 16159  %tmp28.i.elt2.i = extractvalue %float3 %tmp28.i.i, 1160  store float %tmp28.i.elt2.i, ptr %2, align 4161  %tmp28.i.elt4.i = extractvalue %float3 %tmp28.i.i, 2162  store float %tmp28.i.elt4.i, ptr %.repack3.i, align 8163  %tmp38.i.i = zext i8 %tmp10.i.i to i64164  %tmp39.i5.i = getelementptr inbounds [27 x %char3], ptr addrspace(4) @global, i64 0, i64 %tmp38.i.i165  %tmp39.i.i = addrspacecast ptr addrspace(4) %tmp39.i5.i to ptr166  %tmp43.i.i = load i8, ptr %tmp39.i.i, align 1167  %tmp44.i.i = sext i8 %tmp43.i.i to i32168  %tmp45.i.i = add nsw i32 %tmp41.i.i, %tmp44.i.i169  %tmp50.i.i = getelementptr inbounds %char3, ptr %tmp39.i.i, i64 0, i32 1170  %tmp51.i.i = load i8, ptr %tmp50.i.i, align 1171  %tmp52.i.i = sext i8 %tmp51.i.i to i32172  %tmp53.i.i = add nsw i32 %tmp49.i.i, %tmp52.i.i173  %tmp56.i.i = getelementptr inbounds %char3, ptr %tmp39.i.i, i64 0, i32 2174  %tmp57.i.i = load i8, ptr %tmp56.i.i, align 1175  %tmp58.i.i = sext i8 %tmp57.i.i to i32176  %tmp59.i.i = add nsw i32 %tmp55.i.i, %tmp58.i.i177  %tmp60.i.i = tail call %int3 @hoge(i32 %tmp45.i.i, i32 %tmp53.i.i, i32 %tmp59.i.i) #1178  %tmp62.i.i = load i32, ptr %tmp61.i.i, align 4179  store i32 %tmp62.i.i, ptr %tmp64.i, align 8180  %tmp20 = load i64, ptr %tmp18, align 8181  %tmp22 = getelementptr inbounds i8, ptr %tmp, i64 %tmp20182  %tmp24 = getelementptr inbounds i8, ptr %tmp22, i64 80183  %tmp25 = load i32, ptr %tmp24, align 4184  %tmp36 = load ptr, ptr %arg, align 8185  %tmp37 = zext i32 %tmp25 to i64186  %tmp38 = getelementptr inbounds %float4, ptr %tmp36, i64 %tmp37187  tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 undef, ptr align 1 %tmp38, i64 undef, i1 false)188  %tmp40 = getelementptr inbounds i8, ptr %tmp22, i64 48189  %tmp41 = getelementptr inbounds i8, ptr %tmp40, i64 8190  %tmp42 = load float, ptr %tmp41, align 4191  %tmp44 = load float, ptr inttoptr (i64 8 to ptr), align 8192  %tmp45 = fsub contract float %tmp42, %tmp44193  %tmp46 = tail call %float4 @snork(float %tmp45)194  %tmp.i = tail call i64 @foo()195  %tmp10.i = load i64, ptr %tmp9.i, align 16196  %tmp11.i = add i64 %tmp10.i, %tmp.i197  store i64 %tmp11.i, ptr %tmp9.i, align 16, !tbaa !1198  %tmp43.i = add i64 %tmp11.i, %tmp42.i199  %tmp44.i = getelementptr inbounds i16, ptr %tmp5, i64 %tmp43.i200  %tmp45.i = load i16, ptr %tmp44.i, align 2201  %tmp47.i = icmp eq i16 %tmp45.i, -1202  %extract21 = lshr i16 %tmp45.i, 11203  %extract.t22 = trunc i16 %extract21 to i8204  br i1 %tmp47.i, label %bb14, label %bb49.i, !llvm.loop !12205 206bb14:                                             ; preds = %bb49.i.lr.ph, %bb49.i, %bb207  ret void208}209 210attributes #0 = { argmemonly mustprogress nofree nounwind willreturn }211attributes #1 = { nounwind }212 213!1 = !{!2, !11, i64 64}214!2 = !{!"_ZTSN7cuneibs22neiblist_iterator_coreE", !3, i64 0, !3, i64 8, !6, i64 16, !8, i64 32, !9, i64 44, !10, i64 48, !11, i64 64, !9, i64 72, !4, i64 76, !9, i64 80}215!3 = !{!"any pointer", !4, i64 0}216!4 = !{!"omnipotent char", !5, i64 0}217!5 = !{!"Simple C++ TBAA"}218!6 = !{!"_ZTS6float4", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12}219!7 = !{!"float", !4, i64 0}220!8 = !{!"_ZTS4int3", !9, i64 0, !9, i64 4, !9, i64 8}221!9 = !{!"int", !4, i64 0}222!10 = !{!"_ZTS6float3", !7, i64 0, !7, i64 4, !7, i64 8}223!11 = !{!"long", !4, i64 0}224!12 = distinct !{!12, !13}225!13 = !{!"llvm.loop.peeled.count", i32 1}226