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. -Jochen
On Dec 27, 2011, at 5:09 AM, Jochen Wilhelmy wrote:> 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? -Chris
>> 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