[LLVMdev] store addrspace qualifier
Villmow, Micah
Micah.Villmow at amd.com
Thu Sep 18 08:42:04 PDT 2008
Mon Ping,
Thanks for the tip, but I can't for the life of me seem to get the
Value from a StoreSDNode. From looking at the SelectionDAGNodes header
file, the only class that has the getValue function call is
SrcValueSDNode that returns a Value type. The only class that has
getType is a ConstantPoolSDNode. I don't think that ConstantPoolSDNode
is what I want and when I try to cast the getBasePtr().Val of the
StoreSDNode to a SrcValueSDNode it asserts on:
Assertion failed: isa<X>(Val) && "cast<Ty>() argument of incompatible
type!"
This is what I'm attempting:
SDValue LangTargetLowering::LowerSTORE(SDValue Op, SelectionDAG& DAG){
const StoreSDNode* storeOp = dyn_cast<StoreSDNode>(Op.Val);
const SDValue& dstPtr = storeOp->getBasePtr();
const SrcValueSDNode* svdstVal = cast<SrcValueSDNode>(dstPtr.Val);
const Value* dstVal = svdstVal->getValue();
int addressSpace = ADDRESS_NONE;
const Type* dstType = dstVal->getType();
if (isa<PointerType>(dstType)) {
const PointerType* ptrType = cast<PointerType>(dstType);
addressSpace = ptrType->getAddressSpace();
}
printf("Addr: %d\n", addressSpace);
SDValue Res;
....
return Res;
}
Any idea what I'm doing wrong or how I can get this to work correctly?
Thanks,
Micah
________________________________
From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu]
On Behalf Of Mon Ping Wang
Sent: Wednesday, September 17, 2008 3:45 PM
To: LLVM Developers Mailing List
Subject: Re: [LLVMdev] store addrspace qualifier
The address qualifier is stored in the type of %result. From that
operand, you can get the Value and then call getType. The type for
result should be a PointerType which you cast to a PointerType and get
the getAddressSpace e.g. cast<PointerType>(Ty)->getAddressSpace()
-- Mon Ping
On Sep 17, 2008, at 1:06 PM, Villmow, Micah wrote:
How do I access the address qualifier from the store instruction.
Given the following code:
define void @test_unary_op_anegate(float %x, float addrspace(11)*
%result) nounwind {
entry:
%neg = sub float -0.000000e+000, %x ; <float>
[#uses=1]
store float %neg, float addrspace(11)* %result
ret void
}
When I attempt to generate this code, I'm aborting on.
Cannot yet select: 017E8230: ch = store 017E7DF0, 017E8098, 017E8010,
017E81A8 <0035A078:0> alignment=4
So I am doing a custom Store function.
In my LowerStore function, I get an SDValue w/ opcode of 119(store) and
4 child Operands
Operand 0 is the entry token which I assume I can ignore
Operand 1 is the source data(%neg), which I finally can handle correctly
thanks to Eli
Operand 2 is the dst location with two children, an EntryToken and
Register(%result I'm guessing)
Operand 3 is undef
So, how do I find out the address space? The reason being different
address spaces are accessed with different registers.
Thanks,
Micah Villmow
Systems Engineer
Advanced Technology & Performance
Advanced Micro Devices Inc.
4555 Great America Pkwy,
Santa Clara, CA. 95054
P: 408-572-6219
F: 408-572-6596
_______________________________________________
LLVM Developers mailing list
LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20080918/34a92294/attachment.html>
More information about the llvm-dev
mailing list