Index: lib/Transforms/Scalar/SpeculativeExecution.cpp =================================================================== --- lib/Transforms/Scalar/SpeculativeExecution.cpp +++ lib/Transforms/Scalar/SpeculativeExecution.cpp @@ -242,6 +242,11 @@ case Instruction::FRem: case Instruction::ICmp: case Instruction::FCmp: + case Instruction::ExtractElement: + case Instruction::InsertElement: + case Instruction::ShuffleVector: + case Instruction::ExtractValue: + case Instruction::InsertValue: return TTI.getUserCost(I); default: Index: test/Transforms/SpeculativeExecution/spec-other.ll =================================================================== --- /dev/null +++ test/Transforms/SpeculativeExecution/spec-other.ll @@ -0,0 +1,32 @@ +; RUN: opt < %s -S -speculative-execution \ +; RUN: -spec-exec-max-speculation-cost 4 -spec-exec-max-not-hoisted 3 \ +; RUN: | FileCheck %s + +; CHECK-LABEL: @ifThen_extractvalue( +; CHECK: extractvalue +; CHECK: br i1 true +define void @ifThen_extractvalue() { + br i1 true, label %a, label %b + +a: + %x = extractvalue { i32, i32 } undef, 0 + br label %b + +b: + ret void +} + +; CHECK-LABEL: @ifThen_insertvalue( +; CHECK: insertvalue +; CHECK: br i1 true +define void @ifThen_insertvalue() { + br i1 true, label %a, label %b + +a: + %x = insertvalue { i32, i32 } undef, i32 undef, 0 + br label %b + +b: + ret void +} + Index: test/Transforms/SpeculativeExecution/spec-vector.ll =================================================================== --- /dev/null +++ test/Transforms/SpeculativeExecution/spec-vector.ll @@ -0,0 +1,73 @@ +; RUN: opt < %s -S -speculative-execution \ +; RUN: -spec-exec-max-speculation-cost 4 -spec-exec-max-not-hoisted 3 \ +; RUN: | FileCheck %s + +; CHECK-LABEL: @ifThen_extractelement_constindex( +; CHECK: extractelement +; CHECK: br i1 true +define void @ifThen_extractelement_constindex() { + br i1 true, label %a, label %b + +a: + %x = extractelement <4 x i32> undef, i32 0 + br label %b + +b: + ret void +} + +; CHECK-LABEL: @ifThen_extractelement_varindex( +; CHECK: br i1 true +; CHECK: extractelement +define void @ifThen_extractelement_varindex(i32 %idx) { + br i1 true, label %a, label %b + +a: + %x = extractelement <4 x i32> undef, i32 %idx + br label %b + +b: + ret void +} + +; CHECK-LABEL: @ifThen_insertelement_constindex( +; CHECK: insertelement +; CHECK: br i1 true +define void @ifThen_insertelement_constindex() { + br i1 true, label %a, label %b + +a: + %x = insertelement <4 x i32> undef, i32 undef, i32 0 + br label %b + +b: + ret void +} + +; CHECK-LABEL: @ifThen_insertelement_varindex( +; CHECK: br i1 true +; CHECK: insertelement +define void @ifThen_insertelement_varindex(i32 %idx) { + br i1 true, label %a, label %b + +a: + %x = insertelement <4 x i32> undef, i32 undef, i32 %idx + br label %b + +b: + ret void +} + +; CHECK-LABEL: @ifThen_shufflevector( +; CHECK: shufflevector +; CHECK: br i1 true +define void @ifThen_shufflevector() { + br i1 true, label %a, label %b + +a: + %x = shufflevector <4 x i32> undef, <4 x i32> undef, <4 x i32> undef + br label %b + +b: + ret void +}