From: Matt Arsenault Date: Fri, 28 Oct 2016 20:00:33 +0000 (+0000) Subject: SpeculativeExecution: Allow speculating more inst types X-Git-Tag: llvmorg-4.0.0-rc1~6001 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ef00283425e40d9e78129d28e0c8ad965c3ea66b;p=platform%2Fupstream%2Fllvm.git SpeculativeExecution: Allow speculating more inst types Partial step towards removing the whitelist and only using TTI's cost. llvm-svn: 285438 --- diff --git a/llvm/lib/Transforms/Scalar/SpeculativeExecution.cpp b/llvm/lib/Transforms/Scalar/SpeculativeExecution.cpp index 0b035ba..a7c308b 100644 --- a/llvm/lib/Transforms/Scalar/SpeculativeExecution.cpp +++ b/llvm/lib/Transforms/Scalar/SpeculativeExecution.cpp @@ -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: diff --git a/llvm/test/Transforms/SpeculativeExecution/spec-calls.ll b/llvm/test/Transforms/SpeculativeExecution/spec-calls.ll new file mode 100644 index 0000000..5fa9059 --- /dev/null +++ b/llvm/test/Transforms/SpeculativeExecution/spec-calls.ll @@ -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 +} diff --git a/llvm/test/Transforms/SpeculativeExecution/spec-casts.ll b/llvm/test/Transforms/SpeculativeExecution/spec-casts.ll new file mode 100644 index 0000000..c75d744 --- /dev/null +++ b/llvm/test/Transforms/SpeculativeExecution/spec-casts.ll @@ -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 +} diff --git a/llvm/test/Transforms/SpeculativeExecution/spec-compares.ll b/llvm/test/Transforms/SpeculativeExecution/spec-compares.ll new file mode 100644 index 0000000..0d97374 --- /dev/null +++ b/llvm/test/Transforms/SpeculativeExecution/spec-compares.ll @@ -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 +} diff --git a/llvm/test/Transforms/SpeculativeExecution/spec-fp.ll b/llvm/test/Transforms/SpeculativeExecution/spec-fp.ll new file mode 100644 index 0000000..efab8ab --- /dev/null +++ b/llvm/test/Transforms/SpeculativeExecution/spec-fp.ll @@ -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 +}