[cfe-commits] r164624 - /cfe/trunk/lib/Lex/LiteralSupport.cpp

Sean Silva silvas at purdue.edu
Tue Sep 25 14:16:35 PDT 2012


Oops, just saw the other thread... please ignore.

--Sean Silva

On Tue, Sep 25, 2012 at 5:14 PM, Sean Silva <silvas at purdue.edu> wrote:
> What kind of benchmarking did you do for this optimization? How much
> did it affect performance?
>
> -- Sean Silva
>
> On Tue, Sep 25, 2012 at 3:09 PM, Dmitri Gribenko <gribozavr at gmail.com> wrote:
>> Author: gribozavr
>> Date: Tue Sep 25 14:09:15 2012
>> New Revision: 164624
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=164624&view=rev
>> Log:
>> Optimize NumericLiteralParser::GetIntegerValue().
>>
>> It does a conservative estimate on the size of numbers that can fit into
>> uint64_t.  This bound is improved.
>>
>> Modified:
>>     cfe/trunk/lib/Lex/LiteralSupport.cpp
>>
>> Modified: cfe/trunk/lib/Lex/LiteralSupport.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=164624&r1=164623&r2=164624&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/LiteralSupport.cpp (original)
>> +++ cfe/trunk/lib/Lex/LiteralSupport.cpp Tue Sep 25 14:09:15 2012
>> @@ -752,6 +752,20 @@
>>    }
>>  }
>>
>> +static bool CanFitInto64Bits(unsigned Radix, unsigned NumDigits) {
>> +  switch (Radix) {
>> +  case 2:
>> +    return NumDigits <= 64;
>> +  case 8:
>> +    return NumDigits <= 64 / 3; // Digits are groups of 3 bits.
>> +  case 10:
>> +    return NumDigits <= 19; // floor(log10(2^64))
>> +  case 16:
>> +    return NumDigits <= 64 / 4; // Digits are groups of 4 bits.
>> +  default:
>> +    llvm_unreachable("impossible Radix");
>> +  }
>> +}
>>
>>  /// GetIntegerValue - Convert this numeric literal value to an APInt that
>>  /// matches Val's input width.  If there is an overflow, set Val to the low bits
>> @@ -763,13 +777,11 @@
>>    // integer. This avoids the expensive overflow checking below, and
>>    // handles the common cases that matter (small decimal integers and
>>    // hex/octal values which don't overflow).
>> -  unsigned MaxBitsPerDigit = 1;
>> -  while ((1U << MaxBitsPerDigit) < radix)
>> -    MaxBitsPerDigit += 1;
>> -  if ((SuffixBegin - DigitsBegin) * MaxBitsPerDigit <= 64) {
>> +  const unsigned NumDigits = SuffixBegin - DigitsBegin;
>> +  if (CanFitInto64Bits(radix, NumDigits)) {
>>      uint64_t N = 0;
>> -    for (s = DigitsBegin; s != SuffixBegin; ++s)
>> -      N = N*radix + HexDigitValue(*s);
>> +    for (const char *Ptr = DigitsBegin; Ptr != SuffixBegin; ++Ptr)
>> +      N = N * radix + HexDigitValue(*Ptr);
>>
>>      // This will truncate the value to Val's input width. Simply check
>>      // for overflow by comparing.
>> @@ -778,15 +790,15 @@
>>    }
>>
>>    Val = 0;
>> -  s = DigitsBegin;
>> +  const char *Ptr = DigitsBegin;
>>
>>    llvm::APInt RadixVal(Val.getBitWidth(), radix);
>>    llvm::APInt CharVal(Val.getBitWidth(), 0);
>>    llvm::APInt OldVal = Val;
>>
>>    bool OverflowOccurred = false;
>> -  while (s < SuffixBegin) {
>> -    unsigned C = HexDigitValue(*s++);
>> +  while (Ptr < SuffixBegin) {
>> +    unsigned C = HexDigitValue(*Ptr++);
>>
>>      // If this letter is out of bound for this radix, reject it.
>>      assert(C < radix && "NumericLiteralParser ctor should have rejected this");
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list