1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -instsimplify -S -verify | FileCheck %s 3 4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 5;; Vector Operations 6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 7 8; insertelement 9 10define <vscale x 4 x i32> @insertelement_idx_undef(<vscale x 4 x i32> %a) { 11; CHECK-LABEL: @insertelement_idx_undef( 12; CHECK-NEXT: ret <vscale x 4 x i32> undef 13; 14 %r = insertelement <vscale x 4 x i32> %a, i32 5, i64 undef 15 ret <vscale x 4 x i32> %r 16} 17 18define <vscale x 4 x i32> @insertelement_value_undef(<vscale x 4 x i32> %a) { 19; CHECK-LABEL: @insertelement_value_undef( 20; CHECK-NEXT: [[R:%.*]] = insertelement <vscale x 4 x i32> [[A:%.*]], i32 undef, i64 0 21; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] 22; 23 %r = insertelement <vscale x 4 x i32> %a, i32 undef, i64 0 24 ret <vscale x 4 x i32> %r 25} 26 27define <vscale x 4 x i32> @insertelement_idx_maybe_out_of_bound(<vscale x 4 x i32> %a) { 28; CHECK-LABEL: @insertelement_idx_maybe_out_of_bound( 29; CHECK-NEXT: [[R:%.*]] = insertelement <vscale x 4 x i32> [[A:%.*]], i32 5, i64 4 30; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] 31; 32 %r = insertelement <vscale x 4 x i32> %a, i32 5, i64 4 33 ret <vscale x 4 x i32> %r 34} 35 36define <vscale x 4 x i32> @insertelement_idx_large_bound(<vscale x 4 x i32> %a) { 37; CHECK-LABEL: @insertelement_idx_large_bound( 38; CHECK-NEXT: [[R:%.*]] = insertelement <vscale x 4 x i32> [[A:%.*]], i32 5, i64 12345 39; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] 40; 41 %r = insertelement <vscale x 4 x i32> %a, i32 5, i64 12345 42 ret <vscale x 4 x i32> %r 43} 44 45define <vscale x 4 x i32> @insert_extract_element_same_vec_idx_1(<vscale x 4 x i32> %a) { 46; CHECK-LABEL: @insert_extract_element_same_vec_idx_1( 47; CHECK-NEXT: ret <vscale x 4 x i32> [[A:%.*]] 48; 49 %v = extractelement <vscale x 4 x i32> %a, i64 1 50 %r = insertelement <vscale x 4 x i32> %a, i32 %v, i64 1 51 ret <vscale x 4 x i32> %r 52} 53 54define <vscale x 4 x i32> @insertelement_inline_to_ret() { 55; CHECK-LABEL: @insertelement_inline_to_ret( 56; CHECK-NEXT: ret <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1, i32 0) 57; 58 %i = insertelement <vscale x 4 x i32> undef, i32 1, i32 0 59 ret <vscale x 4 x i32> %i 60} 61 62define <vscale x 4 x i32> @insertelement_shufflevector_inline_to_ret() { 63; CHECK-LABEL: @insertelement_shufflevector_inline_to_ret( 64; 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) 65; 66 %i = insertelement <vscale x 4 x i32> undef, i32 1, i32 0 67 %i2 = shufflevector <vscale x 4 x i32> %i, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer 68 ret <vscale x 4 x i32> %i2 69} 70 71; extractelement 72 73define i32 @extractelement_idx_undef(<vscale x 4 x i32> %a) { 74; CHECK-LABEL: @extractelement_idx_undef( 75; CHECK-NEXT: ret i32 undef 76; 77 %r = extractelement <vscale x 4 x i32> %a, i64 undef 78 ret i32 %r 79} 80 81define i32 @extractelement_vec_undef(<vscale x 4 x i32> %a) { 82; CHECK-LABEL: @extractelement_vec_undef( 83; CHECK-NEXT: ret i32 undef 84; 85 %r = extractelement <vscale x 4 x i32> undef, i64 1 86 ret i32 %r 87} 88 89define i32 @extractelement_idx_maybe_out_of_bound(<vscale x 4 x i32> %a) { 90; CHECK-LABEL: @extractelement_idx_maybe_out_of_bound( 91; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x i32> [[A:%.*]], i64 4 92; CHECK-NEXT: ret i32 [[R]] 93; 94 %r = extractelement <vscale x 4 x i32> %a, i64 4 95 ret i32 %r 96} 97define i32 @extractelement_idx_large_bound(<vscale x 4 x i32> %a) { 98; CHECK-LABEL: @extractelement_idx_large_bound( 99; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x i32> [[A:%.*]], i64 12345 100; CHECK-NEXT: ret i32 [[R]] 101; 102 %r = extractelement <vscale x 4 x i32> %a, i64 12345 103 ret i32 %r 104} 105 106define i32 @insert_extract_element_same_vec_idx_2() { 107; CHECK-LABEL: @insert_extract_element_same_vec_idx_2( 108; CHECK-NEXT: ret i32 1 109; 110 %v = insertelement <vscale x 4 x i32> undef, i32 1, i64 4 111 %r = extractelement <vscale x 4 x i32> %v, i64 4 112 ret i32 %r 113} 114 115define i32 @insert_extract_element_same_vec_idx_3() { 116; CHECK-LABEL: @insert_extract_element_same_vec_idx_3( 117; CHECK-NEXT: ret i32 1 118; 119 %r = extractelement <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1, i64 4), i64 4 120 ret i32 %r 121} 122 123define i32 @insert_extract_element_same_vec_idx_4() { 124; CHECK-LABEL: @insert_extract_element_same_vec_idx_4( 125; CHECK-NEXT: ret i32 1 126; 127 %r = extractelement <vscale x 4 x i32> insertelement (<vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1, i32 4), i32 2, i64 3), i64 4 128 ret i32 %r 129} 130 131; more complicated expressions 132 133define <vscale x 2 x i1> @cmp_le_smax_always_true(<vscale x 2 x i64> %x) { 134; CHECK-LABEL: @cmp_le_smax_always_true( 135; CHECK-NEXT: ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer) 136 %cmp = icmp sle <vscale x 2 x i64> %x, shufflevector (<vscale x 2 x i64> insertelement (<vscale x 2 x i64> undef, i64 9223372036854775807, i32 0), <vscale x 2 x i64> undef, <vscale x 2 x i32> zeroinitializer) 137 ret <vscale x 2 x i1> %cmp 138} 139 140define <vscale x 4 x float> @bitcast() { 141; CHECK-LABEL: @bitcast( 142; 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>) 143; 144 %i1 = insertelement <vscale x 4 x i32> undef, i32 1, i32 0 145 %i2 = shufflevector <vscale x 4 x i32> %i1, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer 146 %i3 = bitcast <vscale x 4 x i32> %i2 to <vscale x 4 x float> 147 ret <vscale x 4 x float> %i3 148} 149 150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 151;; Memory Access and Addressing Operations 152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 153 154; getelementptr 155 156define <vscale x 4 x i32*> @getelementptr_constant_foldable_1() { 157; CHECK-LABEL: @getelementptr_constant_foldable_1( 158; CHECK-NEXT: ret <vscale x 4 x i32*> zeroinitializer 159; 160 %ptr = getelementptr i32, <vscale x 4 x i32*> zeroinitializer, <vscale x 4 x i64> undef 161 ret <vscale x 4 x i32*> %ptr 162} 163 164define <vscale x 4 x <vscale x 4 x i32>*> @getelementptr_constant_foldable_2() { 165; CHECK-LABEL: @getelementptr_constant_foldable_2( 166; CHECK-NEXT: ret <vscale x 4 x <vscale x 4 x i32>*> zeroinitializer 167; 168 %ptr = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, <vscale x 4 x i64> undef 169 ret <vscale x 4 x <vscale x 4 x i32>*> %ptr 170} 171 172; fold getelementptr P, 0 -> P. 173define <vscale x 4 x i32>* @getelementptr_constant_foldable_3() { 174; CHECK-LABEL: @getelementptr_constant_foldable_3( 175; CHECK-NEXT: ret <vscale x 4 x i32>* null 176; 177 %ptr = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, i64 0 178 ret <vscale x 4 x i32>* %ptr 179} 180 181define <vscale x 4 x i32>* @getelementptr_not_constant_foldable(i64 %x) { 182; CHECK-LABEL: @getelementptr_not_constant_foldable( 183; CHECK-NEXT: [[PTR:%.*]] = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, i64 [[X:%.*]] 184; CHECK-NEXT: ret <vscale x 4 x i32>* [[PTR]] 185; 186 %ptr = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, i64 %x 187 ret <vscale x 4 x i32>* %ptr 188} 189 190; Check GEP's result is known to be non-null. 191define i1 @getelementptr_check_non_null(<vscale x 16 x i8>* %ptr) { 192; CHECK-LABEL: @getelementptr_check_non_null( 193; CHECK-NEXT: ret i1 false 194; 195 %x = getelementptr inbounds <vscale x 16 x i8>, <vscale x 16 x i8>* %ptr, i32 1 196 %cmp = icmp eq <vscale x 16 x i8>* %x, null 197 ret i1 %cmp 198} 199