The mask doesn't really affect the reverse. It only poisons the masked off elements in the results. It should be ok to ignore the mask if we can eliminate the pair. I don't have a specific use case for this, but it matches what I had implemented in our downstream before the current upstream implementation. Submitting upstream so I can remove the delta in my downstream.
80 lines
4.2 KiB
LLVM
80 lines
4.2 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
|
|
|
|
define <vscale x 4 x i32> @rev_of_rev(<vscale x 4 x i32> %a, i32 %evl) {
|
|
; CHECK-LABEL: @rev_of_rev(
|
|
; CHECK-NEXT: ret <vscale x 4 x i32> [[A:%.*]]
|
|
;
|
|
%a.rev = tail call <vscale x 4 x i32> @llvm.experimental.vp.reverse(<vscale x 4 x i32> %a, <vscale x 4 x i1> splat (i1 true), i32 %evl)
|
|
%res = tail call <vscale x 4 x i32> @llvm.experimental.vp.reverse(<vscale x 4 x i32> %a.rev, <vscale x 4 x i1> splat (i1 true), i32 %evl)
|
|
ret <vscale x 4 x i32> %res
|
|
}
|
|
|
|
define <vscale x 4 x i32> @rev_of_rev_diffevl(<vscale x 4 x i32> %a, i32 %evl) {
|
|
; CHECK-LABEL: @rev_of_rev_diffevl(
|
|
; CHECK-NEXT: [[A_REV:%.*]] = tail call <vscale x 4 x i32> @llvm.experimental.vp.reverse.nxv4i32(<vscale x 4 x i32> [[A:%.*]], <vscale x 4 x i1> splat (i1 true), i32 [[EVL:%.*]])
|
|
; CHECK-NEXT: [[RES:%.*]] = tail call <vscale x 4 x i32> @llvm.experimental.vp.reverse.nxv4i32(<vscale x 4 x i32> [[A_REV]], <vscale x 4 x i1> splat (i1 true), i32 10)
|
|
; CHECK-NEXT: ret <vscale x 4 x i32> [[RES]]
|
|
;
|
|
%a.rev = tail call <vscale x 4 x i32> @llvm.experimental.vp.reverse(<vscale x 4 x i32> %a, <vscale x 4 x i1> splat (i1 true), i32 %evl)
|
|
%res = tail call <vscale x 4 x i32> @llvm.experimental.vp.reverse(<vscale x 4 x i32> %a.rev, <vscale x 4 x i1> splat (i1 true), i32 10)
|
|
ret <vscale x 4 x i32> %res
|
|
}
|
|
|
|
define <vscale x 4 x i32> @rev_of_poison(i32 %evl) {
|
|
; CHECK-LABEL: @rev_of_poison(
|
|
; CHECK-NEXT: ret <vscale x 4 x i32> poison
|
|
;
|
|
%rev = tail call <vscale x 4 x i32> @llvm.experimental.vp.reverse(<vscale x 4 x i32> poison, <vscale x 4 x i1> splat (i1 true), i32 %evl)
|
|
ret <vscale x 4 x i32> %rev
|
|
}
|
|
|
|
define <vscale x 4 x i32> @rev_of_undef(i32 %evl) {
|
|
; CHECK-LABEL: @rev_of_undef(
|
|
; CHECK-NEXT: ret <vscale x 4 x i32> undef
|
|
;
|
|
%rev = tail call <vscale x 4 x i32> @llvm.experimental.vp.reverse(<vscale x 4 x i32> undef, <vscale x 4 x i1> splat (i1 true), i32 %evl)
|
|
ret <vscale x 4 x i32> %rev
|
|
}
|
|
|
|
define <vscale x 4 x i32> @rev_of_zero(i32 %evl) {
|
|
; CHECK-LABEL: @rev_of_zero(
|
|
; CHECK-NEXT: ret <vscale x 4 x i32> zeroinitializer
|
|
;
|
|
%rev = tail call <vscale x 4 x i32> @llvm.experimental.vp.reverse(<vscale x 4 x i32> zeroinitializer, <vscale x 4 x i1> splat (i1 true), i32 %evl)
|
|
ret <vscale x 4 x i32> %rev
|
|
}
|
|
|
|
define <vscale x 4 x i32> @rev_of_splat(i32 %a, i32 %evl) {
|
|
; CHECK-LABEL: @rev_of_splat(
|
|
; CHECK-NEXT: [[A_INS:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[A:%.*]], i32 0
|
|
; CHECK-NEXT: [[A_VEC:%.*]] = shufflevector <vscale x 4 x i32> [[A_INS]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
|
|
; CHECK-NEXT: ret <vscale x 4 x i32> [[A_VEC]]
|
|
;
|
|
%a.ins = insertelement <vscale x 4 x i32> poison, i32 %a, i32 0
|
|
%a.vec = shufflevector <vscale x 4 x i32> %a.ins, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
|
|
%rev = tail call <vscale x 4 x i32> @llvm.experimental.vp.reverse(<vscale x 4 x i32> %a.vec, <vscale x 4 x i1> splat (i1 true), i32 %evl)
|
|
ret <vscale x 4 x i32> %rev
|
|
}
|
|
|
|
define <vscale x 4 x i32> @rev_of_splat2(i32 %a, <vscale x 4 x i1> %m, i32 %evl) {
|
|
; CHECK-LABEL: @rev_of_splat2(
|
|
; CHECK-NEXT: [[A_INS:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[A:%.*]], i32 0
|
|
; CHECK-NEXT: [[A_VEC:%.*]] = shufflevector <vscale x 4 x i32> [[A_INS]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
|
|
; CHECK-NEXT: ret <vscale x 4 x i32> [[A_VEC]]
|
|
;
|
|
%a.ins = insertelement <vscale x 4 x i32> poison, i32 %a, i32 0
|
|
%a.vec = shufflevector <vscale x 4 x i32> %a.ins, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
|
|
%rev = tail call <vscale x 4 x i32> @llvm.experimental.vp.reverse(<vscale x 4 x i32> %a.vec, <vscale x 4 x i1> %m, i32 %evl)
|
|
ret <vscale x 4 x i32> %rev
|
|
}
|
|
|
|
define <vscale x 4 x i32> @rev_of_rev_diffmask(<vscale x 4 x i32> %a, <vscale x 4 x i1> %mask1, <vscale x 4 x i1> %mask2, i32 %evl) {
|
|
; CHECK-LABEL: @rev_of_rev_diffmask(
|
|
; CHECK-NEXT: ret <vscale x 4 x i32> [[RES:%.*]]
|
|
;
|
|
%a.rev = tail call <vscale x 4 x i32> @llvm.experimental.vp.reverse(<vscale x 4 x i32> %a, <vscale x 4 x i1> %mask1, i32 %evl)
|
|
%res = tail call <vscale x 4 x i32> @llvm.experimental.vp.reverse(<vscale x 4 x i32> %a.rev, <vscale x 4 x i1> %mask2, i32 %evl)
|
|
ret <vscale x 4 x i32> %res
|
|
}
|