From: Karthik Bhat Date: Mon, 24 Mar 2014 04:36:06 +0000 (+0000) Subject: Allow constant folding of ceil function whenever feasible X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=07707e8969a3936f216874f314c5f8ceaa594a90;p=oota-llvm.git Allow constant folding of ceil function whenever feasible git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204583 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ConstantFolding.cpp b/lib/Analysis/ConstantFolding.cpp index 8ff79d6f625..782acfa0516 100644 --- a/lib/Analysis/ConstantFolding.cpp +++ b/lib/Analysis/ConstantFolding.cpp @@ -1186,6 +1186,7 @@ bool llvm::canConstantFoldCallTo(const Function *F) { case Intrinsic::exp: case Intrinsic::exp2: case Intrinsic::floor: + case Intrinsic::ceil: case Intrinsic::sqrt: case Intrinsic::pow: case Intrinsic::powi: @@ -1390,6 +1391,8 @@ static Constant *ConstantFoldScalarCall(StringRef Name, unsigned IntrinsicID, #endif case Intrinsic::floor: return ConstantFoldFP(floor, V, Ty); + case Intrinsic::ceil: + return ConstantFoldFP(ceil, V, Ty); } if (!TLI) diff --git a/test/Transforms/InstCombine/ceil.ll b/test/Transforms/InstCombine/ceil.ll new file mode 100644 index 00000000000..9f965a3c34b --- /dev/null +++ b/test/Transforms/InstCombine/ceil.ll @@ -0,0 +1,56 @@ +; RUN: opt -S -instcombine < %s | FileCheck %s + +declare float @llvm.ceil.f32(float) #0 +declare double @llvm.ceil.f64(double) #0 +declare <4 x float> @llvm.ceil.v4f32(<4 x float>) #0 + +; CHECK-LABEL: @constant_fold_ceil_f32_01 +; CHECK-NEXT: ret float 1.000000e+00 +define float @constant_fold_ceil_f32_01() #0 { + %x = call float @llvm.ceil.f32(float 1.00) #0 + ret float %x +} + +; CHECK-LABEL: @constant_fold_ceil_f32_02 +; CHECK-NEXT: ret float 2.000000e+00 +define float @constant_fold_ceil_f32_02() #0 { + %x = call float @llvm.ceil.f32(float 1.25) #0 + ret float %x +} + +; CHECK-LABEL: @constant_fold_ceil_f32_03 +; CHECK-NEXT: ret float -1.000000e+00 +define float @constant_fold_ceil_f32_03() #0 { + %x = call float @llvm.ceil.f32(float -1.25) #0 + ret float %x +} + +; CHECK-LABEL: @constant_fold_ceil_v4f32_01 +; CHECK-NEXT: ret <4 x float> +define <4 x float> @constant_fold_ceil_v4f32_01() #0 { + %x = call <4 x float> @llvm.ceil.v4f32(<4 x float> ) + ret <4 x float> %x +} + +; CHECK-LABEL: @constant_fold_ceil_f64_01 +; CHECK-NEXT: ret double 1.000000e+00 +define double @constant_fold_ceil_f64_01() #0 { + %x = call double @llvm.ceil.f64(double 1.0) #0 + ret double %x +} + +; CHECK-LABEL: @constant_fold_ceil_f64_02 +; CHECK-NEXT: ret double 2.000000e+00 +define double @constant_fold_ceil_f64_02() #0 { + %x = call double @llvm.ceil.f64(double 1.3) #0 + ret double %x +} + +; CHECK-LABEL: @constant_fold_ceil_f64_03 +; CHECK-NEXT: ret double -1.000000e+00 +define double @constant_fold_ceil_f64_03() #0 { + %x = call double @llvm.ceil.f64(double -1.75) #0 + ret double %x +} + +attributes #0 = { nounwind readnone }