From: Craig Topper Date: Wed, 29 Jun 2016 04:57:00 +0000 (+0000) Subject: Revert "[ValueTracking] Teach computeKnownBits for PHI nodes to compute sign bit... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c590a00f89c8a88a4c42f049c5f8ad7b0e6c199c;p=llvm Revert "[ValueTracking] Teach computeKnownBits for PHI nodes to compute sign bit for a recurrence with a NSW addition." This is breaking an optimizaton remark test in clang. I've identified a couple fixes for that, but want to understand it better before I commit to anything. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274102 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp index 78ec2201fd5..16dd3078160 100644 --- a/lib/Analysis/ValueTracking.cpp +++ b/lib/Analysis/ValueTracking.cpp @@ -1240,18 +1240,6 @@ static void computeKnownBitsFromOperator(Operator *I, APInt &KnownZero, KnownZero = APInt::getLowBitsSet(BitWidth, std::min(KnownZero2.countTrailingOnes(), KnownZero3.countTrailingOnes())); - - // If the operation is an addition that can't have signed overflow, - // then the sign bit is known to be zero if both input sign bits - // are zero. Similar for two negative inputs. - if (Opcode == Instruction::Add && - cast(LU)->hasNoSignedWrap()) { - if (KnownZero2.isNegative() && KnownZero3.isNegative()) - KnownZero.setBit(BitWidth-1); - if (KnownOne2.isNegative() && KnownOne3.isNegative()) - KnownOne.setBit(BitWidth-1); - } - break; } } diff --git a/test/Transforms/BBVectorize/loop1.ll b/test/Transforms/BBVectorize/loop1.ll index 445dec1516d..70a5def4222 100644 --- a/test/Transforms/BBVectorize/loop1.ll +++ b/test/Transforms/BBVectorize/loop1.ll @@ -83,7 +83,7 @@ for.body: ; preds = %for.body, %entry ; CHECK-UNRL: %add12 = fadd <2 x double> %add7, %mul11 ; CHECK-UNRL: %4 = bitcast double* %arrayidx14 to <2 x double>* ; CHECK-UNRL: store <2 x double> %add12, <2 x double>* %4, align 8 -; CHECK-UNRL: %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2 +; CHECK-UNRL: %indvars.iv.next.1 = add nsw i64 %indvars.iv, 2 ; CHECK-UNRL: %lftr.wideiv.1 = trunc i64 %indvars.iv.next.1 to i32 ; CHECK-UNRL: %exitcond.1 = icmp eq i32 %lftr.wideiv.1, 10 ; CHECK-UNRL: br i1 %exitcond.1, label %for.end, label %for.body diff --git a/test/Transforms/InstCombine/phi.ll b/test/Transforms/InstCombine/phi.ll index 9b547361f45..c417737fdf2 100644 --- a/test/Transforms/InstCombine/phi.ll +++ b/test/Transforms/InstCombine/phi.ll @@ -879,118 +879,3 @@ if.end: ; preds = %entry, %if.then %cmp1 = icmp ne i32 %a.0, 0 ret i1 %cmp1 } - - -; This test makes sure we can determine that the inputs to the sdiv in the loop -; are non-negative and can become a udiv. This requires that we recognize that -; the loop induction can never have its sign bit set. -; -; CHECK-LABEL: @phi_nsw_induction_sdiv_udiv -; CHECK: udiv -; CHECK: udiv -define i32 @phi_nsw_induction_sdiv_udiv(i32 %NumElts, i32 %ScalarSize) { -entry: - %div = udiv i32 128, %ScalarSize - br label %for.cond - -for.cond: ; preds = %for.inc, %entry - %Sum.0 = phi i32 [ 0, %entry ], [ %add, %for.inc ] - %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] - %cmp = icmp ne i32 %i.0, %NumElts - br i1 %cmp, label %for.body, label %for.end - -for.body: ; preds = %for.cond - ; this should become a udiv - %div1 = sdiv i32 %i.0, %div - %add = add nsw i32 %Sum.0, %div1 - br label %for.inc - -for.inc: ; preds = %for.body - %inc = add nsw i32 %i.0, 1 - br label %for.cond - -for.end: ; preds = %for.cond - ret i32 %Sum.0 -} - - -; CHECK-LABEL: test_positive_nsw_recurrence -; CHECK-NOT: bar -; CHECK: foo -; CHECK-NOT: bar -; CHECK: ret -define void @test_positive_nsw_recurrence(i32 %N) { -entry: - br label %for.cond - -for.cond: ; preds = %for.inc, %entry - %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] - %cmp = icmp ne i32 %i.0, %N - br i1 %cmp, label %for.body, label %for.end - -for.body: ; preds = %for.cond - %and = and i32 %i.0, -2147483648 - %tobool = icmp ne i32 %and, 0 - br i1 %tobool, label %if.then, label %if.else - -if.then: ; preds = %for.body - ; this call should be deleted as %i.0 can never be negative due to no signed wrap - call void @bar() - br label %if.end - -if.else: ; preds = %for.body - call void @foo() - br label %if.end - -if.end: ; preds = %if.else, %if.then - br label %for.inc - -for.inc: ; preds = %if.end - %inc = add nsw i32 %i.0, 1 - br label %for.cond - -for.end: ; preds = %for.cond - ret void -} - -; CHECK-LABEL: test_negative_nsw_recurrence -; CHECK-NOT: foo -; CHECK: bar -; CHECK-NOT: foo -; CHECK: ret -define void @test_negative_nsw_recurrence(i32 %N) { -entry: - br label %for.cond - -for.cond: ; preds = %for.inc, %entry - %i.0 = phi i32 [ -1, %entry ], [ %inc, %for.inc ] - %cmp = icmp ne i32 %i.0, %N - br i1 %cmp, label %for.body, label %for.end - -for.body: ; preds = %for.cond - %and = and i32 %i.0, -2147483648 - %tobool = icmp ne i32 %and, 0 - br i1 %tobool, label %if.then, label %if.else - -if.then: ; preds = %for.body - call void @bar() - br label %if.end - -if.else: ; preds = %for.body - ; this call should be deleted as %i.0 can never be positive due to no signed wrap - call void @foo() - br label %if.end - -if.end: ; preds = %if.else, %if.then - br label %for.inc - -for.inc: ; preds = %if.end - %inc = add nsw i32 %i.0, -1 - br label %for.cond - -for.end: ; preds = %for.cond - ret void -} - -declare void @bar() -declare void @foo()