[llvm-commits] [llvm] r57049 - in /llvm/trunk: lib/Analysis/ScalarEvolution.cpp test/Transforms/IndVarsSimplify/2008-10-03-CouldNotCompute.ll

Nick Lewycky nicholas at mxc.ca
Mon Oct 6 22:22:27 PDT 2008


Dan Gohman wrote:
> Hi Nick,
> 
> Is this the right approach? It would be much simpler to just
> fix evaluateAtIteration to check for return value of
> BinomialCoefficient for CNC and stop trying to do further
> computation.
> 
> Or, are you envisioning someday adding code that would want
> to take advantage of being able to keep going after getting
> a CNC, because it's simpler to do so, or in hopes that it
> might be cancelled out later?

No, it isn't. I took the idea that CNC * 0 -> 0 and generalized it to 
the notion that we need to analyze these. We don't. For example, CNC - 
CNC != 0.

I think your suggested fix is the right one. I'll put a patch in PR2857 
soon/eventually.

Nick

> Also, in the patch, there are several instances of code like this:
> 
>> +  if (isa<SCEVCouldNotCompute>(Op))
>> +    return new SCEVCouldNotCompute();
> 
> Instead of creating a new SCEV object, code like this can
> just return Op.
> 
> Dan
> 
> On Oct 4, 2008, at 4:19 AM, Nick Lewycky wrote:
> 
>> Author: nicholas
>> Date: Sat Oct  4 06:19:07 2008
>> New Revision: 57049
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=57049&view=rev
>> Log:
>> Allow the construction of SCEVs with SCEVCouldNotCompute operands, by
>> implementing folding. Fixes PR2857.
>>
>> Added:
>>    llvm/trunk/test/Transforms/IndVarsSimplify/2008-10-03- 
>> CouldNotCompute.ll
>> Modified:
>>    llvm/trunk/lib/Analysis/ScalarEvolution.cpp
>>
>> Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=57049&r1=57048&r2=57049&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> ======================================================================
>> --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
>> +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Sat Oct  4 06:19:07  
>> 2008
>> @@ -676,6 +676,9 @@
>>       return getAddRecExpr(Operands, AddRec->getLoop());
>>   }
>>
>> +  if (isa<SCEVCouldNotCompute>(Op))
>> +    return new SCEVCouldNotCompute();
>> +
>>   SCEVTruncateExpr *&Result = (*SCEVTruncates)[std::make_pair(Op,  
>> Ty)];
>>   if (Result == 0) Result = new SCEVTruncateExpr(Op, Ty);
>>   return Result;
>> @@ -691,6 +694,9 @@
>>   // operands (often constants).  This would allow analysis of  
>> something like
>>   // this:  for (unsigned char X = 0; X < 100; ++X) { int Y = X; }
>>
>> +  if (isa<SCEVCouldNotCompute>(Op))
>> +    return new SCEVCouldNotCompute();
>> +
>>   SCEVZeroExtendExpr *&Result = (*SCEVZeroExtends) 
>> [std::make_pair(Op, Ty)];
>>   if (Result == 0) Result = new SCEVZeroExtendExpr(Op, Ty);
>>   return Result;
>> @@ -706,6 +712,9 @@
>>   // operands (often constants).  This would allow analysis of  
>> something like
>>   // this:  for (signed char X = 0; X < 100; ++X) { int Y = X; }
>>
>> +  if (isa<SCEVCouldNotCompute>(Op))
>> +    return new SCEVCouldNotCompute();
>> +
>>   SCEVSignExtendExpr *&Result = (*SCEVSignExtends) 
>> [std::make_pair(Op, Ty)];
>>   if (Result == 0) Result = new SCEVSignExtendExpr(Op, Ty);
>>   return Result;
>> @@ -734,6 +743,10 @@
>>   // Sort by complexity, this groups all similar expression types  
>> together.
>>   GroupByComplexity(Ops);
>>
>> +  // Could not compute plus anything equals could not compute.
>> +  if (isa<SCEVCouldNotCompute>(Ops.back()))
>> +    return new SCEVCouldNotCompute();
>> +
>>   // If there are any constants, fold them together.
>>   unsigned Idx = 0;
>>   if (SCEVConstant *LHSC = dyn_cast<SCEVConstant>(Ops[0])) {
>> @@ -959,6 +972,21 @@
>>   // Sort by complexity, this groups all similar expression types  
>> together.
>>   GroupByComplexity(Ops);
>>
>> +  if (isa<SCEVCouldNotCompute>(Ops.back())) {
>> +    // CNC * 0 = 0
>> +    for (unsigned i = 0, e = Ops.size() - 1; i != e; ++i) {
>> +      if (Ops[i]->getSCEVType() != scConstant)
>> +        break;
>> +
>> +      SCEVConstant *SC = cast<SCEVConstant>(Ops[i]);
>> +      if (SC->getValue()->isMinValue(false))
>> +        return SC;
>> +    }
>> +
>> +    // Otherwise, we can't compute it.
>> +    return new SCEVCouldNotCompute();
>> +  }
>> +
>>   // If there are any constants, fold them together.
>>   unsigned Idx = 0;
>>   if (SCEVConstant *LHSC = dyn_cast<SCEVConstant>(Ops[0])) {
>> @@ -1124,6 +1152,9 @@
>>
>>   // FIXME: implement folding of (X*4)/4 when we know X*4 doesn't  
>> overflow.
>>
>> +  if (isa<SCEVCouldNotCompute>(LHS) || isa<SCEVCouldNotCompute>(RHS))
>> +    return new SCEVCouldNotCompute();
>> +
>>   SCEVUDivExpr *&Result = (*SCEVUDivs)[std::make_pair(LHS, RHS)];
>>   if (Result == 0) Result = new SCEVUDivExpr(LHS, RHS);
>>   return Result;
>> @@ -1171,6 +1202,12 @@
>>     }
>>   }
>>
>> +  // Refuse to build an AddRec out of SCEVCouldNotCompute.
>> +  for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
>> +    if (isa<SCEVCouldNotCompute>(Operands[i]))
>> +      return new SCEVCouldNotCompute();
>> +  }
>> +
>>   SCEVAddRecExpr *&Result =
>>     (*SCEVAddRecExprs)[std::make_pair(L,  
>> std::vector<SCEV*>(Operands.begin(),
>>                                                              
>> Operands.end()))];
>> @@ -1193,6 +1230,21 @@
>>   // Sort by complexity, this groups all similar expression types  
>> together.
>>   GroupByComplexity(Ops);
>>
>> +  if (isa<SCEVCouldNotCompute>(Ops.back())) {
>> +    // CNC smax +inf = +inf.
>> +    for (unsigned i = 0, e = Ops.size() - 1; i != e; ++i) {
>> +      if (Ops[i]->getSCEVType() != scConstant)
>> +        break;
>> +
>> +      SCEVConstant *SC = cast<SCEVConstant>(Ops[i]);
>> +      if (SC->getValue()->isMaxValue(true))
>> +        return SC;
>> +    }
>> +
>> +    // Otherwise, we can't compute it.
>> +    return new SCEVCouldNotCompute();
>> +  }
>> +
>>   // If there are any constants, fold them together.
>>   unsigned Idx = 0;
>>   if (SCEVConstant *LHSC = dyn_cast<SCEVConstant>(Ops[0])) {
>> @@ -1273,6 +1325,21 @@
>>   // Sort by complexity, this groups all similar expression types  
>> together.
>>   GroupByComplexity(Ops);
>>
>> +  if (isa<SCEVCouldNotCompute>(Ops[0])) {
>> +    // CNC umax inf = inf.
>> +    for (unsigned i = 0, e = Ops.size() - 1; i != e; ++i) {
>> +      if (Ops[i]->getSCEVType() != scConstant)
>> +        break;
>> +
>> +      SCEVConstant *SC = cast<SCEVConstant>(Ops[i]);
>> +      if (SC->getValue()->isMaxValue(false))
>> +        return SC;
>> +    }
>> +
>> +    // Otherwise, we can't compute it.
>> +    return new SCEVCouldNotCompute();
>> +  }
>> +
>>   // If there are any constants, fold them together.
>>   unsigned Idx = 0;
>>   if (SCEVConstant *LHSC = dyn_cast<SCEVConstant>(Ops[0])) {
>>
>> Added: llvm/trunk/test/Transforms/IndVarsSimplify/2008-10-03- 
>> CouldNotCompute.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IndVarsSimplify/2008-10-03-CouldNotCompute.ll?rev=57049&view=auto
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> ======================================================================
>> --- llvm/trunk/test/Transforms/IndVarsSimplify/2008-10-03- 
>> CouldNotCompute.ll (added)
>> +++ llvm/trunk/test/Transforms/IndVarsSimplify/2008-10-03- 
>> CouldNotCompute.ll Sat Oct  4 06:19:07 2008
>> @@ -0,0 +1,32 @@
>> +; RUN: llvm-as < %s | opt -indvars
>> +; PR2857
>> +
>> + at foo = external global i32		; <i32*> [#uses=1]
>> +
>> +define void @test(i32 %n, i32 %arg) {
>> +entry:
>> +	br i1 false, label %bb.nph, label %return
>> +
>> +bb.nph:		; preds = %entry
>> +	%0 = load i32* @foo, align 4		; <i32> [#uses=1]
>> +	%1 = sext i32 %0 to i64		; <i64> [#uses=1]
>> +	br label %bb
>> +
>> +bb:		; preds = %bb, %bb.nph
>> +	%.in = phi i32 [ %2, %bb ], [ %n, %bb.nph ]		; <i32> [#uses=1]
>> +	%val.02 = phi i64 [ %5, %bb ], [ 0, %bb.nph ]		; <i64> [#uses=2]
>> +	%result.01 = phi i64 [ %4, %bb ], [ 0, %bb.nph ]		; <i64> [#uses=1]
>> +	%2 = add i32 %.in, -1		; <i32> [#uses=2]
>> +	%3 = mul i64 %1, %val.02		; <i64> [#uses=1]
>> +	%4 = add i64 %3, %result.01		; <i64> [#uses=2]
>> +	%5 = add i64 %val.02, 1		; <i64> [#uses=1]
>> +	%6 = icmp sgt i32 %2, 0		; <i1> [#uses=1]
>> +	br i1 %6, label %bb, label %bb3.bb4_crit_edge
>> +
>> +bb3.bb4_crit_edge:		; preds = %bb
>> +	%.lcssa = phi i64 [ %4, %bb ]		; <i64> [#uses=0]
>> +	ret void
>> +
>> +return:		; preds = %entry
>> +	ret void
>> +}
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 




More information about the llvm-commits mailing list