| ; RUN: llc -march=hexagon -mhvx < %s | FileCheck %s |
| |
| ; Check that Hexagon Vector Combine do not create vmem for adjacent |
| ; loads less than 4. |
| |
| ; Test 1: We have three adjacent loads. By default, we won't produce vmem |
| ; for loads less than 4. |
| ; CHECK-LABEL: @foo1 |
| ; CHECK: vmemu( |
| ; CHECK-NOT: vmem( |
| |
| define <32 x i32> @foo1(ptr %iptr) #0 align 32 { |
| entry: |
| %0 = load <32 x i32>, ptr %iptr, align 1 |
| %add.ptr = getelementptr inbounds i8, ptr %iptr, i32 128 |
| %1 = load <32 x i32>, ptr %add.ptr, align 1 |
| %add.ptr2 = getelementptr inbounds i8, ptr %iptr, i32 256 |
| %2 = load <32 x i32>, ptr %add.ptr2, align 1 |
| %3 = tail call <64 x i32> @llvm.hexagon.V6.vcombine.128B(<32 x i32> %1, <32 x i32> %0) |
| %4 = tail call <32 x i32> @llvm.hexagon.V6.vconv.hf.qf32.128B(<64 x i32> %3) |
| %5 = tail call <64 x i32> @llvm.hexagon.V6.vcombine.128B(<32 x i32> %2, <32 x i32> %1) |
| %6 = tail call <32 x i32> @llvm.hexagon.V6.vconv.hf.qf32.128B(<64 x i32> %5) |
| %7 = tail call <64 x i32> @llvm.hexagon.V6.vcombine.128B(<32 x i32> %4, <32 x i32> %6) |
| %8 = tail call <32 x i32> @llvm.hexagon.V6.vconv.hf.qf32.128B(<64 x i32> %7) |
| ret <32 x i32> %8 |
| } |
| |
| ; Test 2: We have four adjacent loads. Thus, we will produce vmem. |
| ; CHECK-LABEL: @foo2 |
| ; CHECK: vmem( |
| ; CHECK-NOT: vmemu |
| |
| define <32 x i32> @foo2(ptr %iptr) #0 align 32 { |
| entry: |
| %0 = load <32 x i32>, ptr %iptr, align 1 |
| %add.ptr = getelementptr inbounds i8, ptr %iptr, i32 128 |
| %1 = load <32 x i32>, ptr %add.ptr, align 1 |
| %add.ptr2 = getelementptr inbounds i8, ptr %iptr, i32 256 |
| %2 = load <32 x i32>, ptr %add.ptr2, align 1 |
| %add.ptr4 = getelementptr inbounds i8, ptr %iptr, i32 512 |
| %3 = load <32 x i32>, ptr %add.ptr4, align 1 |
| %4 = tail call <64 x i32> @llvm.hexagon.V6.vcombine.128B(<32 x i32> %1, <32 x i32> %0) |
| %5 = tail call <32 x i32> @llvm.hexagon.V6.vconv.hf.qf32.128B(<64 x i32> %4) |
| %6 = tail call <64 x i32> @llvm.hexagon.V6.vcombine.128B(<32 x i32> %3, <32 x i32> %2) |
| %7 = tail call <32 x i32> @llvm.hexagon.V6.vconv.hf.qf32.128B(<64 x i32> %6) |
| %8 = tail call <64 x i32> @llvm.hexagon.V6.vcombine.128B(<32 x i32> %5, <32 x i32> %7) |
| %9 = tail call <32 x i32> @llvm.hexagon.V6.vconv.hf.qf32.128B(<64 x i32> %8) |
| ret <32 x i32> %9 |
| } |
| |
| declare <32 x i32> @llvm.hexagon.V6.vconv.hf.qf32.128B(<64 x i32>) #1 |
| declare <64 x i32> @llvm.hexagon.V6.vcombine.128B(<32 x i32>, <32 x i32>) #1 |
| attributes #0 = {"target-features"="+hvx-length128b,+hvxv75" } |