Author: rsmith Date: Mon Jun 13 20:13:21 2016 New Revision: 272609 URL: http://llvm.org/viewvc/llvm-project?rev=272609&view=rev Log: Remove nonsense and simplify. To forward a reference, we always just load the pointer-to-pointer representing the parameter. An aggregate rvalue representing a pointer does not make sense.
We got away with this weirdness because CGCall happens to blindly load an RValue in aggregate form in this case, without checking whether an RValue for the type should be in scalar or aggregate form. Modified: cfe/trunk/lib/CodeGen/CGCall.cpp Modified: cfe/trunk/lib/CodeGen/CGCall.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=272609&r1=272608&r2=272609&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGCall.cpp (original) +++ cfe/trunk/lib/CodeGen/CGCall.cpp Mon Jun 13 20:13:21 2016 @@ -2865,23 +2865,15 @@ void CodeGenFunction::EmitDelegateCallAr QualType type = param->getType(); - // For the most part, we just need to load the alloca, except: - // 1) aggregate r-values are actually pointers to temporaries, and - // 2) references to non-scalars are pointers directly to the aggregate. - // I don't know why references to scalars are different here. - if (const ReferenceType *ref = type->getAs<ReferenceType>()) { - if (!hasScalarEvaluationKind(ref->getPointeeType())) - return args.add(RValue::getAggregate(local), type); - - // Locals which are references to scalars are represented - // with allocas holding the pointer. - return args.add(RValue::get(Builder.CreateLoad(local)), type); - } - assert(!isInAllocaArgument(CGM.getCXXABI(), type) && "cannot emit delegate call arguments for inalloca arguments!"); - args.add(convertTempToRValue(local, type, loc), type); + // For the most part, we just need to load the alloca, except that + // aggregate r-values are actually pointers to temporaries. + if (type->isReferenceType()) + args.add(RValue::get(Builder.CreateLoad(local)), type); + else + args.add(convertTempToRValue(local, type, loc), type); } static bool isProvablyNull(llvm::Value *addr) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits