10b57cec5SDimitry Andric //===-- SystemZConstantPoolValue.cpp - SystemZ constant-pool value --------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "SystemZConstantPoolValue.h" 100b57cec5SDimitry Andric #include "llvm/ADT/FoldingSet.h" 110b57cec5SDimitry Andric #include "llvm/IR/DerivedTypes.h" 120b57cec5SDimitry Andric #include "llvm/IR/GlobalValue.h" 130b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 140b57cec5SDimitry Andric 150b57cec5SDimitry Andric using namespace llvm; 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric SystemZConstantPoolValue:: 180b57cec5SDimitry Andric SystemZConstantPoolValue(const GlobalValue *gv, 190b57cec5SDimitry Andric SystemZCP::SystemZCPModifier modifier) 200b57cec5SDimitry Andric : MachineConstantPoolValue(gv->getType()), GV(gv), Modifier(modifier) {} 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric SystemZConstantPoolValue * 230b57cec5SDimitry Andric SystemZConstantPoolValue::Create(const GlobalValue *GV, 240b57cec5SDimitry Andric SystemZCP::SystemZCPModifier Modifier) { 250b57cec5SDimitry Andric return new SystemZConstantPoolValue(GV, Modifier); 260b57cec5SDimitry Andric } 270b57cec5SDimitry Andric 28*5ffd83dbSDimitry Andric int SystemZConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP, 29*5ffd83dbSDimitry Andric Align Alignment) { 300b57cec5SDimitry Andric const std::vector<MachineConstantPoolEntry> &Constants = CP->getConstants(); 310b57cec5SDimitry Andric for (unsigned I = 0, E = Constants.size(); I != E; ++I) { 320b57cec5SDimitry Andric if (Constants[I].isMachineConstantPoolEntry() && 33*5ffd83dbSDimitry Andric Constants[I].getAlign() >= Alignment) { 340b57cec5SDimitry Andric auto *ZCPV = 350b57cec5SDimitry Andric static_cast<SystemZConstantPoolValue *>(Constants[I].Val.MachineCPVal); 360b57cec5SDimitry Andric if (ZCPV->GV == GV && ZCPV->Modifier == Modifier) 370b57cec5SDimitry Andric return I; 380b57cec5SDimitry Andric } 390b57cec5SDimitry Andric } 400b57cec5SDimitry Andric return -1; 410b57cec5SDimitry Andric } 420b57cec5SDimitry Andric 430b57cec5SDimitry Andric void SystemZConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 440b57cec5SDimitry Andric ID.AddPointer(GV); 450b57cec5SDimitry Andric ID.AddInteger(Modifier); 460b57cec5SDimitry Andric } 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric void SystemZConstantPoolValue::print(raw_ostream &O) const { 490b57cec5SDimitry Andric O << GV << "@" << int(Modifier); 500b57cec5SDimitry Andric } 51