blob: 7147dc64ca124442961227e00c381430ffe1110a [file]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -mtriple=amdgpu9.50-amd-amdhsa -passes=slp-vectorizer \
; RUN: < %s | FileCheck -check-prefix=GFX950 %s
; RUN: opt -S -mtriple=amdgpu9.50-amd-amdhsa -passes=slp-vectorizer \
; RUN: -slp-inst-count-check=true < %s | FileCheck -check-prefix=GFX950 %s
; RUN: opt -S -mtriple=amdgpu9.42-amd-amdhsa -passes=slp-vectorizer \
; RUN: < %s | FileCheck -check-prefix=GFX942 %s
; RUN: opt -S -mtriple=amdgpu9.06-amd-amdhsa -passes=slp-vectorizer \
; RUN: < %s | FileCheck -check-prefix=GFX906 %s
; RUN: opt -S -mtriple=amdgpu9.06-amd-amdhsa -passes=slp-vectorizer \
; RUN: -slp-inst-count-check=false < %s | FileCheck -check-prefix=GFX906NOCOUNT %s
define amdgpu_kernel void @phi5_rotate(
; GFX950-LABEL: define amdgpu_kernel void @phi5_rotate(
; GFX950-SAME: ptr addrspace(1) captures(none) [[OUT:%.*]], i32 [[N:%.*]], i16 [[S0:%.*]], i16 [[S1:%.*]], i16 [[S2:%.*]], i16 [[S3:%.*]], i16 [[S4:%.*]]) {
; GFX950-NEXT: [[ENTRY:.*]]:
; GFX950-NEXT: br label %[[LOOP:.*]]
; GFX950: [[LOOP]]:
; GFX950-NEXT: [[I:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[I_NEXT:%.*]], %[[LOOP]] ]
; GFX950-NEXT: [[X0:%.*]] = phi i16 [ [[S0]], %[[ENTRY]] ], [ [[X4:%.*]], %[[LOOP]] ]
; GFX950-NEXT: [[X1:%.*]] = phi i16 [ [[S1]], %[[ENTRY]] ], [ [[X0]], %[[LOOP]] ]
; GFX950-NEXT: [[X2:%.*]] = phi i16 [ [[S2]], %[[ENTRY]] ], [ [[X1]], %[[LOOP]] ]
; GFX950-NEXT: [[X3:%.*]] = phi i16 [ [[S3]], %[[ENTRY]] ], [ [[X2]], %[[LOOP]] ]
; GFX950-NEXT: [[X4]] = phi i16 [ [[S4]], %[[ENTRY]] ], [ [[X3]], %[[LOOP]] ]
; GFX950-NEXT: [[GEP0:%.*]] = getelementptr i16, ptr addrspace(1) [[OUT]], i32 [[I]]
; GFX950-NEXT: [[TMP0:%.*]] = insertelement <2 x i16> poison, i16 [[X0]], i64 0
; GFX950-NEXT: [[TMP1:%.*]] = insertelement <2 x i16> [[TMP0]], i16 [[X1]], i64 1
; GFX950-NEXT: store <2 x i16> [[TMP1]], ptr addrspace(1) [[GEP0]], align 2
; GFX950-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 2
; GFX950-NEXT: [[CMP:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]
; GFX950-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
; GFX950: [[EXIT]]:
; GFX950-NEXT: ret void
;
; GFX942-LABEL: define amdgpu_kernel void @phi5_rotate(
; GFX942-SAME: ptr addrspace(1) captures(none) [[OUT:%.*]], i32 [[N:%.*]], i16 [[S0:%.*]], i16 [[S1:%.*]], i16 [[S2:%.*]], i16 [[S3:%.*]], i16 [[S4:%.*]]) {
; GFX942-NEXT: [[ENTRY:.*]]:
; GFX942-NEXT: br label %[[LOOP:.*]]
; GFX942: [[LOOP]]:
; GFX942-NEXT: [[I:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[I_NEXT:%.*]], %[[LOOP]] ]
; GFX942-NEXT: [[X0:%.*]] = phi i16 [ [[S0]], %[[ENTRY]] ], [ [[X4:%.*]], %[[LOOP]] ]
; GFX942-NEXT: [[X1:%.*]] = phi i16 [ [[S1]], %[[ENTRY]] ], [ [[X0]], %[[LOOP]] ]
; GFX942-NEXT: [[X2:%.*]] = phi i16 [ [[S2]], %[[ENTRY]] ], [ [[X1]], %[[LOOP]] ]
; GFX942-NEXT: [[X3:%.*]] = phi i16 [ [[S3]], %[[ENTRY]] ], [ [[X2]], %[[LOOP]] ]
; GFX942-NEXT: [[X4]] = phi i16 [ [[S4]], %[[ENTRY]] ], [ [[X3]], %[[LOOP]] ]
; GFX942-NEXT: [[GEP0:%.*]] = getelementptr i16, ptr addrspace(1) [[OUT]], i32 [[I]]
; GFX942-NEXT: [[TMP0:%.*]] = insertelement <2 x i16> poison, i16 [[X0]], i64 0
; GFX942-NEXT: [[TMP1:%.*]] = insertelement <2 x i16> [[TMP0]], i16 [[X1]], i64 1
; GFX942-NEXT: store <2 x i16> [[TMP1]], ptr addrspace(1) [[GEP0]], align 2
; GFX942-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 2
; GFX942-NEXT: [[CMP:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]
; GFX942-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
; GFX942: [[EXIT]]:
; GFX942-NEXT: ret void
;
; GFX906-LABEL: define amdgpu_kernel void @phi5_rotate(
; GFX906-SAME: ptr addrspace(1) captures(none) [[OUT:%.*]], i32 [[N:%.*]], i16 [[S0:%.*]], i16 [[S1:%.*]], i16 [[S2:%.*]], i16 [[S3:%.*]], i16 [[S4:%.*]]) {
; GFX906-NEXT: [[ENTRY:.*]]:
; GFX906-NEXT: br label %[[LOOP:.*]]
; GFX906: [[LOOP]]:
; GFX906-NEXT: [[I:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[I_NEXT:%.*]], %[[LOOP]] ]
; GFX906-NEXT: [[X0:%.*]] = phi i16 [ [[S0]], %[[ENTRY]] ], [ [[X4:%.*]], %[[LOOP]] ]
; GFX906-NEXT: [[X1:%.*]] = phi i16 [ [[S1]], %[[ENTRY]] ], [ [[X0]], %[[LOOP]] ]
; GFX906-NEXT: [[X2:%.*]] = phi i16 [ [[S2]], %[[ENTRY]] ], [ [[X1]], %[[LOOP]] ]
; GFX906-NEXT: [[X3:%.*]] = phi i16 [ [[S3]], %[[ENTRY]] ], [ [[X2]], %[[LOOP]] ]
; GFX906-NEXT: [[X4]] = phi i16 [ [[S4]], %[[ENTRY]] ], [ [[X3]], %[[LOOP]] ]
; GFX906-NEXT: [[GEP0:%.*]] = getelementptr i16, ptr addrspace(1) [[OUT]], i32 [[I]]
; GFX906-NEXT: store i16 [[X0]], ptr addrspace(1) [[GEP0]], align 2
; GFX906-NEXT: [[I1:%.*]] = or disjoint i32 [[I]], 1
; GFX906-NEXT: [[GEP1:%.*]] = getelementptr i16, ptr addrspace(1) [[OUT]], i32 [[I1]]
; GFX906-NEXT: store i16 [[X1]], ptr addrspace(1) [[GEP1]], align 2
; GFX906-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 2
; GFX906-NEXT: [[CMP:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]
; GFX906-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
; GFX906: [[EXIT]]:
; GFX906-NEXT: ret void
;
; GFX906NOCOUNT-LABEL: define amdgpu_kernel void @phi5_rotate(
; GFX906NOCOUNT-SAME: ptr addrspace(1) captures(none) [[OUT:%.*]], i32 [[N:%.*]], i16 [[S0:%.*]], i16 [[S1:%.*]], i16 [[S2:%.*]], i16 [[S3:%.*]], i16 [[S4:%.*]]) {
; GFX906NOCOUNT-NEXT: [[ENTRY:.*]]:
; GFX906NOCOUNT-NEXT: br label %[[LOOP:.*]]
; GFX906NOCOUNT: [[LOOP]]:
; GFX906NOCOUNT-NEXT: [[I:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[I_NEXT:%.*]], %[[LOOP]] ]
; GFX906NOCOUNT-NEXT: [[X0:%.*]] = phi i16 [ [[S0]], %[[ENTRY]] ], [ [[X4:%.*]], %[[LOOP]] ]
; GFX906NOCOUNT-NEXT: [[X1:%.*]] = phi i16 [ [[S1]], %[[ENTRY]] ], [ [[X0]], %[[LOOP]] ]
; GFX906NOCOUNT-NEXT: [[X2:%.*]] = phi i16 [ [[S2]], %[[ENTRY]] ], [ [[X1]], %[[LOOP]] ]
; GFX906NOCOUNT-NEXT: [[X3:%.*]] = phi i16 [ [[S3]], %[[ENTRY]] ], [ [[X2]], %[[LOOP]] ]
; GFX906NOCOUNT-NEXT: [[X4]] = phi i16 [ [[S4]], %[[ENTRY]] ], [ [[X3]], %[[LOOP]] ]
; GFX906NOCOUNT-NEXT: [[GEP0:%.*]] = getelementptr i16, ptr addrspace(1) [[OUT]], i32 [[I]]
; GFX906NOCOUNT-NEXT: [[TMP0:%.*]] = insertelement <2 x i16> poison, i16 [[X0]], i64 0
; GFX906NOCOUNT-NEXT: [[TMP1:%.*]] = insertelement <2 x i16> [[TMP0]], i16 [[X1]], i64 1
; GFX906NOCOUNT-NEXT: store <2 x i16> [[TMP1]], ptr addrspace(1) [[GEP0]], align 2
; GFX906NOCOUNT-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 2
; GFX906NOCOUNT-NEXT: [[CMP:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]
; GFX906NOCOUNT-NEXT: br i1 [[CMP]], label %[[LOOP]], label %[[EXIT:.*]]
; GFX906NOCOUNT: [[EXIT]]:
; GFX906NOCOUNT-NEXT: ret void
;
ptr addrspace(1) nocapture %out,
i32 %n,
i16 %s0, i16 %s1, i16 %s2, i16 %s3, i16 %s4) {
entry:
br label %loop
loop:
%i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
%x0 = phi i16 [ %s0, %entry ], [ %x4, %loop ]
%x1 = phi i16 [ %s1, %entry ], [ %x0, %loop ]
%x2 = phi i16 [ %s2, %entry ], [ %x1, %loop ]
%x3 = phi i16 [ %s3, %entry ], [ %x2, %loop ]
%x4 = phi i16 [ %s4, %entry ], [ %x3, %loop ]
%gep0 = getelementptr i16, ptr addrspace(1) %out, i32 %i
store i16 %x0, ptr addrspace(1) %gep0, align 2
%i1 = or disjoint i32 %i, 1
%gep1 = getelementptr i16, ptr addrspace(1) %out, i32 %i1
store i16 %x1, ptr addrspace(1) %gep1, align 2
%i.next = add nuw i32 %i, 2
%cmp = icmp ult i32 %i.next, %n
br i1 %cmp, label %loop, label %exit
exit:
ret void
}