blob: d60878370cff6e480bcf69ae9329a90d49b558aa [file] [log] [blame] [edit]
///////////////////////////////////////////////////////////////////////////////
// //
// HLUtil.h //
// Copyright (C) Microsoft Corporation. All rights reserved. //
// This file is distributed under the University of Illinois Open Source //
// License. See LICENSE.TXT for details. //
// //
// HL helper functions. //
// //
///////////////////////////////////////////////////////////////////////////////
#pragma once
#include "llvm/ADT/SetVector.h"
namespace llvm {
class Function;
class Value;
class MemCpyInst;
} // namespace llvm
namespace hlsl {
class DxilTypeSystem;
namespace hlutil {
struct PointerStatus {
/// Keep track of what stores to the pointer look like.
enum class StoredType {
/// There is no store to this pointer. It can thus be marked constant.
NotStored,
/// This ptr is a global, and is stored to, but the only thing stored is the
/// constant it
/// was initialized with. This is only tracked for scalar globals.
InitializerStored,
/// This ptr is stored to, but only its initializer and one other value
/// is ever stored to it. If this global isStoredOnce, we track the value
/// stored to it in StoredOnceValue below. This is only tracked for scalar
/// globals.
StoredOnce,
/// This ptr is only assigned by a memcpy.
MemcopyDestOnce,
/// This ptr is stored to by multiple values or something else that we
/// cannot track.
Stored
} storedType;
/// Keep track of what loaded from the pointer look like.
enum class LoadedType {
/// There is no load to this pointer. It can thus be marked constant.
NotLoaded,
/// This ptr is only used by a memcpy.
MemcopySrcOnce,
/// This ptr is loaded to by multiple instructions or something else that we
/// cannot track.
Loaded
} loadedType;
/// If only one value (besides the initializer constant) is ever stored to
/// this global, keep track of what value it is.
llvm::Value *StoredOnceValue;
/// Memcpy which this ptr is used.
llvm::SetVector<llvm::MemCpyInst *> memcpySet;
/// Memcpy which use this ptr as dest.
llvm::MemCpyInst *StoringMemcpy;
/// Memcpy which use this ptr as src.
llvm::MemCpyInst *LoadingMemcpy;
/// These start out null/false. When the first accessing function is noticed,
/// it is recorded. When a second different accessing function is noticed,
/// HasMultipleAccessingFunctions is set to true.
const llvm::Function *AccessingFunction;
bool HasMultipleAccessingFunctions;
/// Size of the ptr.
unsigned Size;
llvm::Value *Ptr;
// Just check load store.
bool bLoadStoreOnly;
void analyze(DxilTypeSystem &typeSys, bool bStructElt);
PointerStatus(llvm::Value *ptr, unsigned size, bool bLdStOnly);
void MarkAsStored();
void MarkAsLoaded();
bool HasStored();
bool HasLoaded();
};
} // namespace hlutil
} // namespace hlsl