brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.4 KiB · 15d67be Raw
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