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 54; extractelement 55 56define i32 @extractelement_idx_undef(<vscale x 4 x i32> %a) { 57; CHECK-LABEL: @extractelement_idx_undef( 58; CHECK-NEXT: ret i32 undef 59; 60 %r = extractelement <vscale x 4 x i32> %a, i64 undef 61 ret i32 %r 62} 63 64define i32 @extractelement_vec_undef(<vscale x 4 x i32> %a) { 65; CHECK-LABEL: @extractelement_vec_undef( 66; CHECK-NEXT: ret i32 undef 67; 68 %r = extractelement <vscale x 4 x i32> undef, i64 1 69 ret i32 %r 70} 71 72define i32 @extractelement_idx_maybe_out_of_bound(<vscale x 4 x i32> %a) { 73; CHECK-LABEL: @extractelement_idx_maybe_out_of_bound( 74; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x i32> [[A:%.*]], i64 4 75; CHECK-NEXT: ret i32 [[R]] 76; 77 %r = extractelement <vscale x 4 x i32> %a, i64 4 78 ret i32 %r 79} 80define i32 @extractelement_idx_large_bound(<vscale x 4 x i32> %a) { 81; CHECK-LABEL: @extractelement_idx_large_bound( 82; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x i32> [[A:%.*]], i64 12345 83; CHECK-NEXT: ret i32 [[R]] 84; 85 %r = extractelement <vscale x 4 x i32> %a, i64 12345 86 ret i32 %r 87} 88 89define i32 @insert_extract_element_same_vec_idx_2(<vscale x 4 x i32> %a) { 90; CHECK-LABEL: @insert_extract_element_same_vec_idx_2( 91; CHECK-NEXT: ret i32 1 92; 93 %v = insertelement <vscale x 4 x i32> undef, i32 1, i64 4 94 %r = extractelement <vscale x 4 x i32> %v, i64 4 95 ret i32 %r 96} 97 98; more complicated expressions 99 100define <vscale x 2 x i1> @cmp_le_smax_always_true(<vscale x 2 x i64> %x) { 101; CHECK-LABEL: @cmp_le_smax_always_true( 102; 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) 103 %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) 104 ret <vscale x 2 x i1> %cmp 105} 106 107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 108;; Memory Access and Addressing Operations 109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 110 111; getelementptr 112 113define <vscale x 4 x i32*> @getelementptr_constant_foldable_1() { 114; CHECK-LABEL: @getelementptr_constant_foldable_1( 115; CHECK-NEXT: ret <vscale x 4 x i32*> zeroinitializer 116; 117 %ptr = getelementptr i32, <vscale x 4 x i32*> zeroinitializer, <vscale x 4 x i64> undef 118 ret <vscale x 4 x i32*> %ptr 119} 120 121define <vscale x 4 x <vscale x 4 x i32>*> @getelementptr_constant_foldable_2() { 122; CHECK-LABEL: @getelementptr_constant_foldable_2( 123; CHECK-NEXT: ret <vscale x 4 x <vscale x 4 x i32>*> zeroinitializer 124; 125 %ptr = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, <vscale x 4 x i64> undef 126 ret <vscale x 4 x <vscale x 4 x i32>*> %ptr 127} 128 129; fold getelementptr P, 0 -> P. 130define <vscale x 4 x i32>* @getelementptr_constant_foldable_3() { 131; CHECK-LABEL: @getelementptr_constant_foldable_3( 132; CHECK-NEXT: ret <vscale x 4 x i32>* null 133; 134 %ptr = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, i64 0 135 ret <vscale x 4 x i32>* %ptr 136} 137 138define <vscale x 4 x i32>* @getelementptr_not_constant_foldable(i64 %x) { 139; CHECK-LABEL: @getelementptr_not_constant_foldable( 140; CHECK-NEXT: [[PTR:%.*]] = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, i64 [[X:%.*]] 141; CHECK-NEXT: ret <vscale x 4 x i32>* [[PTR]] 142; 143 %ptr = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, i64 %x 144 ret <vscale x 4 x i32>* %ptr 145} 146 147; Check GEP's result is known to be non-null. 148define i1 @getelementptr_check_non_null(<vscale x 16 x i8>* %ptr) { 149; CHECK-LABEL: @getelementptr_check_non_null( 150; CHECK-NEXT: ret i1 false 151; 152 %x = getelementptr inbounds <vscale x 16 x i8>, <vscale x 16 x i8>* %ptr, i32 1 153 %cmp = icmp eq <vscale x 16 x i8>* %x, null 154 ret i1 %cmp 155} 156