Index: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp @@ -25593,6 +25593,11 @@ if (Bits == 8) return false; + // XOP has v16i8/v8i16/v4i32/v2i64 variable vector shifts. + if (Subtarget.hasXOP() && Ty->getPrimitiveSizeInBits() == 128 && + (Bits == 8 || Bits == 16 || Bits == 32 || Bits == 64)) + return false; + // AVX2 has vpsllv[dq] instructions (and other shifts) that make variable // shifts just as cheap as scalar ones. if (Subtarget.hasAVX2() && (Bits == 32 || Bits == 64)) Index: llvm/trunk/test/Transforms/CodeGenPrepare/X86/x86-shuffle-sink.ll =================================================================== --- llvm/trunk/test/Transforms/CodeGenPrepare/X86/x86-shuffle-sink.ll +++ llvm/trunk/test/Transforms/CodeGenPrepare/X86/x86-shuffle-sink.ll @@ -45,8 +45,7 @@ ; CHECK-XOP: if_true: ; CHECK-XOP-NEXT: ret <8 x i16> [[MASK]] ; CHECK-XOP: if_false: -; CHECK-XOP-NEXT: [[TMP1:%.*]] = shufflevector <8 x i16> [[TMP]], <8 x i16> undef, <8 x i32> zeroinitializer -; CHECK-XOP-NEXT: [[RES:%.*]] = shl <8 x i16> [[LHS:%.*]], [[TMP1]] +; CHECK-XOP-NEXT: [[RES:%.*]] = shl <8 x i16> [[LHS:%.*]], [[MASK]] ; CHECK-XOP-NEXT: ret <8 x i16> [[RES]] ; ; CHECK-AVX2-LABEL: @test_16bit( @@ -117,8 +116,7 @@ ; CHECK-XOP: if_true: ; CHECK-XOP-NEXT: ret <4 x i32> [[MASK]] ; CHECK-XOP: if_false: -; CHECK-XOP-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[TMP]], <4 x i32> undef, <4 x i32> -; CHECK-XOP-NEXT: [[RES:%.*]] = ashr <4 x i32> [[LHS:%.*]], [[TMP1]] +; CHECK-XOP-NEXT: [[RES:%.*]] = ashr <4 x i32> [[LHS:%.*]], [[MASK]] ; CHECK-XOP-NEXT: ret <4 x i32> [[RES]] ; ; CHECK-AVX-LABEL: @test_32bit( @@ -158,8 +156,7 @@ ; CHECK-XOP: if_true: ; CHECK-XOP-NEXT: ret <2 x i64> [[MASK]] ; CHECK-XOP: if_false: -; CHECK-XOP-NEXT: [[TMP1:%.*]] = shufflevector <2 x i64> [[TMP]], <2 x i64> undef, <2 x i32> zeroinitializer -; CHECK-XOP-NEXT: [[RES:%.*]] = lshr <2 x i64> [[LHS:%.*]], [[TMP1]] +; CHECK-XOP-NEXT: [[RES:%.*]] = lshr <2 x i64> [[LHS:%.*]], [[MASK]] ; CHECK-XOP-NEXT: ret <2 x i64> [[RES]] ; ; CHECK-AVX-LABEL: @test_64bit(