[llvm] r268003 - [LoopVectorize] Add operand bundles to vectorized functions
David Majnemer via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 29 00:09:48 PDT 2016
Author: majnemer
Date: Fri Apr 29 02:09:48 2016
New Revision: 268003
URL: http://llvm.org/viewvc/llvm-project?rev=268003&view=rev
Log:
[LoopVectorize] Add operand bundles to vectorized functions
Also, do not crash when calculating a cost model for loop-invariant
token values.
Added:
llvm/trunk/test/Transforms/LoopVectorize/X86/funclet.ll
Modified:
llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
Modified: llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp?rev=268003&r1=268002&r2=268003&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp (original)
+++ llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp Fri Apr 29 02:09:48 2016
@@ -1563,8 +1563,7 @@ public:
/// \return Returns information about the register usages of the loop for the
/// given vectorization factors.
- SmallVector<RegisterUsage, 8>
- calculateRegisterUsage(const SmallVector<unsigned, 8> &VFs);
+ SmallVector<RegisterUsage, 8> calculateRegisterUsage(ArrayRef<unsigned> VFs);
private:
/// The vectorization cost is a combination of the cost itself and a boolean
@@ -4341,7 +4340,9 @@ void InnerLoopVectorizer::vectorizeBlock
}
assert(VectorF && "Can't create vector function.");
- CallInst *V = Builder.CreateCall(VectorF, Args);
+ SmallVector<OperandBundleDef, 1> OpBundles;
+ CI->getOperandBundlesAsDefs(OpBundles);
+ CallInst *V = Builder.CreateCall(VectorF, Args, OpBundles);
if (isa<FPMathOperator>(V))
V->copyFastMathFlags(CI);
@@ -5509,8 +5510,7 @@ unsigned LoopVectorizationCostModel::sel
}
SmallVector<LoopVectorizationCostModel::RegisterUsage, 8>
-LoopVectorizationCostModel::calculateRegisterUsage(
- const SmallVector<unsigned, 8> &VFs) {
+LoopVectorizationCostModel::calculateRegisterUsage(ArrayRef<unsigned> VFs) {
// This function calculates the register usage by measuring the highest number
// of values that are alive at a single location. Obviously, this is a very
// rough estimation. We scan the loop in a topological order in order and
@@ -5602,6 +5602,8 @@ LoopVectorizationCostModel::calculateReg
// A lambda that gets the register usage for the given type and VF.
auto GetRegUsage = [&DL, WidestRegister](Type *Ty, unsigned VF) {
+ if (Ty->isTokenTy())
+ return 0U;
unsigned TypeSize = DL.getTypeSizeInBits(Ty->getScalarType());
return std::max<unsigned>(1, VF * TypeSize / WidestRegister);
};
Added: llvm/trunk/test/Transforms/LoopVectorize/X86/funclet.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopVectorize/X86/funclet.ll?rev=268003&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/LoopVectorize/X86/funclet.ll (added)
+++ llvm/trunk/test/Transforms/LoopVectorize/X86/funclet.ll Fri Apr 29 02:09:48 2016
@@ -0,0 +1,45 @@
+; RUN: opt -S -loop-vectorize < %s | FileCheck %s
+target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
+target triple = "i686-pc-windows-msvc18.0.0"
+
+define void @test1() #0 personality i32 (...)* @__CxxFrameHandler3 {
+entry:
+ invoke void @_CxxThrowException(i8* null, i8* null)
+ to label %unreachable unwind label %catch.dispatch
+
+catch.dispatch: ; preds = %entry
+ %0 = catchswitch within none [label %catch] unwind to caller
+
+catch: ; preds = %catch.dispatch
+ %1 = catchpad within %0 [i8* null, i32 64, i8* null]
+ br label %for.body
+
+for.cond.cleanup: ; preds = %for.body
+ catchret from %1 to label %try.cont
+
+for.body: ; preds = %for.body, %catch
+ %i.07 = phi i32 [ 0, %catch ], [ %inc, %for.body ]
+ %call = call double @floor(double 1.0) #1 [ "funclet"(token %1) ]
+ %inc = add nuw nsw i32 %i.07, 1
+ %exitcond = icmp eq i32 %inc, 1024
+ br i1 %exitcond, label %for.cond.cleanup, label %for.body
+
+try.cont: ; preds = %for.cond.cleanup
+ ret void
+
+unreachable: ; preds = %entry
+ unreachable
+}
+
+; CHECK-LABEL: define void @test1(
+; CHECK: %[[cpad:.*]] = catchpad within {{.*}} [i8* null, i32 64, i8* null]
+; CHECK: call <16 x double> @llvm.floor.v16f64(<16 x double> {{.*}}) [ "funclet"(token %[[cpad]]) ]
+
+declare x86_stdcallcc void @_CxxThrowException(i8*, i8*)
+
+declare i32 @__CxxFrameHandler3(...)
+
+declare double @floor(double) #1
+
+attributes #0 = { "target-features"="+sse2" }
+attributes #1 = { nounwind readnone }
More information about the llvm-commits
mailing list