[llvm-commits] [patch] Teach SimplifyCFG about magic pointer constants

Chris Lattner clattner at apple.com
Fri Feb 5 13:37:00 PST 2010


On Feb 5, 2010, at 1:23 PM, Dan Gohman wrote:

> Hi Jakob,
> 
> Looks good to me. Just one comment:

One more comment: It would probably be better to move this code into a simple class, so that TD doesn't have to be passed down at every level.  Something like:

class SimplifyCFGOpt {
...
  SimplifyCFGOpt(const TargetData *TD) {...}
  bool DoIt(BasicBlock *BB);
};

bool llvm::SimplifyCFG(BasicBlock *BB, const TargetData *TD) {
  return SimplifyCFGOpt(TD).DoIt(BB);
}

-Chris


> 
> +  // IntToPtr const int.
> +  if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
> +    if (CE->getOpcode() == Instruction::IntToPtr)
> +      if (ConstantInt *CI = dyn_cast<ConstantInt>(CE->getOperand(0))) {
> +        // The constant is very likely to have the right type already.
> +        if (CI->getType() == PtrTy)
> +          return CI;
> +        else
> +          return ConstantInt::get(PtrTy, CI->getZExtValue());
> 
> getZExtValue() fails if the integer is wider than 64 bits. To be
> more general, you can use something like
> 
> ConstantExpr::getIntegerCast(CI, PtrTy, /*isSigned=*/false)
> 
> to convert the constant to the appropriate type.
> 
> +      }
> +  return 0;
> 
> Dan
> 
> On Feb 5, 2010, at 12:12 PM, Jakob Stoklund Olesen wrote:
> 
>> Weird code sometimes uses pointer constants other than null. This patch
>> teaches SimplifyCFG to build switch instructions in those cases.
>> 
>> Code like this:
>> 
>> void f(const char *x) {
>> if (!x)
>>   puts("null");
>> else if ((uintptr_t)x == 1)
>>   puts("one");
>> else if (x == (char*)2 || x == (char*)3)
>>   puts("two");
>> else if ((intptr_t)x == 4)
>>   puts("four");
>> else
>>   puts(x);
>> }
>> 
>> Now becomes a switch:
>> 
>> define void @f(i8* %x) nounwind ssp {
>> entry:
>> %magicptr23 = ptrtoint i8* %x to i64            ; <i64> [#uses=1]
>> switch i64 %magicptr23, label %if.else16 [
>>   i64 0, label %if.then
>>   i64 1, label %if.then2
>>   i64 2, label %if.then9
>>   i64 3, label %if.then9
>>   i64 4, label %if.then14
>> ]
>> 
>> Note that LLVM's own DenseMap uses magic pointers and benefits from this.
>> 
>> <magicptr.patch>_______________________________________________
>> 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