diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2013-07-13 01:16:47 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2013-07-13 01:16:47 +0000 |
commit | 7459be6dc7ee344d5fa9859c50cb892bc4443d16 (patch) | |
tree | 473b8fbfbaa3184e14880d0261d70f2c3abbea1b | |
parent | 86e60a36b584d632bf2da368ba173a9cf91eacd0 (diff) | |
download | bcm5719-llvm-7459be6dc7ee344d5fa9859c50cb892bc4443d16.tar.gz bcm5719-llvm-7459be6dc7ee344d5fa9859c50cb892bc4443d16.zip |
Add a microoptimization for urem.
llvm-svn: 186235
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 7 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/rem.ll | 9 |
2 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index e94f71917f5..eac24c63451 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -1125,6 +1125,13 @@ Instruction *InstCombiner::visitURem(BinaryOperator &I) { return BinaryOperator::CreateAnd(Op0, Add); } + // 1 urem X -> zext(X != 1) + if (match(Op0, m_One())) { + Value *Cmp = Builder->CreateICmpNE(Op1, Op0); + Value *Ext = Builder->CreateZExt(Cmp, I.getType()); + return ReplaceInstUsesWith(I, Ext); + } + return 0; } diff --git a/llvm/test/Transforms/InstCombine/rem.ll b/llvm/test/Transforms/InstCombine/rem.ll index 808d51eba1d..c6fd7211995 100644 --- a/llvm/test/Transforms/InstCombine/rem.ll +++ b/llvm/test/Transforms/InstCombine/rem.ll @@ -163,3 +163,12 @@ define i32 @test16(i32 %x, i32 %y) { %rem = urem i32 %x, %add ret i32 %rem } + +define i32 @test17(i32 %X) { +; CHECK: @test17 +; CHECK-NEXT: icmp ne i32 %X, 1 +; CHECK-NEXT: zext i1 +; CHECK-NEXT: ret + %A = urem i32 1, %X + ret i32 %A +} |