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 @@ -279,9 +279,6 @@ } } - if (TotalSpeculationCost == 0) - return false; // nothing to hoist - for (auto I = FromBlock.begin(); I != FromBlock.end();) { // We have to increment I before moving Current as moving Current // changes the list that I is iterating through. diff --git a/llvm/test/CodeGen/AMDGPU/speculative-execution-freecasts.ll b/llvm/test/CodeGen/AMDGPU/speculative-execution-freecasts.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/speculative-execution-freecasts.ll @@ -0,0 +1,30 @@ +; RUN: opt < %s -S -mtriple=amdgcn-unknown-amdhsa -speculative-execution \ +; RUN: -spec-exec-max-speculation-cost 1 -spec-exec-max-not-hoisted 1 \ +; RUN: | FileCheck %s + +; CHECK-LABEL: @ifThen_bitcast( +; CHECK: bitcast +; CHECK: br i1 true +define void @ifThen_bitcast(i32 %y) { + br i1 true, label %a, label %b + +a: + %x = bitcast i32 %y to float + br label %b + +b: + ret void +} + +; CHECK-LABEL: @ifThen_addrspacecast( +; CHECK: addrspacecast +; CHECK: br i1 true +define void @ifThen_addrspacecast(i32* %y) { + br i1 true, label %a, label %b +a: + %x = addrspacecast i32* %y to i32 addrspace(1)* + br label %b + +b: + ret void +}