1*0b57cec5SDimitry Andric //===-- SystemZConstantPoolValue.cpp - SystemZ constant-pool value --------===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric #include "SystemZConstantPoolValue.h" 10*0b57cec5SDimitry Andric #include "llvm/ADT/FoldingSet.h" 11*0b57cec5SDimitry Andric #include "llvm/IR/DerivedTypes.h" 12*0b57cec5SDimitry Andric #include "llvm/IR/GlobalValue.h" 13*0b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 14*0b57cec5SDimitry Andric 15*0b57cec5SDimitry Andric using namespace llvm; 16*0b57cec5SDimitry Andric 17*0b57cec5SDimitry Andric SystemZConstantPoolValue:: 18*0b57cec5SDimitry Andric SystemZConstantPoolValue(const GlobalValue *gv, 19*0b57cec5SDimitry Andric SystemZCP::SystemZCPModifier modifier) 20*0b57cec5SDimitry Andric : MachineConstantPoolValue(gv->getType()), GV(gv), Modifier(modifier) {} 21*0b57cec5SDimitry Andric 22*0b57cec5SDimitry Andric SystemZConstantPoolValue * 23*0b57cec5SDimitry Andric SystemZConstantPoolValue::Create(const GlobalValue *GV, 24*0b57cec5SDimitry Andric SystemZCP::SystemZCPModifier Modifier) { 25*0b57cec5SDimitry Andric return new SystemZConstantPoolValue(GV, Modifier); 26*0b57cec5SDimitry Andric } 27*0b57cec5SDimitry Andric 28*0b57cec5SDimitry Andric int SystemZConstantPoolValue:: 29*0b57cec5SDimitry Andric getExistingMachineCPValue(MachineConstantPool *CP, unsigned Alignment) { 30*0b57cec5SDimitry Andric unsigned AlignMask = Alignment - 1; 31*0b57cec5SDimitry Andric const std::vector<MachineConstantPoolEntry> &Constants = CP->getConstants(); 32*0b57cec5SDimitry Andric for (unsigned I = 0, E = Constants.size(); I != E; ++I) { 33*0b57cec5SDimitry Andric if (Constants[I].isMachineConstantPoolEntry() && 34*0b57cec5SDimitry Andric (Constants[I].getAlignment() & AlignMask) == 0) { 35*0b57cec5SDimitry Andric auto *ZCPV = 36*0b57cec5SDimitry Andric static_cast<SystemZConstantPoolValue *>(Constants[I].Val.MachineCPVal); 37*0b57cec5SDimitry Andric if (ZCPV->GV == GV && ZCPV->Modifier == Modifier) 38*0b57cec5SDimitry Andric return I; 39*0b57cec5SDimitry Andric } 40*0b57cec5SDimitry Andric } 41*0b57cec5SDimitry Andric return -1; 42*0b57cec5SDimitry Andric } 43*0b57cec5SDimitry Andric 44*0b57cec5SDimitry Andric void SystemZConstantPoolValue::addSelectionDAGCSEId(FoldingSetNodeID &ID) { 45*0b57cec5SDimitry Andric ID.AddPointer(GV); 46*0b57cec5SDimitry Andric ID.AddInteger(Modifier); 47*0b57cec5SDimitry Andric } 48*0b57cec5SDimitry Andric 49*0b57cec5SDimitry Andric void SystemZConstantPoolValue::print(raw_ostream &O) const { 50*0b57cec5SDimitry Andric O << GV << "@" << int(Modifier); 51*0b57cec5SDimitry Andric } 52