1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

SpeculativeExecution: Allow speculating more inst types

Partial step towards removing the whitelist and only
using TTI's cost.

llvm-svn: 285438
This commit is contained in:
Matt Arsenault 2016-10-28 20:00:33 +00:00
parent 0536acc73b
commit c44a8a92e5
5 changed files with 336 additions and 0 deletions

View File

@ -224,6 +224,24 @@ static unsigned ComputeSpeculationCost(const Instruction *I,
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:

View File

@ -0,0 +1,64 @@
; 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
}

View File

@ -0,0 +1,136 @@
; 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
}

View File

@ -0,0 +1,31 @@
; 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
}

View File

@ -0,0 +1,87 @@
; 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
}