OSDN Git Service

[InstCombine] use m_APInt to allow icmp eq (srem X, C1), C2 folds for splat constant...
authorSanjay Patel <spatel@rotateright.com>
Wed, 3 Aug 2016 19:48:40 +0000 (19:48 +0000)
committerSanjay Patel <spatel@rotateright.com>
Wed, 3 Aug 2016 19:48:40 +0000 (19:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277638 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 4b949ab..576aa2d 100644 (file)
@@ -2218,10 +2218,9 @@ Instruction *InstCombiner::foldICmpEqualityWithConstant(ICmpInst &ICI) {
   switch (BO->getOpcode()) {
   case Instruction::SRem:
     // If we have a signed (X % (2^c)) == 0, turn it into an unsigned one.
-    // FIXME: Vectors are excluded by ConstantInt.
-    if (*RHSV == 0 && isa<ConstantInt>(BOp1) && BO->hasOneUse()) {
-      const APInt &V = cast<ConstantInt>(BOp1)->getValue();
-      if (V.sgt(1) && V.isPowerOf2()) {
+    if (*RHSV == 0 && BO->hasOneUse()) {
+      const APInt *BOC;
+      if (match(BOp1, m_APInt(BOC)) && BOC->sgt(1) && BOC->isPowerOf2()) {
         Value *NewRem = Builder->CreateURem(BOp0, BOp1, BO->getName());
         return new ICmpInst(ICI.getPredicate(), NewRem,
                             Constant::getNullValue(BO->getType()));
index cd3c937..74d42fa 100644 (file)
@@ -53,12 +53,10 @@ define i1 @test3a(i32 %A) {
        ret i1 %C
 }
 
-; FIXME: Vectors should fold the same way.
-
 define <2 x i1> @test3a_vec(<2 x i32> %A) {
 ; CHECK-LABEL: @test3a_vec(
-; CHECK-NEXT:    [[B:%.*]] = srem <2 x i32> %A, <i32 8, i32 8>
-; CHECK-NEXT:    [[C:%.*]] = icmp ne <2 x i32> [[B]], zeroinitializer
+; CHECK-NEXT:    [[B1:%.*]] = and <2 x i32> %A, <i32 7, i32 7>
+; CHECK-NEXT:    [[C:%.*]] = icmp ne <2 x i32> [[B1]], zeroinitializer
 ; CHECK-NEXT:    ret <2 x i1> [[C]]
 ;
   %B = srem <2 x i32> %A, <i32 -8, i32 -8>