; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -instsimplify -S | FileCheck %s define <4 x i32> @const_folding(<4 x i32> %x) { ; CHECK-LABEL: @const_folding( ; CHECK-NEXT: ret <4 x i32> zeroinitializer ; %shuf = shufflevector <4 x i32> %x, <4 x i32> zeroinitializer, <4 x i32> ret <4 x i32> %shuf } define <4 x i32> @const_folding1(<4 x i32> %x) { ; CHECK-LABEL: @const_folding1( ; CHECK-NEXT: ret <4 x i32> ; %shuf = shufflevector <4 x i32> , <4 x i32> %x, <4 x i32> zeroinitializer ret <4 x i32> %shuf } define <4 x i32> @const_folding_negative(<3 x i32> %x) { ; CHECK-LABEL: @const_folding_negative( ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <3 x i32> [[X:%.*]], <3 x i32> zeroinitializer, <4 x i32> ; CHECK-NEXT: ret <4 x i32> [[SHUF]] ; %shuf = shufflevector <3 x i32> %x, <3 x i32> zeroinitializer, <4 x i32> ret <4 x i32> %shuf } define <4 x i32> @splat_operand(<4 x i32> %x) { ; CHECK-LABEL: @splat_operand( ; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> undef, <4 x i32> zeroinitializer ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[SPLAT]], <4 x i32> undef, <4 x i32> ; CHECK-NEXT: ret <4 x i32> [[SHUF]] ; %splat = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> zeroinitializer %shuf = shufflevector <4 x i32> %splat, <4 x i32> undef, <4 x i32> ret <4 x i32> %shuf } define <4 x i32> @undef_mask(<4 x i32> %x) { ; CHECK-LABEL: @undef_mask( ; CHECK-NEXT: ret <4 x i32> undef ; %shuf = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> undef ret <4 x i32> %shuf } define <4 x i32> @identity_mask_0(<4 x i32> %x) { ; CHECK-LABEL: @identity_mask_0( ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> undef, <4 x i32> ; CHECK-NEXT: ret <4 x i32> [[SHUF]] ; %shuf = shufflevector <4 x i32> %x, <4 x i32> undef, <4 x i32> ret <4 x i32> %shuf } define <4 x i32> @identity_mask_1(<4 x i32> %x) { ; CHECK-LABEL: @identity_mask_1( ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> undef, <4 x i32> [[X:%.*]], <4 x i32> ; CHECK-NEXT: ret <4 x i32> [[SHUF]] ; %shuf = shufflevector <4 x i32> undef, <4 x i32> %x, <4 x i32> ret <4 x i32> %shuf } define <4 x i32> @pseudo_identity_mask(<4 x i32> %x) { ; CHECK-LABEL: @pseudo_identity_mask( ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> [[X]], <4 x i32> ; CHECK-NEXT: ret <4 x i32> [[SHUF]] ; %shuf = shufflevector <4 x i32> %x, <4 x i32> %x, <4 x i32> ret <4 x i32> %shuf } define <4 x i32> @const_operand(<4 x i32> %x) { ; CHECK-LABEL: @const_operand( ; CHECK-NEXT: ret <4 x i32> ; %shuf = shufflevector <4 x i32> , <4 x i32> %x, <4 x i32> ret <4 x i32> %shuf } define <4 x i32> @merge(<4 x i32> %x) { ; CHECK-LABEL: @merge( ; CHECK-NEXT: [[LOWER:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> undef, <2 x i32> ; CHECK-NEXT: [[UPPER:%.*]] = shufflevector <4 x i32> [[X]], <4 x i32> undef, <2 x i32> ; CHECK-NEXT: [[MERGED:%.*]] = shufflevector <2 x i32> [[UPPER]], <2 x i32> [[LOWER]], <4 x i32> ; CHECK-NEXT: ret <4 x i32> [[MERGED]] ; %lower = shufflevector <4 x i32> %x, <4 x i32> undef, <2 x i32> %upper = shufflevector <4 x i32> %x, <4 x i32> undef, <2 x i32> %merged = shufflevector <2 x i32> %upper, <2 x i32> %lower, <4 x i32> ret <4 x i32> %merged }