From: Dan Gohman Date: Tue, 11 Aug 2009 20:47:47 +0000 (+0000) Subject: Optimize exact sdiv by a constant power of 2 to ashr. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=1bdf5dc835e74ff6710dbd452601542d19116d08;p=oota-llvm.git Optimize exact sdiv by a constant power of 2 to ashr. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78714 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index b9b4ccb6cfb..798e3d24e9f 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -3064,6 +3064,15 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) { // sdiv X, -1 == -X if (RHS->isAllOnesValue()) return BinaryOperator::CreateNeg(*Context, Op0); + + // sdiv X, C --> ashr X, log2(C) + if (cast(&I)->isExact() && + RHS->getValue().isNonNegative() && + RHS->getValue().isPowerOf2()) { + Value *ShAmt = llvm::ConstantInt::get(RHS->getType(), + RHS->getValue().exactLogBase2()); + return BinaryOperator::CreateAShr(Op0, ShAmt, I.getName()); + } } // If the sign bits of both operands are zero (i.e. we can prove they are diff --git a/test/Transforms/InstCombine/exact-sdiv.ll b/test/Transforms/InstCombine/exact-sdiv.ll new file mode 100644 index 00000000000..9ed524f8ec7 --- /dev/null +++ b/test/Transforms/InstCombine/exact-sdiv.ll @@ -0,0 +1,15 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | FileCheck %s + +; CHECK: define i32 @foo +; CHECK: sdiv i32 %x, 8 +define i32 @foo(i32 %x) { + %y = sdiv i32 %x, 8 + ret i32 %y +} + +; CHECK: define i32 @bar +; CHECK: ashr i32 %x, 3 +define i32 @bar(i32 %x) { + %y = sdiv exact i32 %x, 8 + ret i32 %y +}