case Instruction::Xor:
case Instruction::ZExt:
case Instruction::SExt:
+ case Instruction::Call:
+ case Instruction::BitCast:
+ case Instruction::PtrToInt:
+ case Instruction::IntToPtr:
+ case Instruction::AddrSpaceCast:
+ case Instruction::FPToUI:
+ case Instruction::FPToSI:
+ case Instruction::UIToFP:
+ case Instruction::SIToFP:
+ case Instruction::FPExt:
+ case Instruction::FPTrunc:
+ case Instruction::FAdd:
+ case Instruction::FSub:
+ case Instruction::FMul:
+ case Instruction::FDiv:
+ case Instruction::FRem:
+ case Instruction::ICmp:
+ case Instruction::FCmp:
return TTI.getUserCost(I);
default:
--- /dev/null
+; RUN: opt < %s -S -speculative-execution \
+; RUN: -spec-exec-max-speculation-cost 4 -spec-exec-max-not-hoisted 3 \
+; RUN: | FileCheck %s
+
+declare float @llvm.fabs.f32(float) nounwind readnone
+declare i32 @llvm.ctlz.i32(i32, i1) nounwind readnone
+
+declare float @unknown(float)
+declare float @unknown_readnone(float) nounwind readnone
+
+; CHECK-LABEL: @ifThen_fabs(
+; CHECK: call float @llvm.fabs.f32(
+; CHECK: br i1 true
+define void @ifThen_fabs() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = call float @llvm.fabs.f32(float 1.0)
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_ctlz(
+; CHECK: call i32 @llvm.ctlz.i32(
+; CHECK: br i1 true
+define void @ifThen_ctlz() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = call i32 @llvm.ctlz.i32(i32 0, i1 true)
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_call_sideeffects(
+; CHECK: br i1 true
+; CHECK: call float @unknown(
+define void @ifThen_call_sideeffects() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = call float @unknown(float 1.0)
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_call_readnone(
+; CHECK: br i1 true
+; CHECK: call float @unknown_readnone(
+define void @ifThen_call_readnone() {
+ br i1 true, label %a, label %b
+a:
+ %x = call float @unknown_readnone(float 1.0)
+ br label %b
+
+b:
+ ret void
+}
--- /dev/null
+; 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_bitcast(
+; CHECK: bitcast
+; CHECK: br i1 true
+define void @ifThen_bitcast() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = bitcast i32 undef to float
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_ptrtoint(
+; CHECK: ptrtoint
+; CHECK: br i1 true
+define void @ifThen_ptrtoint() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = ptrtoint i32* undef to i64
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_inttoptr(
+; CHECK: inttoptr
+; CHECK: br i1 true
+define void @ifThen_inttoptr() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = inttoptr i64 undef to i32*
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_addrspacecast(
+; CHECK: addrspacecast
+; CHECK: br i1 true
+define void @ifThen_addrspacecast() {
+ br i1 true, label %a, label %b
+a:
+ %x = addrspacecast i32* undef to i32 addrspace(1)*
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_fptoui(
+; CHECK: fptoui
+; CHECK: br i1 true
+define void @ifThen_fptoui() {
+ br i1 true, label %a, label %b
+a:
+ %x = fptoui float undef to i32
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_fptosi(
+; CHECK: fptosi
+; CHECK: br i1 true
+define void @ifThen_fptosi() {
+ br i1 true, label %a, label %b
+a:
+ %x = fptosi float undef to i32
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_uitofp(
+; CHECK: uitofp
+; CHECK: br i1 true
+define void @ifThen_uitofp() {
+ br i1 true, label %a, label %b
+a:
+ %x = uitofp i32 undef to float
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_sitofp(
+; CHECK: sitofp
+; CHECK: br i1 true
+define void @ifThen_sitofp() {
+ br i1 true, label %a, label %b
+a:
+ %x = sitofp i32 undef to float
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_fpext(
+; CHECK: fpext
+; CHECK: br i1 true
+define void @ifThen_fpext() {
+ br i1 true, label %a, label %b
+a:
+ %x = fpext float undef to double
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_fptrunc(
+; CHECK: fptrunc
+; CHECK: br i1 true
+define void @ifThen_fptrunc() {
+ br i1 true, label %a, label %b
+a:
+ %x = fptrunc double undef to float
+ br label %b
+
+b:
+ ret void
+}
--- /dev/null
+; 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_icmp(
+; CHECK: icmp
+; CHECK: br i1 true
+define void @ifThen_icmp() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = icmp eq i32 undef, undef
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_fcmp(
+; CHECK: fcmp
+; CHECK: br i1 true
+define void @ifThen_fcmp() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = fcmp oeq float undef, undef
+ br label %b
+
+b:
+ ret void
+}
--- /dev/null
+; 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_fadd(
+; CHECK: fadd
+; CHECK: br i1 true
+define void @ifThen_fadd() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = fadd float undef, undef
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_fsub(
+; CHECK: fsub
+; CHECK: br i1 true
+define void @ifThen_fsub() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = fsub float undef, undef
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_fneg(
+; CHECK: fsub float -0.0
+; CHECK: br i1 true
+define void @ifThen_fneg() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = fsub float -0.0, undef
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_fmul(
+; CHECK: fmul
+; CHECK: br i1 true
+define void @ifThen_fmul() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = fmul float undef, undef
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_fdiv(
+; CHECK: fdiv
+; CHECK: br i1 true
+define void @ifThen_fdiv() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = fdiv float undef, undef
+ br label %b
+
+b:
+ ret void
+}
+
+; CHECK-LABEL: @ifThen_frem(
+; CHECK: frem
+; CHECK: br i1 true
+define void @ifThen_frem() {
+ br i1 true, label %a, label %b
+
+a:
+ %x = frem float undef, undef
+ br label %b
+
+b:
+ ret void
+}