mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
db20f1e2c5
Instead, represent the mask as out-of-line data in the instruction. This should be more efficient in the places that currently use getShuffleVector(), and paves the way for further changes to add new shuffles for scalable vectors. This doesn't change the syntax in textual IR. And I don't currently plan to change the bitcode encoding in this patch, although we'll probably need to do something once we extend shufflevector for scalable types. I expect that once this is finished, we can then replace the raw "mask" with something more appropriate for scalable vectors. Not sure exactly what this looks like at the moment, but there are a few different ways we could handle it. Maybe we could try to describe specific shuffles. Or maybe we could define it in terms of a function to convert a fixed-length array into an appropriate scalable vector, using a "step", or something like that. Differential Revision: https://reviews.llvm.org/D72467
142 lines
7.1 KiB
C++
142 lines
7.1 KiB
C++
//===- IRBuilderFolder.h - Const folder interface for IRBuilder -*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines for constant folding interface used by IRBuilder.
|
|
// It is implemented by ConstantFolder (default), TargetFolder and NoFoler.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_IR_IRBUILDERFOLDER_H
|
|
#define LLVM_IR_IRBUILDERFOLDER_H
|
|
|
|
#include "llvm/ADT/ArrayRef.h"
|
|
#include "llvm/IR/InstrTypes.h"
|
|
#include "llvm/IR/Instruction.h"
|
|
|
|
namespace llvm {
|
|
|
|
/// IRBuilderFolder - Interface for constant folding in IRBuilder.
|
|
class IRBuilderFolder {
|
|
public:
|
|
virtual ~IRBuilderFolder();
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Binary Operators
|
|
//===--------------------------------------------------------------------===//
|
|
|
|
virtual Value *CreateAdd(Constant *LHS, Constant *RHS,
|
|
bool HasNUW = false, bool HasNSW = false) const = 0;
|
|
virtual Value *CreateFAdd(Constant *LHS, Constant *RHS) const = 0;
|
|
virtual Value *CreateSub(Constant *LHS, Constant *RHS,
|
|
bool HasNUW = false, bool HasNSW = false) const = 0;
|
|
virtual Value *CreateFSub(Constant *LHS, Constant *RHS) const = 0;
|
|
virtual Value *CreateMul(Constant *LHS, Constant *RHS,
|
|
bool HasNUW = false, bool HasNSW = false) const = 0;
|
|
virtual Value *CreateFMul(Constant *LHS, Constant *RHS) const = 0;
|
|
virtual Value *CreateUDiv(Constant *LHS, Constant *RHS,
|
|
bool isExact = false) const = 0;
|
|
virtual Value *CreateSDiv(Constant *LHS, Constant *RHS,
|
|
bool isExact = false) const = 0;
|
|
virtual Value *CreateFDiv(Constant *LHS, Constant *RHS) const = 0;
|
|
virtual Value *CreateURem(Constant *LHS, Constant *RHS) const = 0;
|
|
virtual Value *CreateSRem(Constant *LHS, Constant *RHS) const = 0;
|
|
virtual Value *CreateFRem(Constant *LHS, Constant *RHS) const = 0;
|
|
virtual Value *CreateShl(Constant *LHS, Constant *RHS,
|
|
bool HasNUW = false, bool HasNSW = false) const = 0;
|
|
virtual Value *CreateLShr(Constant *LHS, Constant *RHS,
|
|
bool isExact = false) const = 0;
|
|
virtual Value *CreateAShr(Constant *LHS, Constant *RHS,
|
|
bool isExact = false) const = 0;
|
|
virtual Value *CreateAnd(Constant *LHS, Constant *RHS) const = 0;
|
|
virtual Value *CreateOr(Constant *LHS, Constant *RHS) const = 0;
|
|
virtual Value *CreateXor(Constant *LHS, Constant *RHS) const = 0;
|
|
virtual Value *CreateBinOp(Instruction::BinaryOps Opc,
|
|
Constant *LHS, Constant *RHS) const = 0;
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Unary Operators
|
|
//===--------------------------------------------------------------------===//
|
|
|
|
virtual Value *CreateNeg(Constant *C,
|
|
bool HasNUW = false, bool HasNSW = false) const = 0;
|
|
virtual Value *CreateFNeg(Constant *C) const = 0;
|
|
virtual Value *CreateNot(Constant *C) const = 0;
|
|
virtual Value *CreateUnOp(Instruction::UnaryOps Opc, Constant *C) const = 0;
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Memory Instructions
|
|
//===--------------------------------------------------------------------===//
|
|
|
|
virtual Value *CreateGetElementPtr(Type *Ty, Constant *C,
|
|
ArrayRef<Constant *> IdxList) const = 0;
|
|
// This form of the function only exists to avoid ambiguous overload
|
|
// warnings about whether to convert Idx to ArrayRef<Constant *> or
|
|
// ArrayRef<Value *>.
|
|
virtual Value *CreateGetElementPtr(Type *Ty, Constant *C,
|
|
Constant *Idx) const = 0;
|
|
virtual Value *CreateGetElementPtr(Type *Ty, Constant *C,
|
|
ArrayRef<Value *> IdxList) const = 0;
|
|
virtual Value *CreateInBoundsGetElementPtr(
|
|
Type *Ty, Constant *C, ArrayRef<Constant *> IdxList) const = 0;
|
|
// This form of the function only exists to avoid ambiguous overload
|
|
// warnings about whether to convert Idx to ArrayRef<Constant *> or
|
|
// ArrayRef<Value *>.
|
|
virtual Value *CreateInBoundsGetElementPtr(Type *Ty, Constant *C,
|
|
Constant *Idx) const = 0;
|
|
virtual Value *CreateInBoundsGetElementPtr(
|
|
Type *Ty, Constant *C, ArrayRef<Value *> IdxList) const = 0;
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Cast/Conversion Operators
|
|
//===--------------------------------------------------------------------===//
|
|
|
|
virtual Value *CreateCast(Instruction::CastOps Op, Constant *C,
|
|
Type *DestTy) const = 0;
|
|
virtual Value *CreatePointerCast(Constant *C, Type *DestTy) const = 0;
|
|
virtual Value *CreatePointerBitCastOrAddrSpaceCast(Constant *C,
|
|
Type *DestTy) const = 0;
|
|
virtual Value *CreateIntCast(Constant *C, Type *DestTy,
|
|
bool isSigned) const = 0;
|
|
virtual Value *CreateFPCast(Constant *C, Type *DestTy) const = 0;
|
|
virtual Value *CreateBitCast(Constant *C, Type *DestTy) const = 0;
|
|
virtual Value *CreateIntToPtr(Constant *C, Type *DestTy) const = 0;
|
|
virtual Value *CreatePtrToInt(Constant *C, Type *DestTy) const = 0;
|
|
virtual Value *CreateZExtOrBitCast(Constant *C, Type *DestTy) const = 0;
|
|
virtual Value *CreateSExtOrBitCast(Constant *C, Type *DestTy) const = 0;
|
|
virtual Value *CreateTruncOrBitCast(Constant *C, Type *DestTy) const = 0;
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Compare Instructions
|
|
//===--------------------------------------------------------------------===//
|
|
|
|
virtual Value *CreateICmp(CmpInst::Predicate P, Constant *LHS,
|
|
Constant *RHS) const = 0;
|
|
virtual Value *CreateFCmp(CmpInst::Predicate P, Constant *LHS,
|
|
Constant *RHS) const = 0;
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Other Instructions
|
|
//===--------------------------------------------------------------------===//
|
|
|
|
virtual Value *CreateSelect(Constant *C, Constant *True,
|
|
Constant *False) const = 0;
|
|
virtual Value *CreateExtractElement(Constant *Vec, Constant *Idx) const = 0;
|
|
virtual Value *CreateInsertElement(Constant *Vec, Constant *NewElt,
|
|
Constant *Idx) const = 0;
|
|
virtual Value *CreateShuffleVector(Constant *V1, Constant *V2,
|
|
ArrayRef<int> Mask) const = 0;
|
|
virtual Value *CreateExtractValue(Constant *Agg,
|
|
ArrayRef<unsigned> IdxList) const = 0;
|
|
virtual Value *CreateInsertValue(Constant *Agg, Constant *Val,
|
|
ArrayRef<unsigned> IdxList) const = 0;
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_IR_IRBUILDERFOLDER_H
|