[LLVMdev] InstCombine "pessimizes" trunc i8 to i1?

Jochen Wilhelmy j.wilhelmy at arcor.de
Wed Dec 28 03:45:49 PST 2011


>> Hi!
>>
>> before InstCombine (llvm::createInstructionCombiningPass()) I have
>> a trunc from i8 to i1 and then a select:
>>
>> %45 = load i8* @myGlobal, align 1
>> %tobool = trunc i8 %45 to i1
>> %cond = select i1 %tobool, float 1.000000e+00, float -1.000000e+00
>>
>> after instCombine I have:
>>
>> %29 = load i8* @myGlobal, align 1
>> %30 = and i8 %29, 1
>> %tobool = icmp ne i8 %30, 0
>> %cond = select i1 %tobool, float 1.000000e+00, float -1.000000e+00
>>
>> is this a bug or intended? My version is 3.0 release.
>> Please tell me where I can remove this rule even if it is intended for
>> mainline.
> This is intentional: an 'and' must be done in both cases, so this transformation is exposing it to the optimizer.
>
> Why do you consider this to be a pessimization?  Does one produce inferior machine code?

I consider it a pessimization as it is one additional instruction and 
I'm mainly interested in target
independent optimizations because I regenerate highlevel code from it
("Exporting 3D scenes from Maya to WebGL using clang and llvm").
For example from the given code before the transformation I can easily 
regenerate
myGlobal ? 1.0f : -1.0f
while after the transformation I get
(myGlobal & 1) != 0 ? 1.0f : -1.0f
which is not good for shading languages.

So I can remove the transformation in my local copy (I found it by now) 
or if it would be possible to
move it into the optimizer that needs it this would be benificial for me.

-Jochen




More information about the llvm-dev mailing list