Files
TheRock/compiler/amd-llvm/llvm/test/CodeGen/Hexagon/expand-vecreduce-add.ll
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

144 lines
3.6 KiB
LLVM

; RUN: llc -mtriple=hexagon < %s | FileCheck %s
target triple = "hexagon"
define i32 @add_v32i32(<32 x i32> %vec) #0 {
; CHECK-LABEL: add_v32i32:
; CHECK: {
; CHECK: [[R0:v[0-9]+]] = valign([[_:v[0-9]+]],v0,{{.+}})
; CHECK: }
; CHECK: {
; CHECK: [[R1:v[0-9]+]].w = vadd(v0.w,[[R0]].w)
; CHECK: }
; CHECK: {
; CHECK: [[R2:v[0-9]+]] = valign([[_:v[0-9]+]],[[R1]],{{.+}})
; CHECK: }
; CHECK: {
; CHECK: [[R3:v[0-9]+]].w = vadd([[R1]].w,[[R2]].w)
; CHECK: }
; CHECK: {
; CHECK: [[R4:v[0-9]+]] = valign([[_:v[0-9]+]],[[R3]],{{.+}})
; CHECK: }
; CHECK: {
; CHECK: [[R5:v[0-9]+]].w = vadd([[R3]].w,[[R4]].w)
; CHECK: }
; CHECK: {
; CHECK: [[R6:v[0-9]+]] = valign([[_:v[0-9]+]],[[R5]],{{.+}})
; CHECK: }
; CHECK: {
; CHECK: [[R7:v[0-9]+]].w = vadd([[R5]].w,[[R6]].w)
; CHECK: }
; CHECK: {
; CHECK: [[R8:v[0-9]+]] = valign([[_:v[0-9]+]],[[R7]],{{.+}})
; CHECK: }
; CHECK: {
; CHECK: [[R9:v[0-9]+]].w = vadd([[R7]].w,[[R8]].w)
; CHECK: }
; CHECK: {
; CHECK: r0 = vextract([[R9]],{{.+}})
; CHECK: }
entry:
%r = call i32 @llvm.vector.reduce.add.v32i32(<32 x i32> %vec)
ret i32 %r
}
define i32 @add_v16i32(<16 x i32> %vec) #0 {
; CHECK-LABEL: add_v16i32:
; CHECK: {
; CHECK: [[R0:v[0-9]+]] = valign([[_:v[0-9]+]],v0,{{.+}})
; CHECK: }
; CHECK: {
; CHECK: [[R1:v[0-9]+]].w = vadd(v0.w,[[R0]].w)
; CHECK: }
; CHECK: {
; CHECK: [[R2:v[0-9]+]] = valign([[_:v[0-9]+]],[[R1]],{{.+}})
; CHECK: }
; CHECK: {
; CHECK: [[R3:v[0-9]+]].w = vadd([[R1]].w,[[R2]].w)
; CHECK: }
; CHECK: {
; CHECK: [[R4:v[0-9]+]] = valign([[_:v[0-9]+]],[[R3]],{{.+}})
; CHECK: }
; CHECK: {
; CHECK: [[R5:v[0-9]+]].w = vadd([[R3]].w,[[R4]].w)
; CHECK: }
; CHECK: {
; CHECK: [[R6:v[0-9]+]] = valign([[_:v[0-9]+]],[[R5]],{{.+}})
; CHECK: }
; CHECK: {
; CHECK: [[R7:v[0-9]+]].w = vadd([[R5]].w,[[R6]].w)
; CHECK: }
; CHECK: {
; CHECK: r0 = vextract([[R7]],{{.+}})
; CHECK: }
entry:
%r = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %vec)
ret i32 %r
}
define i32 @add_v8i32(<8 x i32> %vec) #0 {
; CHECK-LABEL: add_v8i32:
; CHECK: {
; CHECK: r[[RS1:[0-9]+:[0-9]+]] = vaddw(r1:0,r5:4)
; CHECK: r[[R6:[0-9]+:[0-9]+]] = memd(r29+#0)
; CHECK: }
; CHECK: {
; CHECK: r[[RS2:[0-9]+:[0-9]+]] = vaddw(r3:2,r[[R6]])
; CHECK: }
; CHECK: {
; CHECK: r[[RS3:[0-9]+:[0-9]+]] = vaddw(r[[RS1]],r[[RS2]])
; CHECK: }
; CHECK: {
;; TODO: combine and double register add can be optimized to single register add.
; CHECK: r[[RS4:[0-9]+:[0-9]+]] = combine(#0,r{{[0-9]+}})
; CHECK: }
; CHECK: {
; CHECK: r1:0 = vaddw(r[[RS3]],r[[RS4]])
entry:
%r = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %vec)
ret i32 %r
}
define i32 @add_v64i32(<64 x i32> %vec) #0 {
; CHECK-LABEL: add_v64i32:
; CHECK: vadd
; CHECK: valign
; CHECK: vadd
; CHECK: valign
; CHECK: vadd
; CHECK: valign
; CHECK: vadd
; CHECK: valign
; CHECK: vadd
; CHECK: valign
; CHECK: vadd
entry:
%r = call i32 @llvm.vector.reduce.add.v64i32(<64 x i32> %vec)
ret i32 %r
}
;; Non-pow2 vectors are scalarized.
define i32 @add_v12i32(<12 x i32> %vec) #0 {
; CHECK-LABEL: add_v12i32:
; CHECK: [[RS0:r[0-9]+]] = add(r0,r1)
; CHECK: [[RS1:r[0-9]+]] += add([[RS0]],r{{[0-9]+}})
; CHECK: [[RS2:r[0-9]+]] += add([[RS1]],r{{[0-9]+}})
; CHECK: [[RS3:r[0-9]+]] += add([[RS2]],r{{[0-9]+}})
; CHECK: [[RS4:r[0-9]+]] += add([[RS3]],r{{[0-9]+}})
; CHECK: [[RS5:r[0-9]+]] += add([[RS4]],r{{[0-9]+}})
entry:
%r = call i32 @llvm.vector.reduce.add.v12i32(<12 x i32> %vec)
ret i32 %r
}
define i32 @add_v3i32(<3 x i32> %vec) #0 {
; CHECK-LABEL: add_v3i32:
; CHECK: r{{[0-9]+}} += add(r{{[0-9]+}},r{{[0-9]+}})
entry:
%r = call i32 @llvm.vector.reduce.add.v3i32(<3 x i32> %vec)
ret i32 %r
}
attributes #0 = { nounwind readnone "target-cpu"="hexagonv68" "target-features"="+hvx,+hvx-length128b" }