248 lines · plain
1; RUN: llc -mtriple=hexagon -O2 -mcpu=hexagonv60 -mattr=+hvxv60,hvx-length64b < %s | FileCheck %s2 3; CHECK: vasr(v{{[0-9]+}}.h,v{{[0-9]+}}.h,r{{[0-7]+}}):sat4 5target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-v64:64:64-v32:32:32-a:0-n16:32"6target triple = "hexagon-unknown--elf"7 8%struct.buffer_t = type { i64, ptr, [4 x i32], [4 x i32], [4 x i32], i32, i8, i8, [6 x i8] }9 10; Function Attrs: norecurse nounwind11define i32 @__test_vasr(ptr noalias nocapture %f.buffer, ptr noalias nocapture %g.buffer, ptr noalias nocapture %res.buffer) #0 {12entry:13 %buf_host = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 114 %f.host = load ptr, ptr %buf_host, align 415 %buf_dev = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 016 %f.dev = load i64, ptr %buf_dev, align 817 %0 = icmp eq ptr %f.host, null18 %1 = icmp eq i64 %f.dev, 019 %f.host_and_dev_are_null = and i1 %0, %120 %buf_min = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 4, i32 021 %f.min.0 = load i32, ptr %buf_min, align 422 %buf_host10 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 123 %g.host = load ptr, ptr %buf_host10, align 424 %buf_dev11 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 025 %g.dev = load i64, ptr %buf_dev11, align 826 %2 = icmp eq ptr %g.host, null27 %3 = icmp eq i64 %g.dev, 028 %g.host_and_dev_are_null = and i1 %2, %329 %buf_min22 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 4, i32 030 %g.min.0 = load i32, ptr %buf_min22, align 431 %buf_host27 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 132 %res.host = load ptr, ptr %buf_host27, align 433 %buf_dev28 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 034 %res.dev = load i64, ptr %buf_dev28, align 835 %4 = icmp eq ptr %res.host, null36 %5 = icmp eq i64 %res.dev, 037 %res.host_and_dev_are_null = and i1 %4, %538 %buf_extent31 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 2, i32 039 %res.extent.0 = load i32, ptr %buf_extent31, align 440 %buf_min39 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 4, i32 041 %res.min.0 = load i32, ptr %buf_min39, align 442 %6 = add nsw i32 %res.extent.0, -143 %7 = and i32 %6, -6444 %8 = add i32 %res.min.0, 6345 %9 = add i32 %8, %746 %10 = add nsw i32 %res.min.0, %res.extent.047 %11 = add nsw i32 %10, -148 %12 = icmp slt i32 %9, %1149 %13 = select i1 %12, i32 %9, i32 %1150 %14 = add nsw i32 %10, -6451 %15 = icmp slt i32 %res.min.0, %1452 %16 = select i1 %15, i32 %res.min.0, i32 %1453 %f.extent.0.required.s = sub nsw i32 %13, %1654 br i1 %f.host_and_dev_are_null, label %true_bb, label %after_bb55 56true_bb: ; preds = %entry57 %buf_elem_size44 = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 558 store i32 1, ptr %buf_elem_size44, align 459 store i32 %16, ptr %buf_min, align 460 %17 = add nsw i32 %f.extent.0.required.s, 161 %buf_extent46 = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 2, i32 062 store i32 %17, ptr %buf_extent46, align 463 %buf_stride47 = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 3, i32 064 store i32 1, ptr %buf_stride47, align 465 %buf_min48 = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 4, i32 166 store i32 0, ptr %buf_min48, align 467 %buf_extent49 = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 2, i32 168 store i32 0, ptr %buf_extent49, align 469 %buf_stride50 = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 3, i32 170 store i32 0, ptr %buf_stride50, align 471 %buf_min51 = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 4, i32 272 store i32 0, ptr %buf_min51, align 473 %buf_extent52 = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 2, i32 274 store i32 0, ptr %buf_extent52, align 475 %buf_stride53 = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 3, i32 276 store i32 0, ptr %buf_stride53, align 477 %buf_min54 = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 4, i32 378 store i32 0, ptr %buf_min54, align 479 %buf_extent55 = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 2, i32 380 store i32 0, ptr %buf_extent55, align 481 %buf_stride56 = getelementptr inbounds %struct.buffer_t, ptr %f.buffer, i32 0, i32 3, i32 382 store i32 0, ptr %buf_stride56, align 483 br label %after_bb84 85after_bb: ; preds = %true_bb, %entry86 br i1 %g.host_and_dev_are_null, label %true_bb57, label %after_bb5987 88true_bb57: ; preds = %after_bb89 %buf_elem_size60 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 590 store i32 1, ptr %buf_elem_size60, align 491 store i32 %16, ptr %buf_min22, align 492 %18 = add nsw i32 %f.extent.0.required.s, 193 %buf_extent62 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 2, i32 094 store i32 %18, ptr %buf_extent62, align 495 %buf_stride63 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 3, i32 096 store i32 1, ptr %buf_stride63, align 497 %buf_min64 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 4, i32 198 store i32 0, ptr %buf_min64, align 499 %buf_extent65 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 2, i32 1100 store i32 0, ptr %buf_extent65, align 4101 %buf_stride66 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 3, i32 1102 store i32 0, ptr %buf_stride66, align 4103 %buf_min67 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 4, i32 2104 store i32 0, ptr %buf_min67, align 4105 %buf_extent68 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 2, i32 2106 store i32 0, ptr %buf_extent68, align 4107 %buf_stride69 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 3, i32 2108 store i32 0, ptr %buf_stride69, align 4109 %buf_min70 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 4, i32 3110 store i32 0, ptr %buf_min70, align 4111 %buf_extent71 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 2, i32 3112 store i32 0, ptr %buf_extent71, align 4113 %buf_stride72 = getelementptr inbounds %struct.buffer_t, ptr %g.buffer, i32 0, i32 3, i32 3114 store i32 0, ptr %buf_stride72, align 4115 br label %after_bb59116 117after_bb59: ; preds = %true_bb57, %after_bb118 br i1 %res.host_and_dev_are_null, label %after_bb75.thread, label %after_bb75119 120after_bb75.thread: ; preds = %after_bb59121 %buf_elem_size76 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 5122 store i32 1, ptr %buf_elem_size76, align 4123 store i32 %16, ptr %buf_min39, align 4124 %19 = add nsw i32 %f.extent.0.required.s, 1125 store i32 %19, ptr %buf_extent31, align 4126 %buf_stride79 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 3, i32 0127 store i32 1, ptr %buf_stride79, align 4128 %buf_min80 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 4, i32 1129 store i32 0, ptr %buf_min80, align 4130 %buf_extent81 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 2, i32 1131 store i32 0, ptr %buf_extent81, align 4132 %buf_stride82 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 3, i32 1133 store i32 0, ptr %buf_stride82, align 4134 %buf_min83 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 4, i32 2135 store i32 0, ptr %buf_min83, align 4136 %buf_extent84 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 2, i32 2137 store i32 0, ptr %buf_extent84, align 4138 %buf_stride85 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 3, i32 2139 store i32 0, ptr %buf_stride85, align 4140 %buf_min86 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 4, i32 3141 store i32 0, ptr %buf_min86, align 4142 %buf_extent87 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 2, i32 3143 store i32 0, ptr %buf_extent87, align 4144 %buf_stride88 = getelementptr inbounds %struct.buffer_t, ptr %res.buffer, i32 0, i32 3, i32 3145 store i32 0, ptr %buf_stride88, align 4146 br label %destructor_block147 148after_bb75: ; preds = %after_bb59149 %20 = or i1 %f.host_and_dev_are_null, %g.host_and_dev_are_null150 br i1 %20, label %destructor_block, label %"produce res"151 152"produce res": ; preds = %after_bb75153 %21 = ashr i32 %res.extent.0, 6154 %22 = icmp sgt i32 %21, 0155 br i1 %22, label %"for res.s0.x.x", label %"end for res.s0.x.x", !prof !4156 157"for res.s0.x.x": ; preds = %"for res.s0.x.x", %"produce res"158 %res.s0.x.x = phi i32 [ %41, %"for res.s0.x.x" ], [ 0, %"produce res" ]159 %23 = shl nsw i32 %res.s0.x.x, 6160 %24 = add nsw i32 %23, %res.min.0161 %25 = sub nsw i32 %24, %f.min.0162 %26 = getelementptr inbounds i8, ptr %f.host, i32 %25163 %27 = bitcast ptr %26 to ptr164 %28 = load <16 x i32>, ptr %27, align 1, !tbaa !5165 %29 = tail call <32 x i32> @llvm.hexagon.V6.vzb(<16 x i32> %28)166 %30 = sub nsw i32 %24, %g.min.0167 %31 = getelementptr inbounds i8, ptr %g.host, i32 %30168 %32 = bitcast ptr %31 to ptr169 %33 = load <16 x i32>, ptr %32, align 1, !tbaa !8170 %34 = tail call <32 x i32> @llvm.hexagon.V6.vzb(<16 x i32> %33)171 %35 = tail call <32 x i32> @llvm.hexagon.V6.vaddh.dv(<32 x i32> %29, <32 x i32> %34)172 %36 = tail call <16 x i32> @llvm.hexagon.V6.hi(<32 x i32> %35)173 %37 = tail call <16 x i32> @llvm.hexagon.V6.lo(<32 x i32> %35)174 %38 = tail call <16 x i32> @llvm.hexagon.V6.vasrhubsat(<16 x i32> %36, <16 x i32> %37, i32 4)175 %39 = getelementptr inbounds i8, ptr %res.host, i32 %23176 %40 = bitcast ptr %39 to ptr177 store <16 x i32> %38, ptr %40, align 1, !tbaa !10178 %41 = add nuw nsw i32 %res.s0.x.x, 1179 %42 = icmp eq i32 %41, %21180 br i1 %42, label %"end for res.s0.x.x", label %"for res.s0.x.x"181 182"end for res.s0.x.x": ; preds = %"for res.s0.x.x", %"produce res"183 %43 = add nsw i32 %res.extent.0, 63184 %44 = ashr i32 %43, 6185 %45 = icmp sgt i32 %44, %21186 br i1 %45, label %"for res.s0.x.x92.preheader", label %destructor_block, !prof !4187 188"for res.s0.x.x92.preheader": ; preds = %"end for res.s0.x.x"189 %46 = sub i32 -64, %f.min.0190 %47 = add i32 %46, %10191 %48 = getelementptr inbounds i8, ptr %f.host, i32 %47192 %49 = bitcast ptr %48 to ptr193 %50 = load <16 x i32>, ptr %49, align 1194 %51 = tail call <32 x i32> @llvm.hexagon.V6.vzb(<16 x i32> %50)195 %52 = sub i32 -64, %g.min.0196 %53 = add i32 %52, %10197 %54 = getelementptr inbounds i8, ptr %g.host, i32 %53198 %55 = bitcast ptr %54 to ptr199 %56 = load <16 x i32>, ptr %55, align 1200 %57 = tail call <32 x i32> @llvm.hexagon.V6.vzb(<16 x i32> %56)201 %58 = tail call <32 x i32> @llvm.hexagon.V6.vaddh.dv(<32 x i32> %51, <32 x i32> %57)202 %59 = tail call <16 x i32> @llvm.hexagon.V6.lo(<32 x i32> %58)203 %60 = add nsw i32 %res.extent.0, -64204 %61 = getelementptr inbounds i8, ptr %res.host, i32 %60205 %62 = tail call <16 x i32> @llvm.hexagon.V6.hi(<32 x i32> %58)206 %63 = tail call <16 x i32> @llvm.hexagon.V6.vasrhubsat(<16 x i32> %62, <16 x i32> %59, i32 4)207 %64 = bitcast ptr %61 to ptr208 store <16 x i32> %63, ptr %64, align 1, !tbaa !10209 br label %destructor_block210 211destructor_block: ; preds = %"for res.s0.x.x92.preheader", %"end for res.s0.x.x", %after_bb75, %after_bb75.thread212 ret i32 0213}214 215; Function Attrs: nounwind readnone216declare <32 x i32> @llvm.hexagon.V6.vaddh.dv(<32 x i32>, <32 x i32>) #1217 218; Function Attrs: nounwind readnone219declare <32 x i32> @llvm.hexagon.V6.vzb(<16 x i32>) #1220 221; Function Attrs: nounwind readnone222declare <16 x i32> @llvm.hexagon.V6.hi(<32 x i32>) #1223 224; Function Attrs: nounwind readnone225declare <16 x i32> @llvm.hexagon.V6.lo(<32 x i32>) #1226 227; Function Attrs: nounwind readnone228declare <16 x i32> @llvm.hexagon.V6.vasrhubsat(<16 x i32>, <16 x i32>, i32) #1229 230attributes #0 = { norecurse nounwind }231attributes #1 = { nounwind readnone }232 233!llvm.ident = !{!0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0}234!llvm.module.flags = !{!1, !2, !3}235 236!0 = !{!"Clang $LLVM_VERSION_MAJOR.$LLVM_VERSION_MINOR (based on LLVM 3.8.0)"}237!1 = !{i32 2, !"halide_use_soft_float_abi", i32 0}238!2 = !{i32 2, !"halide_mcpu", !"hexagonv60"}239!3 = !{i32 2, !"halide_mattrs", !"+hvx"}240!4 = !{!"branch_weights", i32 1073741824, i32 0}241!5 = !{!6, !6, i64 0}242!6 = !{!"f", !7}243!7 = !{!"Halide buffer"}244!8 = !{!9, !9, i64 0}245!9 = !{!"g", !7}246!10 = !{!11, !11, i64 0}247!11 = !{!"res", !7}248