| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- ///////////////////////////////////////////////////////////////////////////////
- // //
- // 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
|