From 0e2a4a78908fcea0460dc2efe2c4a26b42ccea9b Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 28 Apr 2007 06:08:13 +0000 Subject: [PATCH] Fix CodeGen/Generic/2007-04-27-LargeMemObject.ll and CodeGen/Generic/2007-04-27-InlineAsm-X-Dest.ll llvm-svn: 36534 --- lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 4e57a7b36aa..829dae50d1f 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -3210,16 +3210,22 @@ void SelectionDAGLowering::visitInlineAsm(CallInst &I) { switch (Constraints[i].Type) { case InlineAsm::isOutput: if (!Constraints[i].isIndirect) { + // The return value of the call is this value. assert(I.getType() != Type::VoidTy && "Bad inline asm!"); OpVT = TLI.getValueType(I.getType()); } else { const Type *OpTy = I.getOperand(OpNum)->getType(); - OpVT = TLI.getValueType(cast(OpTy)->getElementType()); + OpVT = TLI.getValueType(cast(OpTy)->getElementType(),true); OpNum++; // Consumes a call operand. } break; case InlineAsm::isInput: - OpVT = TLI.getValueType(I.getOperand(OpNum)->getType()); + if (!Constraints[i].isIndirect) { + OpVT = TLI.getValueType(I.getOperand(OpNum)->getType()); + } else { + const Type *OpTy = I.getOperand(OpNum)->getType(); + OpVT = TLI.getValueType(cast(OpTy)->getElementType(),true); + } OpNum++; // Consumes a call operand. break; case InlineAsm::isClobber: @@ -3275,8 +3281,8 @@ void SelectionDAGLowering::visitInlineAsm(CallInst &I) { if (ConstraintCode.size() == 1) // not a physreg name. CTy = TLI.getConstraintType(ConstraintCode); - if (CTy == TargetLowering::C_Memory) { - // Memory output. + if (CTy != TargetLowering::C_RegisterClass) { + // Memory output, or 'other' output (e.g. 'X' constraint). SDOperand InOperandVal = getValue(I.getOperand(OpNum)); // Check that the operand (the address to store to) isn't a float.