mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-21 20:12:56 +02:00
fc10df1b51
This uses the "runImpl" pattern to share code between the old and new PM. llvm-svn: 272757
52 lines
2.0 KiB
C++
52 lines
2.0 KiB
C++
//===---- AlignmentFromAssumptions.h ----------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements a ScalarEvolution-based transformation to set
|
|
// the alignments of load, stores and memory intrinsics based on the truth
|
|
// expressions of assume intrinsics. The primary motivation is to handle
|
|
// complex alignment assumptions that apply to vector loads and stores that
|
|
// appear after vectorization and unrolling.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TRANSFORMS_SCALAR_ALIGNMENTFROMASSUMPTIONS_H
|
|
#define LLVM_TRANSFORMS_SCALAR_ALIGNMENTFROMASSUMPTIONS_H
|
|
|
|
#include "llvm/Analysis/ScalarEvolution.h"
|
|
#include "llvm/IR/Function.h"
|
|
#include "llvm/IR/IntrinsicInst.h"
|
|
#include "llvm/IR/PassManager.h"
|
|
|
|
namespace llvm {
|
|
|
|
struct AlignmentFromAssumptionsPass
|
|
: public PassInfoMixin<AlignmentFromAssumptionsPass> {
|
|
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
|
|
|
|
// Glue for old PM.
|
|
bool runImpl(Function &F, AssumptionCache &AC, ScalarEvolution *SE_,
|
|
DominatorTree *DT_);
|
|
|
|
// For memory transfers, we need a common alignment for both the source and
|
|
// destination. If we have a new alignment for only one operand of a transfer
|
|
// instruction, save it in these maps. If we reach the other operand through
|
|
// another assumption later, then we may change the alignment at that point.
|
|
DenseMap<MemTransferInst *, unsigned> NewDestAlignments, NewSrcAlignments;
|
|
|
|
ScalarEvolution *SE = nullptr;
|
|
DominatorTree *DT = nullptr;
|
|
|
|
bool extractAlignmentInfo(CallInst *I, Value *&AAPtr, const SCEV *&AlignSCEV,
|
|
const SCEV *&OffSCEV);
|
|
bool processAssumption(CallInst *I);
|
|
};
|
|
}
|
|
|
|
#endif // LLVM_TRANSFORMS_SCALAR_ALIGNMENTFROMASSUMPTIONS_H
|