| //===-- SystemZConstantPoolValue.cpp - SystemZ constant-pool value --------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "SystemZConstantPoolValue.h" |
| #include "llvm/ADT/FoldingSet.h" |
| #include "llvm/IR/DerivedTypes.h" |
| #include "llvm/IR/GlobalValue.h" |
| #include "llvm/Support/raw_ostream.h" |
| |
| using namespace llvm; |
| |
| SystemZConstantPoolValue:: |
| SystemZConstantPoolValue(const GlobalValue *gv, |
| SystemZCP::SystemZCPModifier modifier) |
| : MachineConstantPoolValue(gv->getType()), GV(gv), Modifier(modifier) {} |
| |
| SystemZConstantPoolValue * |
| SystemZConstantPoolValue::Create(const GlobalValue *GV, |
| SystemZCP::SystemZCPModifier Modifier) { |
| return new SystemZConstantPoolValue(GV, Modifier); |
| } |
| |
| int SystemZConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP, |
| Align Alignment) { |
| const std::vector<MachineConstantPoolEntry> &Constants = CP->getConstants(); |
| for (unsigned I = 0, E = Constants.size(); I != E; ++I) { |
| if (Constants[I].isMachineConstantPoolEntry() && |
| Constants[I].getAlign() >= Alignment) { |
| auto *ZCPV = |
| static_cast<SystemZConstantPoolValue *>(Constants[I].Val.MachineCPVal); |
| if (ZCPV->GV == GV && ZCPV->Modifier == Modifier) |
| return I; |
| } |
| } |
| return -1; |
| } |
| |
| void SystemZConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) { |
| ID.AddPointer(GV); |
| ID.AddInteger(Modifier); |
| } |
| |
| void SystemZConstantPoolValue::print(raw_ostream &O) const { |
| O << GV << "@" << int(Modifier); |
| } |