Add a microoptimization for urem.
authorNick Lewycky <nicholas@mxc.ca>
Sat, 13 Jul 2013 01:16:47 +0000 (01:16 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Sat, 13 Jul 2013 01:16:47 +0000 (01:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186235 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
test/Transforms/InstCombine/rem.ll

index e94f71917f5815678b0295e237a8a5f5c65857ad..eac24c63451056b836e904ada34c03c161fccd6b 100644 (file)
@@ -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;
 }
 
index 808d51eba1d29c916ef04cf71fd20d241991760e..c6fd721199558895daf97091bf71925ee55253f9 100644 (file)
@@ -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
+}