2020-03-12 06:09:01 +08:00
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -instsimplify -S -verify | FileCheck %s
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Vector Operations
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; insertelement
define < v s c a l e x 4 x i32 > @insertelement_idx_undef ( < v s c a l e x 4 x i32 > %a ) {
; CHECK-LABEL: @insertelement_idx_undef(
2021-01-03 23:05:08 +08:00
; CHECK-NEXT: ret <vscale x 4 x i32> poison
2020-03-12 06:09:01 +08:00
;
%r = insertelement < v s c a l e x 4 x i32 > %a , i32 5 , i64 undef
ret < v s c a l e x 4 x i32 > %r
}
define < v s c a l e x 4 x i32 > @insertelement_value_undef ( < v s c a l e x 4 x i32 > %a ) {
; CHECK-LABEL: @insertelement_value_undef(
2020-05-01 22:06:02 +08:00
; CHECK-NEXT: [[R:%.*]] = insertelement <vscale x 4 x i32> [[A:%.*]], i32 undef, i64 0
; CHECK-NEXT: ret <vscale x 4 x i32> [[R]]
2020-03-12 06:09:01 +08:00
;
%r = insertelement < v s c a l e x 4 x i32 > %a , i32 undef , i64 0
ret < v s c a l e x 4 x i32 > %r
}
define < v s c a l e x 4 x i32 > @insertelement_idx_maybe_out_of_bound ( < v s c a l e x 4 x i32 > %a ) {
; CHECK-LABEL: @insertelement_idx_maybe_out_of_bound(
; CHECK-NEXT: [[R:%.*]] = insertelement <vscale x 4 x i32> [[A:%.*]], i32 5, i64 4
; CHECK-NEXT: ret <vscale x 4 x i32> [[R]]
;
%r = insertelement < v s c a l e x 4 x i32 > %a , i32 5 , i64 4
ret < v s c a l e x 4 x i32 > %r
}
define < v s c a l e x 4 x i32 > @insertelement_idx_large_bound ( < v s c a l e x 4 x i32 > %a ) {
; CHECK-LABEL: @insertelement_idx_large_bound(
; CHECK-NEXT: [[R:%.*]] = insertelement <vscale x 4 x i32> [[A:%.*]], i32 5, i64 12345
; CHECK-NEXT: ret <vscale x 4 x i32> [[R]]
;
%r = insertelement < v s c a l e x 4 x i32 > %a , i32 5 , i64 12345
ret < v s c a l e x 4 x i32 > %r
}
define < v s c a l e x 4 x i32 > @insert_extract_element_same_vec_idx_1 ( < v s c a l e x 4 x i32 > %a ) {
; CHECK-LABEL: @insert_extract_element_same_vec_idx_1(
; CHECK-NEXT: ret <vscale x 4 x i32> [[A:%.*]]
;
%v = extractelement < v s c a l e x 4 x i32 > %a , i64 1
%r = insertelement < v s c a l e x 4 x i32 > %a , i32 %v , i64 1
ret < v s c a l e x 4 x i32 > %r
}
2020-08-11 03:53:30 +08:00
define < v s c a l e x 4 x i32 > @insertelement_inline_to_ret ( ) {
; CHECK-LABEL: @insertelement_inline_to_ret(
; CHECK-NEXT: ret <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1, i32 0)
;
%i = insertelement < v s c a l e x 4 x i32 > undef , i32 1 , i32 0
ret < v s c a l e x 4 x i32 > %i
}
define < v s c a l e x 4 x i32 > @insertelement_shufflevector_inline_to_ret ( ) {
; CHECK-LABEL: @insertelement_shufflevector_inline_to_ret(
; CHECK-NEXT: ret <vscale x 4 x i32> shufflevector (<vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1, i32 0), <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer)
;
%i = insertelement < v s c a l e x 4 x i32 > undef , i32 1 , i32 0
%i2 = shufflevector < v s c a l e x 4 x i32 > %i , < v s c a l e x 4 x i32 > undef , < v s c a l e x 4 x i32 > zeroinitializer
ret < v s c a l e x 4 x i32 > %i2
}
2020-03-12 06:09:01 +08:00
; extractelement
define i32 @extractelement_idx_undef ( < v s c a l e x 4 x i32 > %a ) {
; CHECK-LABEL: @extractelement_idx_undef(
2021-01-04 01:05:33 +08:00
; CHECK-NEXT: ret i32 poison
2020-03-12 06:09:01 +08:00
;
%r = extractelement < v s c a l e x 4 x i32 > %a , i64 undef
ret i32 %r
}
define i32 @extractelement_vec_undef ( < v s c a l e x 4 x i32 > %a ) {
; CHECK-LABEL: @extractelement_vec_undef(
; CHECK-NEXT: ret i32 undef
;
%r = extractelement < v s c a l e x 4 x i32 > undef , i64 1
ret i32 %r
}
define i32 @extractelement_idx_maybe_out_of_bound ( < v s c a l e x 4 x i32 > %a ) {
; CHECK-LABEL: @extractelement_idx_maybe_out_of_bound(
; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x i32> [[A:%.*]], i64 4
; CHECK-NEXT: ret i32 [[R]]
;
%r = extractelement < v s c a l e x 4 x i32 > %a , i64 4
ret i32 %r
}
define i32 @extractelement_idx_large_bound ( < v s c a l e x 4 x i32 > %a ) {
; CHECK-LABEL: @extractelement_idx_large_bound(
; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x i32> [[A:%.*]], i64 12345
; CHECK-NEXT: ret i32 [[R]]
;
%r = extractelement < v s c a l e x 4 x i32 > %a , i64 12345
ret i32 %r
}
2020-08-11 04:55:45 +08:00
define i32 @insert_extract_element_same_vec_idx_2 ( ) {
2020-03-12 06:09:01 +08:00
; CHECK-LABEL: @insert_extract_element_same_vec_idx_2(
; CHECK-NEXT: ret i32 1
;
%v = insertelement < v s c a l e x 4 x i32 > undef , i32 1 , i64 4
%r = extractelement < v s c a l e x 4 x i32 > %v , i64 4
ret i32 %r
}
2020-08-11 03:53:30 +08:00
define i32 @insert_extract_element_same_vec_idx_3 ( ) {
; CHECK-LABEL: @insert_extract_element_same_vec_idx_3(
; CHECK-NEXT: ret i32 1
;
%r = extractelement < v s c a l e x 4 x i32 > insertelement ( < v s c a l e x 4 x i32 > undef , i32 1 , i64 4 ) , i64 4
ret i32 %r
}
define i32 @insert_extract_element_same_vec_idx_4 ( ) {
; CHECK-LABEL: @insert_extract_element_same_vec_idx_4(
; CHECK-NEXT: ret i32 1
;
%r = extractelement < v s c a l e x 4 x i32 > insertelement ( < v s c a l e x 4 x i32 > insertelement ( < v s c a l e x 4 x i32 > undef , i32 1 , i32 4 ) , i32 2 , i64 3 ) , i64 4
ret i32 %r
}
2021-09-16 21:19:55 +08:00
; Known values of vscale intrinsic
define i64 @vscale64_range4_4 ( ) v s c a l e _ r a n g e ( 4 , 4 ) {
; CHECK-LABEL: @vscale64_range4_4(
; CHECK-NEXT: entry:
; CHECK-NEXT: ret i64 4
;
entry:
%vscale = call i64 @llvm.vscale.i64 ( )
ret i64 %vscale
}
2020-07-08 04:16:00 +08:00
; more complicated expressions
define < v s c a l e x 2 x i1 > @cmp_le_smax_always_true ( < v s c a l e x 2 x i64 > %x ) {
; CHECK-LABEL: @cmp_le_smax_always_true(
2021-08-09 18:36:41 +08:00
; CHECK-NEXT: ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> poison, i1 true, i32 0), <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer)
2021-01-03 23:05:08 +08:00
;
2021-08-09 18:36:41 +08:00
%cmp = icmp sle < v s c a l e x 2 x i64 > %x , shufflevector ( < v s c a l e x 2 x i64 > insertelement ( < v s c a l e x 2 x i64 > p o i s o n , i64 9223372036854775807 , i32 0 ) , < v s c a l e x 2 x i64 > p o i s o n , < v s c a l e x 2 x i32 > zeroinitializer )
2021-01-03 23:05:08 +08:00
ret < v s c a l e x 2 x i1 > %cmp
2020-07-08 04:16:00 +08:00
}
2020-08-11 03:53:30 +08:00
define < v s c a l e x 4 x float > @bitcast ( ) {
; CHECK-LABEL: @bitcast(
; CHECK-NEXT: ret <vscale x 4 x float> bitcast (<vscale x 4 x i32> shufflevector (<vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1, i32 0), <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer) to <vscale x 4 x float>)
;
%i1 = insertelement < v s c a l e x 4 x i32 > undef , i32 1 , i32 0
%i2 = shufflevector < v s c a l e x 4 x i32 > %i1 , < v s c a l e x 4 x i32 > undef , < v s c a l e x 4 x i32 > zeroinitializer
%i3 = bitcast < v s c a l e x 4 x i32 > %i2 to < v s c a l e x 4 x float >
ret < v s c a l e x 4 x float > %i3
}
2020-03-17 02:45:45 +08:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Memory Access and Addressing Operations
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; getelementptr
define < v s c a l e x 4 x i32 * > @getelementptr_constant_foldable_1 ( ) {
; CHECK-LABEL: @getelementptr_constant_foldable_1(
; CHECK-NEXT: ret <vscale x 4 x i32*> zeroinitializer
;
%ptr = getelementptr i32 , < v s c a l e x 4 x i32 * > zeroinitializer , < v s c a l e x 4 x i64 > undef
ret < v s c a l e x 4 x i32 * > %ptr
}
define < v s c a l e x 4 x < v s c a l e x 4 x i32 > * > @getelementptr_constant_foldable_2 ( ) {
; CHECK-LABEL: @getelementptr_constant_foldable_2(
; CHECK-NEXT: ret <vscale x 4 x <vscale x 4 x i32>*> zeroinitializer
;
%ptr = getelementptr < v s c a l e x 4 x i32 > , < v s c a l e x 4 x i32 > * null , < v s c a l e x 4 x i64 > undef
ret < v s c a l e x 4 x < v s c a l e x 4 x i32 > * > %ptr
}
; fold getelementptr P, 0 -> P.
define < v s c a l e x 4 x i32 > * @getelementptr_constant_foldable_3 ( ) {
; CHECK-LABEL: @getelementptr_constant_foldable_3(
; CHECK-NEXT: ret <vscale x 4 x i32>* null
;
%ptr = getelementptr < v s c a l e x 4 x i32 > , < v s c a l e x 4 x i32 > * null , i64 0
ret < v s c a l e x 4 x i32 > * %ptr
}
define < v s c a l e x 4 x i32 > * @getelementptr_not_constant_foldable ( i64 %x ) {
; CHECK-LABEL: @getelementptr_not_constant_foldable(
; CHECK-NEXT: [[PTR:%.*]] = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, i64 [[X:%.*]]
; CHECK-NEXT: ret <vscale x 4 x i32>* [[PTR]]
;
%ptr = getelementptr < v s c a l e x 4 x i32 > , < v s c a l e x 4 x i32 > * null , i64 %x
ret < v s c a l e x 4 x i32 > * %ptr
}
2020-03-18 02:31:19 +08:00
; Check GEP's result is known to be non-null.
define i1 @getelementptr_check_non_null ( < v s c a l e x 16 x i8 > * %ptr ) {
; CHECK-LABEL: @getelementptr_check_non_null(
; CHECK-NEXT: ret i1 false
;
%x = getelementptr inbounds < v s c a l e x 16 x i8 > , < v s c a l e x 16 x i8 > * %ptr , i32 1
%cmp = icmp eq < v s c a l e x 16 x i8 > * %x , null
ret i1 %cmp
}
2021-06-25 00:44:41 +08:00
define i32 @extractelement_splat_constant_index ( i32 %v ) {
; CHECK-LABEL: @extractelement_splat_constant_index(
; CHECK-NEXT: ret i32 [[V:%.*]]
;
%in = insertelement < v s c a l e x 4 x i32 > undef , i32 %v , i32 0
%splat = shufflevector < v s c a l e x 4 x i32 > %in , < v s c a l e x 4 x i32 > p o i s o n , < v s c a l e x 4 x i32 > zeroinitializer
%r = extractelement < v s c a l e x 4 x i32 > %splat , i32 1
ret i32 %r
}
define i32 @extractelement_splat_variable_index ( i32 %v , i32 %idx ) {
; CHECK-LABEL: @extractelement_splat_variable_index(
2021-07-05 20:14:20 +08:00
; CHECK-NEXT: ret i32 [[V:%.*]]
2021-06-25 00:44:41 +08:00
;
%in = insertelement < v s c a l e x 4 x i32 > undef , i32 %v , i32 0
%splat = shufflevector < v s c a l e x 4 x i32 > %in , < v s c a l e x 4 x i32 > undef , < v s c a l e x 4 x i32 > zeroinitializer
%r = extractelement < v s c a l e x 4 x i32 > %splat , i32 %idx
ret i32 %r
}
2021-09-16 21:19:55 +08:00
declare i64 @llvm.vscale.i64 ( )