Thanks Nakamura! Michael
On Jan 13, 2013, at 3:30 AM, NAKAMURA Takumi <[email protected]> wrote: > 2013/1/13 Michael Gottesman <[email protected]>: >> Author: mgottesman >> Date: Sat Jan 12 20:22:39 2013 >> New Revision: 172341 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=172341&view=rev >> Log: >> Added builtins for multiprecision adds. >> >> We lower all of these intrinsics into a 2x chained usage of >> uadd.with.overflow. >> >> Added: >> cfe/trunk/test/CodeGen/builtins-multipercision.c >> Modified: >> cfe/trunk/include/clang/Basic/Builtins.def >> cfe/trunk/lib/CodeGen/CGBuiltin.cpp >> >> Modified: cfe/trunk/include/clang/Basic/Builtins.def >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Builtins.def?rev=172341&r1=172340&r2=172341&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/Basic/Builtins.def (original) >> +++ cfe/trunk/include/clang/Basic/Builtins.def Sat Jan 12 20:22:39 2013 >> @@ -925,5 +925,11 @@ >> // Annotation function >> BUILTIN(__builtin_annotation, "v.", "tn") >> >> +// Multiprecision Arithmetic Builtins. >> +BUILTIN(__builtin_addcs, "UsUsCUsCUsCUs*", "n") >> +BUILTIN(__builtin_addc, "UiUiCUiCUiCUi*", "n") >> +BUILTIN(__builtin_addcl, "ULiULiCULiCULiCULi*", "n") >> +BUILTIN(__builtin_addcll, "ULLiULLiCULLiCULLiCULLi*", "n") >> + >> #undef BUILTIN >> #undef LIBBUILTIN >> >> Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=172341&r1=172340&r2=172341&view=diff >> ============================================================================== >> --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original) >> +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Sat Jan 12 20:22:39 2013 >> @@ -169,6 +169,31 @@ >> ReturnValueSlot(), E->arg_begin(), E->arg_end(), Fn); >> } >> >> +/// \brief Emit a call to >> llvm.{sadd,uadd,ssub,usub,smul,umul}.with.overflow.* >> +/// depending on IntrinsicID. >> +/// >> +/// \arg CGF The current codegen function. >> +/// \arg IntrinsicID The ID for the Intrinsic we wish to generate. >> +/// \arg X The first argument to the llvm.*.with.overflow.*. >> +/// \arg Y The second argument to the llvm.*.with.overflow.*. >> +/// \arg Carry The carry returned by the llvm.*.with.overflow.*. >> +/// \returns The result (i.e. sum/product) returned by the intrinsic. >> +static llvm::Value *EmitOverflowIntrinsic(CodeGenFunction &CGF, >> + const llvm::Intrinsic::ID >> IntrinsicID, >> + llvm::Value *X, llvm::Value *Y, >> + llvm::Value *&Carry) { >> + // Make sure we have integers of the same width. >> + assert(X->getType() == Y->getType() && >> + "Arguments must be the same type. (Did you forget to make sure >> both " >> + "arguments have the same integer width?)"); >> + >> + ArrayRef<llvm::Type *> Type(X->getType()); >> + llvm::Value *Callee = CGF.CGM.getIntrinsic(IntrinsicID, Type); > > You should not create ArrayRef with temporary value. Fixed in r172352. > > (Although the pointee of Type* is immutable, ArrayRef<Type*> holds "Type**") > > ...Takumi _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
