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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 99;; Memory Access and Addressing Operations 100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 101 102; getelementptr 103 104define <vscale x 4 x i32*> @getelementptr_constant_foldable_1() { 105; CHECK-LABEL: @getelementptr_constant_foldable_1( 106; CHECK-NEXT: ret <vscale x 4 x i32*> zeroinitializer 107; 108 %ptr = getelementptr i32, <vscale x 4 x i32*> zeroinitializer, <vscale x 4 x i64> undef 109 ret <vscale x 4 x i32*> %ptr 110} 111 112define <vscale x 4 x <vscale x 4 x i32>*> @getelementptr_constant_foldable_2() { 113; CHECK-LABEL: @getelementptr_constant_foldable_2( 114; CHECK-NEXT: ret <vscale x 4 x <vscale x 4 x i32>*> zeroinitializer 115; 116 %ptr = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, <vscale x 4 x i64> undef 117 ret <vscale x 4 x <vscale x 4 x i32>*> %ptr 118} 119 120; fold getelementptr P, 0 -> P. 121define <vscale x 4 x i32>* @getelementptr_constant_foldable_3() { 122; CHECK-LABEL: @getelementptr_constant_foldable_3( 123; CHECK-NEXT: ret <vscale x 4 x i32>* null 124; 125 %ptr = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, i64 0 126 ret <vscale x 4 x i32>* %ptr 127} 128 129define <vscale x 4 x i32>* @getelementptr_not_constant_foldable(i64 %x) { 130; CHECK-LABEL: @getelementptr_not_constant_foldable( 131; CHECK-NEXT: [[PTR:%.*]] = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, i64 [[X:%.*]] 132; CHECK-NEXT: ret <vscale x 4 x i32>* [[PTR]] 133; 134 %ptr = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* null, i64 %x 135 ret <vscale x 4 x i32>* %ptr 136} 137 138; Check GEP's result is known to be non-null. 139define i1 @getelementptr_check_non_null(<vscale x 16 x i8>* %ptr) { 140; CHECK-LABEL: @getelementptr_check_non_null( 141; CHECK-NEXT: ret i1 false 142; 143 %x = getelementptr inbounds <vscale x 16 x i8>, <vscale x 16 x i8>* %ptr, i32 1 144 %cmp = icmp eq <vscale x 16 x i8>* %x, null 145 ret i1 %cmp 146} 147