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: ret <vscale x 4 x i32> [[A:%.*]] 21; 22 %r = insertelement <vscale x 4 x i32> %a, i32 undef, i64 0 23 ret <vscale x 4 x i32> %r 24} 25 26define <vscale x 4 x i32> @insertelement_idx_maybe_out_of_bound(<vscale x 4 x i32> %a) { 27; CHECK-LABEL: @insertelement_idx_maybe_out_of_bound( 28; CHECK-NEXT: [[R:%.*]] = insertelement <vscale x 4 x i32> [[A:%.*]], i32 5, i64 4 29; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] 30; 31 %r = insertelement <vscale x 4 x i32> %a, i32 5, i64 4 32 ret <vscale x 4 x i32> %r 33} 34 35define <vscale x 4 x i32> @insertelement_idx_large_bound(<vscale x 4 x i32> %a) { 36; CHECK-LABEL: @insertelement_idx_large_bound( 37; CHECK-NEXT: [[R:%.*]] = insertelement <vscale x 4 x i32> [[A:%.*]], i32 5, i64 12345 38; CHECK-NEXT: ret <vscale x 4 x i32> [[R]] 39; 40 %r = insertelement <vscale x 4 x i32> %a, i32 5, i64 12345 41 ret <vscale x 4 x i32> %r 42} 43 44define <vscale x 4 x i32> @insert_extract_element_same_vec_idx_1(<vscale x 4 x i32> %a) { 45; CHECK-LABEL: @insert_extract_element_same_vec_idx_1( 46; CHECK-NEXT: ret <vscale x 4 x i32> [[A:%.*]] 47; 48 %v = extractelement <vscale x 4 x i32> %a, i64 1 49 %r = insertelement <vscale x 4 x i32> %a, i32 %v, i64 1 50 ret <vscale x 4 x i32> %r 51} 52 53; extractelement 54 55define i32 @extractelement_idx_undef(<vscale x 4 x i32> %a) { 56; CHECK-LABEL: @extractelement_idx_undef( 57; CHECK-NEXT: ret i32 undef 58; 59 %r = extractelement <vscale x 4 x i32> %a, i64 undef 60 ret i32 %r 61} 62 63define i32 @extractelement_vec_undef(<vscale x 4 x i32> %a) { 64; CHECK-LABEL: @extractelement_vec_undef( 65; CHECK-NEXT: ret i32 undef 66; 67 %r = extractelement <vscale x 4 x i32> undef, i64 1 68 ret i32 %r 69} 70 71define i32 @extractelement_idx_maybe_out_of_bound(<vscale x 4 x i32> %a) { 72; CHECK-LABEL: @extractelement_idx_maybe_out_of_bound( 73; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x i32> [[A:%.*]], i64 4 74; CHECK-NEXT: ret i32 [[R]] 75; 76 %r = extractelement <vscale x 4 x i32> %a, i64 4 77 ret i32 %r 78} 79define i32 @extractelement_idx_large_bound(<vscale x 4 x i32> %a) { 80; CHECK-LABEL: @extractelement_idx_large_bound( 81; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x i32> [[A:%.*]], i64 12345 82; CHECK-NEXT: ret i32 [[R]] 83; 84 %r = extractelement <vscale x 4 x i32> %a, i64 12345 85 ret i32 %r 86} 87 88define i32 @insert_extract_element_same_vec_idx_2(<vscale x 4 x i32> %a) { 89; CHECK-LABEL: @insert_extract_element_same_vec_idx_2( 90; CHECK-NEXT: ret i32 1 91; 92 %v = insertelement <vscale x 4 x i32> undef, i32 1, i64 4 93 %r = extractelement <vscale x 4 x i32> %v, i64 4 94 ret i32 %r 95} 96 97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 98;; Memory Access and Addressing Operations 99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 100 101; getelementptr 102 103define <vscale x 4 x i32*> @getelementptr_constant_foldable_1() { 104; CHECK-LABEL: @getelementptr_constant_foldable_1( 105; CHECK-NEXT: ret <vscale x 4 x i32*> zeroinitializer 106; 107 %ptr = getelementptr i32, <vscale x 4 x i32*> zeroinitializer, <vscale x 4 x i64> undef 108 ret <vscale x 4 x i32*> %ptr 109} 110 111define <vscale x 4 x <vscale x 4 x i32>*> @getelementptr_constant_foldable_2() { 112; CHECK-LABEL: @getelementptr_constant_foldable_2( 113; CHECK-NEXT: ret <vscale x 4 x <vscale x 4 x i32>*> zeroinitializer 114; 115 %ptr = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, <vscale x 4 x i64> undef 116 ret <vscale x 4 x <vscale x 4 x i32>*> %ptr 117} 118 119; fold getelementptr P, 0 -> P. 120define <vscale x 4 x i32>* @getelementptr_constant_foldable_3() { 121; CHECK-LABEL: @getelementptr_constant_foldable_3( 122; CHECK-NEXT: ret <vscale x 4 x i32>* null 123; 124 %ptr = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, i64 0 125 ret <vscale x 4 x i32>* %ptr 126} 127 128define <vscale x 4 x i32>* @getelementptr_not_constant_foldable(i64 %x) { 129; CHECK-LABEL: @getelementptr_not_constant_foldable( 130; CHECK-NEXT: [[PTR:%.*]] = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, i64 [[X:%.*]] 131; CHECK-NEXT: ret <vscale x 4 x i32>* [[PTR]] 132; 133 %ptr = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, i64 %x 134 ret <vscale x 4 x i32>* %ptr 135} 136 137; Check GEP's result is known to be non-null. 138define i1 @getelementptr_check_non_null(<vscale x 16 x i8>* %ptr) { 139; CHECK-LABEL: @getelementptr_check_non_null( 140; CHECK-NEXT: ret i1 false 141; 142 %x = getelementptr inbounds <vscale x 16 x i8>, <vscale x 16 x i8>* %ptr, i32 1 143 %cmp = icmp eq <vscale x 16 x i8>* %x, null 144 ret i1 %cmp 145} 146