mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-07 20:04:03 +00:00
add a few trivial instcombines for llvm.powi.
llvm-svn: 92383
This commit is contained in:
parent
0ea2e3d444
commit
e5f5e4b151
@ -10140,6 +10140,20 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
||||
if (Operand->getIntrinsicID() == Intrinsic::bswap)
|
||||
return ReplaceInstUsesWith(CI, Operand->getOperand(1));
|
||||
break;
|
||||
case Intrinsic::powi:
|
||||
if (ConstantInt *Power = dyn_cast<ConstantInt>(II->getOperand(2))) {
|
||||
// powi(x, 0) -> 1.0
|
||||
if (Power->isZero())
|
||||
return ReplaceInstUsesWith(CI, ConstantFP::get(CI.getType(), 1.0));
|
||||
// powi(x, 1) -> x
|
||||
if (Power->isOne())
|
||||
return ReplaceInstUsesWith(CI, II->getOperand(1));
|
||||
// powi(x, -1) -> 1/x
|
||||
return BinaryOperator::CreateFDiv(ConstantFP::get(CI.getType(), 1.0),
|
||||
II->getOperand(1));
|
||||
}
|
||||
break;
|
||||
|
||||
case Intrinsic::uadd_with_overflow: {
|
||||
Value *LHS = II->getOperand(1), *RHS = II->getOperand(2);
|
||||
const IntegerType *IT = cast<IntegerType>(II->getOperand(1)->getType());
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
declare %overflow.result @llvm.uadd.with.overflow.i8(i8, i8)
|
||||
declare %overflow.result @llvm.umul.with.overflow.i8(i8, i8)
|
||||
declare double @llvm.powi.f64(double, i32) nounwind readonly
|
||||
|
||||
define i8 @test1(i8 %A, i8 %B) {
|
||||
%x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %A, i8 %B)
|
||||
@ -77,3 +78,24 @@ define i8 @test6(i8 %A, i1* %overflowPtr) {
|
||||
; CHECK-NEXT: store i1 false, i1* %overflowPtr
|
||||
; CHECK-NEXT: ret i8 %A
|
||||
}
|
||||
|
||||
|
||||
define void @powi(double %V, double *%P) {
|
||||
entry:
|
||||
%A = tail call double @llvm.powi.f64(double %V, i32 -1) nounwind
|
||||
volatile store double %A, double* %P
|
||||
|
||||
%B = tail call double @llvm.powi.f64(double %V, i32 0) nounwind
|
||||
volatile store double %B, double* %P
|
||||
|
||||
%C = tail call double @llvm.powi.f64(double %V, i32 1) nounwind
|
||||
volatile store double %C, double* %P
|
||||
ret void
|
||||
; CHECK: @powi
|
||||
; CHECK: %A = fdiv double 1.0{{.*}}, %V
|
||||
; CHECK: volatile store double %A,
|
||||
; CHECK: volatile store double 1.0
|
||||
; CHECK: volatile store double %V
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user