Files
clang-p2996/llvm/test/Transforms/InstSimplify/ConstProp/extractelement-vscale.ll
Caroline Concatto 3c1f0e9ef8 [InstSimplify] Add constant fold for extractelement + splat for scalable vectors
This patch allows that scalable vector can fold extractelement and constant splat
only when the lane index is lower than the minimum number of elements of the vector.

Differential Revision: https://reviews.llvm.org/D103180
2021-06-10 12:41:40 +01:00

46 lines
2.0 KiB
LLVM

; RUN: opt -S -instsimplify < %s | FileCheck %s
; CHECK-LABEL: definitely_in_bounds
; CHECK: ret i8 0
define i8 @definitely_in_bounds() {
ret i8 extractelement (<vscale x 16 x i8> zeroinitializer, i64 15)
}
; CHECK-LABEL: maybe_in_bounds
; CHECK: ret i8 extractelement (<vscale x 16 x i8> zeroinitializer, i64 16)
define i8 @maybe_in_bounds() {
ret i8 extractelement (<vscale x 16 x i8> zeroinitializer, i64 16)
}
; Examples of extracting a lane from a splat constant
define i32 @extractconstant_shuffle_in_range(i32 %v) {
; CHECK-LABEL: @extractconstant_shuffle_in_range(
; CHECK-NEXT: ret i32 1024
;
%in = insertelement <vscale x 4 x i32> undef, i32 1024, i32 0
%splat = shufflevector <vscale x 4 x i32> %in, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
%r = extractelement <vscale x 4 x i32> %splat, i32 1
ret i32 %r
}
define i32 @extractconstant_shuffle_maybe_out_of_range(i32 %v) {
; CHECK-LABEL: @extractconstant_shuffle_maybe_out_of_range(
; CHECK-NEXT: ret i32 extractelement (<vscale x 4 x i32> shufflevector (<vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1024, i32 0), <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer), i32 4)
;
%in = insertelement <vscale x 4 x i32> undef, i32 1024, i32 0
%splat = shufflevector <vscale x 4 x i32> %in, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
%r = extractelement <vscale x 4 x i32> %splat, i32 4
ret i32 %r
}
define i32 @extractconstant_shuffle_invalid_index(i32 %v) {
; CHECK-LABEL: @extractconstant_shuffle_invalid_index(
; CHECK-NEXT: ret i32 extractelement (<vscale x 4 x i32> shufflevector (<vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1024, i32 0), <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer), i32 -1)
;
%in = insertelement <vscale x 4 x i32> undef, i32 1024, i32 0
%splat = shufflevector <vscale x 4 x i32> %in, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
%r = extractelement <vscale x 4 x i32> %splat, i32 -1
ret i32 %r
}