; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -instcombine -S -data-layout="e" | FileCheck %s --check-prefixes=ANY,LE ; RUN: opt < %s -instcombine -S -data-layout="E" | FileCheck %s --check-prefixes=ANY,BE define i32 @extractelement_out_of_range(<2 x i32> %x) { ; ANY-LABEL: @extractelement_out_of_range( ; ANY-NEXT: ret i32 undef ; %E1 = extractelement <2 x i32> %x, i8 16 ret i32 %E1 } define i32 @extractelement_type_out_of_range(<2 x i32> %x) { ; ANY-LABEL: @extractelement_type_out_of_range( ; ANY-NEXT: [[E1:%.*]] = extractelement <2 x i32> [[X:%.*]], i128 0 ; ANY-NEXT: ret i32 [[E1]] ; %E1 = extractelement <2 x i32> %x, i128 0 ret i32 %E1 } define i32 @bitcasted_inselt_equal_num_elts(float %f) { ; ANY-LABEL: @bitcasted_inselt_equal_num_elts( ; ANY-NEXT: [[R:%.*]] = bitcast float [[F:%.*]] to i32 ; ANY-NEXT: ret i32 [[R]] ; %vf = insertelement <4 x float> undef, float %f, i32 0 %vi = bitcast <4 x float> %vf to <4 x i32> %r = extractelement <4 x i32> %vi, i32 0 ret i32 %r } define i64 @test2(i64 %in) { ; ANY-LABEL: @test2( ; ANY-NEXT: ret i64 [[IN:%.*]] ; %vec = insertelement <8 x i64> undef, i64 %in, i32 0 %splat = shufflevector <8 x i64> %vec, <8 x i64> undef, <8 x i32> zeroinitializer %add = add <8 x i64> %splat, %r = extractelement <8 x i64> %add, i32 0 ret i64 %r } define i32 @bitcasted_inselt_wide_source_zero_elt(i64 %x) { ; ANY-LABEL: @bitcasted_inselt_wide_source_zero_elt( ; ANY-NEXT: [[I:%.*]] = insertelement <2 x i64> undef, i64 [[X:%.*]], i32 0 ; ANY-NEXT: [[B:%.*]] = bitcast <2 x i64> [[I]] to <4 x i32> ; ANY-NEXT: [[R:%.*]] = extractelement <4 x i32> [[B]], i32 0 ; ANY-NEXT: ret i32 [[R]] ; %i = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0 %b = bitcast <2 x i64> %i to <4 x i32> %r = extractelement <4 x i32> %b, i32 0 ret i32 %r } define i16 @bitcasted_inselt_wide_source_modulo_elt(i64 %x) { ; ANY-LABEL: @bitcasted_inselt_wide_source_modulo_elt( ; ANY-NEXT: [[I:%.*]] = insertelement <2 x i64> undef, i64 [[X:%.*]], i32 1 ; ANY-NEXT: [[B:%.*]] = bitcast <2 x i64> [[I]] to <8 x i16> ; ANY-NEXT: [[R:%.*]] = extractelement <8 x i16> [[B]], i32 4 ; ANY-NEXT: ret i16 [[R]] ; %i = insertelement <2 x i64> undef, i64 %x, i32 1 %b = bitcast <2 x i64> %i to <8 x i16> %r = extractelement <8 x i16> %b, i32 4 ret i16 %r } define i32 @bitcasted_inselt_wide_source_not_modulo_elt(i64 %x) { ; ANY-LABEL: @bitcasted_inselt_wide_source_not_modulo_elt( ; ANY-NEXT: [[I:%.*]] = insertelement <2 x i64> undef, i64 [[X:%.*]], i32 0 ; ANY-NEXT: [[B:%.*]] = bitcast <2 x i64> [[I]] to <4 x i32> ; ANY-NEXT: [[R:%.*]] = extractelement <4 x i32> [[B]], i32 1 ; ANY-NEXT: ret i32 [[R]] ; %i = insertelement <2 x i64> undef, i64 %x, i32 0 %b = bitcast <2 x i64> %i to <4 x i32> %r = extractelement <4 x i32> %b, i32 1 ret i32 %r } define i8 @bitcasted_inselt_wide_source_not_modulo_elt_not_half(i32 %x) { ; ANY-LABEL: @bitcasted_inselt_wide_source_not_modulo_elt_not_half( ; ANY-NEXT: [[I:%.*]] = insertelement <2 x i32> undef, i32 [[X:%.*]], i32 0 ; ANY-NEXT: [[B:%.*]] = bitcast <2 x i32> [[I]] to <8 x i8> ; ANY-NEXT: [[R:%.*]] = extractelement <8 x i8> [[B]], i32 2 ; ANY-NEXT: ret i8 [[R]] ; %i = insertelement <2 x i32> undef, i32 %x, i32 0 %b = bitcast <2 x i32> %i to <8 x i8> %r = extractelement <8 x i8> %b, i32 2 ret i8 %r } define i3 @bitcasted_inselt_wide_source_not_modulo_elt_not_half_weird_types(i15 %x) { ; ANY-LABEL: @bitcasted_inselt_wide_source_not_modulo_elt_not_half_weird_types( ; ANY-NEXT: [[I:%.*]] = insertelement <3 x i15> undef, i15 [[X:%.*]], i32 0 ; ANY-NEXT: [[B:%.*]] = bitcast <3 x i15> [[I]] to <15 x i3> ; ANY-NEXT: [[R:%.*]] = extractelement <15 x i3> [[B]], i32 1 ; ANY-NEXT: ret i3 [[R]] ; %i = insertelement <3 x i15> undef, i15 %x, i32 0 %b = bitcast <3 x i15> %i to <15 x i3> %r = extractelement <15 x i3> %b, i32 1 ret i3 %r } ; Negative test for the above fold, but we can remove the insert here. define i8 @bitcasted_inselt_wide_source_wrong_insert(<2 x i32> %v, i32 %x) { ; ANY-LABEL: @bitcasted_inselt_wide_source_wrong_insert( ; ANY-NEXT: [[B:%.*]] = bitcast <2 x i32> [[V:%.*]] to <8 x i8> ; ANY-NEXT: [[R:%.*]] = extractelement <8 x i8> [[B]], i32 2 ; ANY-NEXT: ret i8 [[R]] ; %i = insertelement <2 x i32> %v, i32 %x, i32 1 %b = bitcast <2 x i32> %i to <8 x i8> %r = extractelement <8 x i8> %b, i32 2 ret i8 %r } ; Partial negative test for the above fold, extra uses are not allowed if shift is needed. declare void @use(<8 x i8>) define i8 @bitcasted_inselt_wide_source_uses(i32 %x) { ; ANY-LABEL: @bitcasted_inselt_wide_source_uses( ; ANY-NEXT: [[I:%.*]] = insertelement <2 x i32> undef, i32 [[X:%.*]], i32 0 ; ANY-NEXT: [[B:%.*]] = bitcast <2 x i32> [[I]] to <8 x i8> ; ANY-NEXT: call void @use(<8 x i8> [[B]]) ; ANY-NEXT: [[R:%.*]] = extractelement <8 x i8> [[B]], i32 3 ; ANY-NEXT: ret i8 [[R]] ; %i = insertelement <2 x i32> undef, i32 %x, i32 0 %b = bitcast <2 x i32> %i to <8 x i8> call void @use(<8 x i8> %b) %r = extractelement <8 x i8> %b, i32 3 ret i8 %r }