Nice, lgtm!
On Tue, Sep 2, 2014 at 1:10 PM, Tom Stellard <[email protected]> wrote: > Using the intrinsic allows the SelectionDAGBuilder to turn this call > into the FABS Node and also the intrinsic is something the vectorizer knows > how to vectorize. > > This patch also sets the readnone attribute on this call, which should > enable additional optmizations. > --- > lib/CodeGen/CGBuiltin.cpp | 21 ++++----------------- > test/CodeGen/builtins.c | 10 +++++----- > 2 files changed, 9 insertions(+), 22 deletions(-) > > diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp > index b74038e..9fde1dc 100644 > --- a/lib/CodeGen/CGBuiltin.cpp > +++ b/lib/CodeGen/CGBuiltin.cpp > @@ -145,23 +145,10 @@ static RValue EmitBinaryAtomicPost(CodeGenFunction > &CGF, > /// EmitFAbs - Emit a call to fabs/fabsf/fabsl, depending on the type of > ValTy, > /// which must be a scalar floating point type. > static Value *EmitFAbs(CodeGenFunction &CGF, Value *V, QualType ValTy) { > - const BuiltinType *ValTyP = ValTy->getAs<BuiltinType>(); > - assert(ValTyP && "isn't scalar fp type!"); > - > - StringRef FnName; > - switch (ValTyP->getKind()) { > - default: llvm_unreachable("Isn't a scalar fp type!"); > - case BuiltinType::Float: FnName = "fabsf"; break; > - case BuiltinType::Double: FnName = "fabs"; break; > - case BuiltinType::LongDouble: FnName = "fabsl"; break; > - } > - > - // The prototype is something that takes and returns whatever V's type > is. > - llvm::FunctionType *FT = llvm::FunctionType::get(V->getType(), > V->getType(), > - false); > - llvm::Value *Fn = CGF.CGM.CreateRuntimeFunction(FT, FnName); > - > - return CGF.EmitNounwindRuntimeCall(Fn, V, "abs"); > + Value *F = CGF.CGM.getIntrinsic(Intrinsic::fabs, V->getType()); > + llvm::CallInst *Call = CGF.Builder.CreateCall(F, V); > + Call->setDoesNotAccessMemory(); > + return Call; > } > > static RValue emitLibraryCall(CodeGenFunction &CGF, const FunctionDecl > *Fn, > diff --git a/test/CodeGen/builtins.c b/test/CodeGen/builtins.c > index 39bd84c..451ed07 100644 > --- a/test/CodeGen/builtins.c > +++ b/test/CodeGen/builtins.c > @@ -171,26 +171,26 @@ void bar() { > void test_float_builtins(float F, double D, long double LD) { > volatile int res; > res = __builtin_isinf(F); > - // CHECK: call float @fabsf(float > + // CHECK: call float @llvm.fabs.f32(float > // CHECK: fcmp oeq float {{.*}}, 0x7FF0000000000000 > > res = __builtin_isinf(D); > - // CHECK: call double @fabs(double > + // CHECK: call double @llvm.fabs.f64(double > // CHECK: fcmp oeq double {{.*}}, 0x7FF0000000000000 > > res = __builtin_isinf(LD); > - // CHECK: call x86_fp80 @fabsl(x86_fp80 > + // CHECK: call x86_fp80 @llvm.fabs.f80(x86_fp80 > // CHECK: fcmp oeq x86_fp80 {{.*}}, 0xK7FFF8000000000000000 > > res = __builtin_isfinite(F); > // CHECK: fcmp oeq float > - // CHECK: call float @fabsf > + // CHECK: call float @llvm.fabs.f32(float > // CHECK: fcmp une float {{.*}}, 0x7FF0000000000000 > // CHECK: and i1 > > res = __builtin_isnormal(F); > // CHECK: fcmp oeq float > - // CHECK: call float @fabsf > + // CHECK: call float @llvm.fabs.f32(float > // CHECK: fcmp ult float {{.*}}, 0x7FF0000000000000 > // CHECK: fcmp uge float {{.*}}, 0x3810000000000000 > // CHECK: and i1 > -- > 1.8.5.5 > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
