Skip to content

Commit 5ac9179

Browse files
committedMar 10, 2017
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 llvm-svn: 297438
1 parent 22645ee commit 5ac9179

File tree

4 files changed

+556
-447
lines changed

4 files changed

+556
-447
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
//===- VNCoercion.h - Value Numbering Coercion Utilities --------*- C++ -*-===//
2+
//
3+
// The LLVM Compiler Infrastructure
4+
//
5+
// This file is distributed under the University of Illinois Open Source
6+
// License. See LICENSE.TXT for details.
7+
//
8+
//===----------------------------------------------------------------------===//
9+
/// \file / This file provides routines used by LLVM's value numbering passes to
10+
/// perform various forms of value extraction from memory when the types are not
11+
/// identical. For example, given
12+
///
13+
/// store i32 8, i32 *%foo
14+
/// %a = bitcast i32 *%foo to i16
15+
/// %val = load i16, i16 *%a
16+
///
17+
/// It possible to extract the value of the load of %a from the store to %foo.
18+
/// These routines know how to tell whether they can do that (the analyze*
19+
/// routines), and can also insert the necessary IR to do it (the get*
20+
/// routines).
21+
22+
#ifndef LLVM_TRANSFORMS_UTILS_VNCOERCION_H
23+
#define LLVM_TRANSFORMS_UTILS_VNCOERCION_H
24+
#include "llvm/IR/IRBuilder.h"
25+
26+
namespace llvm {
27+
class Function;
28+
class StoreInst;
29+
class LoadInst;
30+
class MemIntrinsic;
31+
class Instruction;
32+
class Value;
33+
class Type;
34+
class DataLayout;
35+
namespace VNCoercion {
36+
/// Return true if CoerceAvailableValueToLoadType would succeed if it was
37+
/// called.
38+
bool canCoerceMustAliasedValueToLoad(Value *StoredVal, Type *LoadTy,
39+
const DataLayout &DL);
40+
41+
/// If we saw a store of a value to memory, and then a load from a must-aliased
42+
/// pointer of a different type, try to coerce the stored value to the loaded
43+
/// type. LoadedTy is the type of the load we want to replace. IRB is
44+
/// IRBuilder used to insert new instructions.
45+
///
46+
/// If we can't do it, return null.
47+
Value *coerceAvailableValueToLoadType(Value *StoredVal, Type *LoadedTy,
48+
IRBuilder<> &IRB, const DataLayout &DL);
49+
50+
/// This function determines whether a value for the pointer LoadPtr can be
51+
/// extracted from the store at DepSI.
52+
///
53+
/// On success, it returns the offset into DepSI that extraction would start.
54+
/// On failure, it returns -1.
55+
int analyzeLoadFromClobberingStore(Type *LoadTy, Value *LoadPtr,
56+
StoreInst *DepSI);
57+
58+
/// This function determines whether a value for the pointer LoadPtr can be
59+
/// extracted from the load at DepLI.
60+
///
61+
/// On success, it returns the offset into DepLI that extraction would start.
62+
/// On failure, it returns -1.
63+
int analyzeLoadFromClobberingLoad(Type *LoadTy, Value *LoadPtr, LoadInst *DepLI,
64+
const DataLayout &DL);
65+
66+
/// This function determines whether a value for the pointer LoadPtr can be
67+
/// extracted from the memory intrinsic at DepMI.
68+
///
69+
/// On success, it returns the offset into DepMI that extraction would start.
70+
/// On failure, it returns -1.
71+
int analyzeLoadFromClobberingMemInst(Type *LoadTy, Value *LoadPtr,
72+
MemIntrinsic *DepMI, const DataLayout &DL);
73+
74+
/// If analyzeLoadFromClobberingStore returned an offset, this function can be
75+
/// used to actually perform the extraction of the bits from the store. It
76+
/// inserts instructions to do so at InsertPt, and returns the extracted value.
77+
Value *getStoreValueForLoad(Value *SrcVal, unsigned Offset, Type *LoadTy,
78+
Instruction *InsertPt, const DataLayout &DL);
79+
80+
/// If analyzeLoadFromClobberingLoad returned an offset, this function can be
81+
/// used to actually perform the extraction of the bits from the load, including
82+
/// any necessary load widening. It inserts instructions to do so at InsertPt,
83+
/// and returns the extracted value.
84+
Value *getLoadValueForLoad(LoadInst *SrcVal, unsigned Offset, Type *LoadTy,
85+
Instruction *InsertPt);
86+
87+
/// If analyzeLoadFromClobberingMemInst returned an offset, this function can be
88+
/// used to actually perform the extraction of the bits from the memory
89+
/// intrinsic. It inserts instructions to do so at InsertPt, and returns the
90+
/// extracted value.
91+
Value *getMemInstValueForLoad(MemIntrinsic *SrcInst, unsigned Offset,
92+
Type *LoadTy, Instruction *InsertPt,
93+
const DataLayout &DL);
94+
}
95+
}
96+
#endif

0 commit comments

Comments
 (0)
Please sign in to comment.