1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instsimplify,verify -S | 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> poison 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> splat (i32 1) 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 poison 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; Known values of vscale intrinsic 132 133define i64 @vscale64_range4_4() vscale_range(4,4) { 134; CHECK-LABEL: @vscale64_range4_4( 135; CHECK-NEXT: entry: 136; CHECK-NEXT: ret i64 4 137; 138entry: 139 %vscale = call i64 @llvm.vscale.i64() 140 ret i64 %vscale 141} 142 143; more complicated expressions 144 145define <vscale x 2 x i1> @cmp_le_smax_always_true(<vscale x 2 x i64> %x) { 146; CHECK-LABEL: @cmp_le_smax_always_true( 147; CHECK-NEXT: ret <vscale x 2 x i1> splat (i1 true) 148; 149 %cmp = icmp sle <vscale x 2 x i64> %x, splat (i64 9223372036854775807) 150 ret <vscale x 2 x i1> %cmp 151} 152 153define <vscale x 4 x float> @bitcast() { 154; CHECK-LABEL: @bitcast( 155; CHECK-NEXT: ret <vscale x 4 x float> bitcast (<vscale x 4 x i32> splat (i32 1) to <vscale x 4 x float>) 156; 157 %i1 = insertelement <vscale x 4 x i32> undef, i32 1, i32 0 158 %i2 = shufflevector <vscale x 4 x i32> %i1, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer 159 %i3 = bitcast <vscale x 4 x i32> %i2 to <vscale x 4 x float> 160 ret <vscale x 4 x float> %i3 161} 162 163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 164;; Memory Access and Addressing Operations 165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 166 167; getelementptr 168 169define <vscale x 4 x ptr> @getelementptr_constant_foldable_1() { 170; CHECK-LABEL: @getelementptr_constant_foldable_1( 171; CHECK-NEXT: ret <vscale x 4 x ptr> zeroinitializer 172; 173 %ptr = getelementptr i32, <vscale x 4 x ptr> zeroinitializer, <vscale x 4 x i64> undef 174 ret <vscale x 4 x ptr> %ptr 175} 176 177define <vscale x 4 x ptr> @getelementptr_constant_foldable_2() { 178; CHECK-LABEL: @getelementptr_constant_foldable_2( 179; CHECK-NEXT: ret <vscale x 4 x ptr> zeroinitializer 180; 181 %ptr = getelementptr <vscale x 4 x i32>, ptr null, <vscale x 4 x i64> undef 182 ret <vscale x 4 x ptr> %ptr 183} 184 185; fold getelementptr P, 0 -> P. 186define ptr @getelementptr_constant_foldable_3() { 187; CHECK-LABEL: @getelementptr_constant_foldable_3( 188; CHECK-NEXT: ret ptr null 189; 190 ret ptr null 191} 192 193define ptr @getelementptr_not_constant_foldable(i64 %x) { 194; CHECK-LABEL: @getelementptr_not_constant_foldable( 195; CHECK-NEXT: [[PTR:%.*]] = getelementptr <vscale x 4 x i32>, ptr null, i64 1 196; CHECK-NEXT: ret ptr [[PTR]] 197; 198 %ptr = getelementptr <vscale x 4 x i32>, ptr null, i64 1 199 ret ptr %ptr 200} 201 202; Check GEP's result is known to be non-null. 203define i1 @getelementptr_check_non_null(ptr %ptr) { 204; CHECK-LABEL: @getelementptr_check_non_null( 205; CHECK-NEXT: ret i1 false 206; 207 %x = getelementptr inbounds <vscale x 16 x i8>, ptr %ptr, i32 1 208 %cmp = icmp eq ptr %x, null 209 ret i1 %cmp 210} 211 212define i32 @extractelement_splat_constant_index(i32 %v) { 213; CHECK-LABEL: @extractelement_splat_constant_index( 214; CHECK-NEXT: ret i32 [[V:%.*]] 215; 216 %in = insertelement <vscale x 4 x i32> undef, i32 %v, i32 0 217 %splat = shufflevector <vscale x 4 x i32> %in, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer 218 %r = extractelement <vscale x 4 x i32> %splat, i32 1 219 ret i32 %r 220} 221 222define i32 @extractelement_splat_variable_index(i32 %v, i32 %idx) { 223; CHECK-LABEL: @extractelement_splat_variable_index( 224; CHECK-NEXT: ret i32 [[V:%.*]] 225; 226 %in = insertelement <vscale x 4 x i32> undef, i32 %v, i32 0 227 %splat = shufflevector <vscale x 4 x i32> %in, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer 228 %r = extractelement <vscale x 4 x i32> %splat, i32 %idx 229 ret i32 %r 230} 231 232 233declare i64 @llvm.vscale.i64() 234