From c3c04b04b092012ed59d313ee8c2f627136fa50f Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Tue, 28 Jul 2015 16:25:32 +0000 Subject: [PATCH] [CodeGen] Simplify creation of shuffle masks. No functional change intended. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243439 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Expr.h | 2 +- lib/AST/Expr.cpp | 2 +- lib/CodeGen/CGExpr.cpp | 41 +++++++----------------------------- lib/CodeGen/CGExprScalar.cpp | 8 ++----- 4 files changed, 12 insertions(+), 41 deletions(-) diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 5ff0e7083a..3cc4b7d009 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -4611,7 +4611,7 @@ public: /// getEncodedElementAccess - Encode the elements accessed into an llvm /// aggregate Constant of ConstantInt(s). - void getEncodedElementAccess(SmallVectorImpl &Elts) const; + void getEncodedElementAccess(SmallVectorImpl &Elts) const; SourceLocation getLocStart() const LLVM_READONLY { return getBase()->getLocStart(); diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 55fc6a3f91..4882f536d5 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -3472,7 +3472,7 @@ bool ExtVectorElementExpr::containsDuplicateElements() const { /// getEncodedElementAccess - We encode the fields as a llvm ConstantArray. void ExtVectorElementExpr::getEncodedElementAccess( - SmallVectorImpl &Elts) const { + SmallVectorImpl &Elts) const { StringRef Comp = Accessor->getName(); if (Comp[0] == 's' || Comp[0] == 'S') Comp = Comp.substr(1); diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 27fba46cfc..0ee144cb68 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -1147,16 +1147,8 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(llvm::Value *Addr, bool Volatile, llvm::Value *LoadVal = Builder.CreateLoad(Cast, Volatile, "loadVec4"); // Shuffle vector to get vec3. - llvm::Constant *Mask[] = { - llvm::ConstantInt::get(llvm::Type::getInt32Ty(getLLVMContext()), 0), - llvm::ConstantInt::get(llvm::Type::getInt32Ty(getLLVMContext()), 1), - llvm::ConstantInt::get(llvm::Type::getInt32Ty(getLLVMContext()), 2) - }; - - llvm::Value *MaskV = llvm::ConstantVector::get(Mask); - V = Builder.CreateShuffleVector(LoadVal, - llvm::UndefValue::get(vec4Ty), - MaskV, "extractVec"); + V = Builder.CreateShuffleVector(LoadVal, llvm::UndefValue::get(vec4Ty), + {0, 1, 2}, "extractVec"); return EmitFromMemory(V, Ty); } } @@ -1253,18 +1245,10 @@ void CodeGenFunction::EmitStoreOfScalar(llvm::Value *Value, llvm::Value *Addr, auto *VecTy = cast(SrcTy); // Handle vec3 special. if (VecTy->getNumElements() == 3) { - llvm::LLVMContext &VMContext = getLLVMContext(); - // Our source is a vec3, do a shuffle vector to make it a vec4. - SmallVector Mask; - Mask.push_back(llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), - 0)); - Mask.push_back(llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), - 1)); - Mask.push_back(llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), - 2)); - Mask.push_back(llvm::UndefValue::get(llvm::Type::getInt32Ty(VMContext))); - + llvm::Constant *Mask[] = {Builder.getInt32(0), Builder.getInt32(1), + Builder.getInt32(2), + llvm::UndefValue::get(Builder.getInt32Ty())}; llvm::Value *MaskV = llvm::ConstantVector::get(Mask); Value = Builder.CreateShuffleVector(Value, llvm::UndefValue::get(VecTy), @@ -2573,16 +2557,6 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E, return LV; } -static -llvm::Constant *GenerateConstantVector(CGBuilderTy &Builder, - SmallVectorImpl &Elts) { - SmallVector CElts; - for (unsigned i = 0, e = Elts.size(); i != e; ++i) - CElts.push_back(Builder.getInt32(Elts[i])); - - return llvm::ConstantVector::get(CElts); -} - LValue CodeGenFunction:: EmitExtVectorElementExpr(const ExtVectorElementExpr *E) { // Emit the base vector as an l-value. @@ -2617,11 +2591,12 @@ EmitExtVectorElementExpr(const ExtVectorElementExpr *E) { E->getType().withCVRQualifiers(Base.getQuals().getCVRQualifiers()); // Encode the element access list into a vector of unsigned indices. - SmallVector Indices; + SmallVector Indices; E->getEncodedElementAccess(Indices); if (Base.isSimple()) { - llvm::Constant *CV = GenerateConstantVector(Builder, Indices); + llvm::Constant *CV = + llvm::ConstantDataVector::get(getLLVMContext(), Indices); return LValue::MakeExtVectorElt(Base.getAddress(), CV, type, Base.getAlignment()); } diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index c73f118931..f3e4836213 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -1003,14 +1003,10 @@ Value *ScalarExprEmitter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) { } llvm::VectorType *MTy = cast(Mask->getType()); - llvm::Constant* EltMask; - - EltMask = llvm::ConstantInt::get(MTy->getElementType(), - llvm::NextPowerOf2(LHSElts-1)-1); // Mask off the high bits of each shuffle index. - Value *MaskBits = llvm::ConstantVector::getSplat(MTy->getNumElements(), - EltMask); + Value *MaskBits = + llvm::ConstantInt::get(MTy, llvm::NextPowerOf2(LHSElts - 1) - 1); Mask = Builder.CreateAnd(Mask, MaskBits, "mask"); // newv = undef -- 2.40.0