forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move memory coercion functions from GVN.cpp to VNCoercion.cpp so they…
… can be shared between GVN and NewGVN. Summary: These are the functions used to determine when values of loads can be extracted from stores, etc, and to perform the necessary insertions to do this. There are no changes to the functions themselves except reformatting, and one case where memdep was informed of a removed load (which was pushed into the caller). Reviewers: davide Subscribers: mgorny, llvm-commits, Prazek Differential Revision: https://reviews.llvm.org/D30478 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297438 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
Showing
4 changed files
with
556 additions
and
447 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
//===- VNCoercion.h - Value Numbering Coercion Utilities --------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
/// \file / This file provides routines used by LLVM's value numbering passes to | ||
/// perform various forms of value extraction from memory when the types are not | ||
/// identical. For example, given | ||
/// | ||
/// store i32 8, i32 *%foo | ||
/// %a = bitcast i32 *%foo to i16 | ||
/// %val = load i16, i16 *%a | ||
/// | ||
/// It possible to extract the value of the load of %a from the store to %foo. | ||
/// These routines know how to tell whether they can do that (the analyze* | ||
/// routines), and can also insert the necessary IR to do it (the get* | ||
/// routines). | ||
|
||
#ifndef LLVM_TRANSFORMS_UTILS_VNCOERCION_H | ||
#define LLVM_TRANSFORMS_UTILS_VNCOERCION_H | ||
#include "llvm/IR/IRBuilder.h" | ||
|
||
namespace llvm { | ||
class Function; | ||
class StoreInst; | ||
class LoadInst; | ||
class MemIntrinsic; | ||
class Instruction; | ||
class Value; | ||
class Type; | ||
class DataLayout; | ||
namespace VNCoercion { | ||
/// Return true if CoerceAvailableValueToLoadType would succeed if it was | ||
/// called. | ||
bool canCoerceMustAliasedValueToLoad(Value *StoredVal, Type *LoadTy, | ||
const DataLayout &DL); | ||
|
||
/// If we saw a store of a value to memory, and then a load from a must-aliased | ||
/// pointer of a different type, try to coerce the stored value to the loaded | ||
/// type. LoadedTy is the type of the load we want to replace. IRB is | ||
/// IRBuilder used to insert new instructions. | ||
/// | ||
/// If we can't do it, return null. | ||
Value *coerceAvailableValueToLoadType(Value *StoredVal, Type *LoadedTy, | ||
IRBuilder<> &IRB, const DataLayout &DL); | ||
|
||
/// This function determines whether a value for the pointer LoadPtr can be | ||
/// extracted from the store at DepSI. | ||
/// | ||
/// On success, it returns the offset into DepSI that extraction would start. | ||
/// On failure, it returns -1. | ||
int analyzeLoadFromClobberingStore(Type *LoadTy, Value *LoadPtr, | ||
StoreInst *DepSI); | ||
|
||
/// This function determines whether a value for the pointer LoadPtr can be | ||
/// extracted from the load at DepLI. | ||
/// | ||
/// On success, it returns the offset into DepLI that extraction would start. | ||
/// On failure, it returns -1. | ||
int analyzeLoadFromClobberingLoad(Type *LoadTy, Value *LoadPtr, LoadInst *DepLI, | ||
const DataLayout &DL); | ||
|
||
/// This function determines whether a value for the pointer LoadPtr can be | ||
/// extracted from the memory intrinsic at DepMI. | ||
/// | ||
/// On success, it returns the offset into DepMI that extraction would start. | ||
/// On failure, it returns -1. | ||
int analyzeLoadFromClobberingMemInst(Type *LoadTy, Value *LoadPtr, | ||
MemIntrinsic *DepMI, const DataLayout &DL); | ||
|
||
/// If analyzeLoadFromClobberingStore returned an offset, this function can be | ||
/// used to actually perform the extraction of the bits from the store. It | ||
/// inserts instructions to do so at InsertPt, and returns the extracted value. | ||
Value *getStoreValueForLoad(Value *SrcVal, unsigned Offset, Type *LoadTy, | ||
Instruction *InsertPt, const DataLayout &DL); | ||
|
||
/// If analyzeLoadFromClobberingLoad returned an offset, this function can be | ||
/// used to actually perform the extraction of the bits from the load, including | ||
/// any necessary load widening. It inserts instructions to do so at InsertPt, | ||
/// and returns the extracted value. | ||
Value *getLoadValueForLoad(LoadInst *SrcVal, unsigned Offset, Type *LoadTy, | ||
Instruction *InsertPt); | ||
|
||
/// If analyzeLoadFromClobberingMemInst returned an offset, this function can be | ||
/// used to actually perform the extraction of the bits from the memory | ||
/// intrinsic. It inserts instructions to do so at InsertPt, and returns the | ||
/// extracted value. | ||
Value *getMemInstValueForLoad(MemIntrinsic *SrcInst, unsigned Offset, | ||
Type *LoadTy, Instruction *InsertPt, | ||
const DataLayout &DL); | ||
} | ||
} | ||
#endif |
Oops, something went wrong.