[llvm-commits] [llvm] r47348 - in /llvm/trunk: include/llvm/Instruction.def include/llvm/Instructions.h include/llvm/Support/InstVisitor.h lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/VMCore/Instructions.cpp lib/VMCore/Verifier.cpp
Devang Patel
dpatel at apple.com
Wed Feb 20 11:29:05 PST 2008
On Feb 19, 2008, at 8:16 PM, Chris Lattner wrote:
> On Feb 19, 2008, at 2:15 PM, Devang Patel wrote:
>> URL: http://llvm.org/viewvc/llvm-project?rev=47348&view=rev
>> Log:
>> Add GetResultInst. First step for multiple return value support.
>
> Woot! Please update LangRef.html though :)
sure. I'll update docs once things settle down.
>> +//
>> =
>> =
>> =
>> ----------------------------------------------------------------------=
>> ==//
>> +// GetResultInst Class
>> +//
>> =
>> =
>> =
>> ----------------------------------------------------------------------=
>> ==//
>> +
>> +/// GetResultInst - This instruction extracts individual result
>> value from
>> +/// aggregate value, where aggregate value is returned by CallInst.
>> +///
>
>>
>> + explicit GetResultInst(Value *Aggr, Value *Index,
>
> I think the Index should be specified as an unsigned, not a Value*.
> Supporting an arbitrary Value* means that we'd have to support codegen
> of getresult with a variable index. Since this isn't very useful to
> us, I suggest that we just make getresult take a single Value* and an
> unsigned constant that is the value to extract from.
okay, done.
>
>
>> + // getType - Get aggregate value element type
>> + inline const Type *getType() const {
>> + return Ops[0]->getType();
>> + }
>
> I don't think this is right: getType() on the getresult should return
> the scalar result type, not the input operand type.
yup. In fact I do not see any reason to override getType() here.
>
>
>>
>> + Value *getAggregateValue() {
>> + return getOperand(0);
>> + }
>
> Ok, it would also be nice to have a const version that returns a const
> Value*.
done
>
>
>> + const Value *geIndex() {
>> + return getOperand(1);
>> + }
>
> geIndex -> getIndex(),
oops. fixed.
> should also return an unsigned, as above.
ok
>
>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=47348&r1=47347&r2=47348&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =====================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
>> (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Feb
>> 19 16:15:16 2008
>> @@ -608,6 +608,10 @@
>>
>> void visitMemIntrinsic(CallInst &I, unsigned Op);
>>
>> + void visitGetResult(GetResultInst &I) {
>> + // FIXME
>
> Please make this: assert(0 && "getresult unimplemented");
sure
>
>
>> +//
>> =
>> =
>> =
>> ----------------------------------------------------------------------=
>> ==//
>> +// GetResultInst Implementation
>> +//
>> =
>> =
>> =
>> ----------------------------------------------------------------------=
>> ==//
>> +
>> +GetResultInst::GetResultInst(Value *Aggr, Value *Index,
>> + const std::string &Name,
>> + Instruction *InsertBef)
>> + : Instruction(Aggr->getType(),
>> + GetResult, Ops, 2, InsertBef) {
>
> The type of the instruction should be the type of the "Index" field in
> the Aggr struct, not the struct itself. If you have:
>
> %x = getresult { int, float} %y, 1
>
> the type of %x should be float, not {int,float}.
done
>
>
>> +void Verifier::visitGetResultInst(GetResultInst &GRI) {
>> + // FIXME : Check operands.
>> + visitInstruction(GRI);
>> +}
>
> I'd suggest checking isValidOperands here, and asserting that the
> result type of the getresult is the same as the respective field type
> of struct.
done.
Thanks for review!
-
Devang
More information about the llvm-commits
mailing list