diff --git a/llvm/lib/Transforms/Scalar/SpeculativeExecution.cpp b/llvm/lib/Transforms/Scalar/SpeculativeExecution.cpp --- a/llvm/lib/Transforms/Scalar/SpeculativeExecution.cpp +++ b/llvm/lib/Transforms/Scalar/SpeculativeExecution.cpp @@ -245,6 +245,9 @@ case Instruction::FNeg: case Instruction::ICmp: case Instruction::FCmp: + case Instruction::ExtractElement: + case Instruction::InsertElement: + case Instruction::ShuffleVector: return TTI.getUserCost(I, TargetTransformInfo::TCK_SizeAndLatency); default: diff --git a/llvm/test/Transforms/SpeculativeExecution/spec-fp.ll b/llvm/test/Transforms/SpeculativeExecution/spec-fp.ll --- a/llvm/test/Transforms/SpeculativeExecution/spec-fp.ll +++ b/llvm/test/Transforms/SpeculativeExecution/spec-fp.ll @@ -99,3 +99,46 @@ b: ret void } + +; CHECK-LABEL: @ifThen_shuffle( +; CHECK: shufflevector +; CHECK: br i1 true +define void @ifThen_shuffle() { + br i1 true, label %a, label %b + +a: + %x = shufflevector <2 x float> undef, <2 x float> undef, <2 x i32> zeroinitializer + br label %b + +b: + ret void +} + +; CHECK-LABEL: @ifThen_extract( +; CHECK: extractelement +; CHECK: br i1 true +define void @ifThen_extract() { + br i1 true, label %a, label %b + +a: + %x = extractelement <2 x float> undef, i32 1 + br label %b + +b: + ret void +} + + +; CHECK-LABEL: @ifThen_insert( +; CHECK: insertelement +; CHECK: br i1 true +define void @ifThen_insert() { + br i1 true, label %a, label %b + +a: + %x = insertelement <2 x float> undef, float undef, i32 1 + br label %b + +b: + ret void +}