[llvm-commits] working on generalized vector intrinsics

Chris Lattner clattner at apple.com
Mon Jul 16 10:00:57 PDT 2007


On Jul 16, 2007, at 9:01 AM, Dan Gohman wrote:

>> To me, I agree that having a single type listed for bswap is nice,
>> but I don't think it's worth it to change the return type of ctlz and
>> friends.
>
> For me, the changes to ctlz and friends are more important than bswap,
> so I'll take a look at having the bc and .ll readers autoupgrade  
> these.

Ok, sounds good!

>> Ok.  Is this a theoretical problem or a real problem?  Do you have a
>> target that provides hardware support for element-size ctlz/cttz/
>> popcount?
>
> Itanium, PowerPC, Alpha, SSE4, and various Cray architectures all have
> a ctpop that returns a result of the same size as the operand. This  
> can
> mostly be papered over with codegen peeps, but do you want LLVM to
> follow what appears to be a consensus among diverse hardware, or  
> follow
> the "In C functions should return int because that's how implicit
> declaration works" convention? ;-)

For integers at least, I'm not that concerned.  Have you noticed a  
case where it caused inefficient codegen?  We have similar problems  
with shifts and other operators: for shifts, the shift amount  
sometimes follows the type of the shifted value, sometimes it's fixed  
(e.g. to i8 on x86).

On RISC architectures, often you only have (e.g.) 32-bit registers,  
in which case, an i8 ctlz has issues regardless of whether the result  
is i32 or i8. :)

All that said, I agree with you that it is more natural for these  
operators to return the same type as their input.  I'm just curious  
if you've actually seen a problem.

>>> "The return type must match the argument type."
>>
>> Oops, that should be fixed :(
>
> Or the intrinsics themselves should be fixed :).

Yep, either way works :)

>> ===================================================================
>> --- utils/TableGen/CodeGenTarget.cpp	(revision 39829)
>> +++ utils/TableGen/CodeGenTarget.cpp	(working copy)
>> @@ -93,7 +95,7 @@
>>     case MVT::v2f32: return "MVT::v2f32";
>>     case MVT::v4f32: return "MVT::v4f32";
>>     case MVT::v2f64: return "MVT::v2f64";
>> -  case MVT::iPTR:  return "TLI.getPointerTy()";
>> +  case MVT::iPTR:  return "MVT::iPTR";
>>     default: assert(0 && "ILLEGAL VALUE TYPE!"); return "";
>>     }
>>   }
>>
>>
>> Do you correctly handle this change in all places?
>
> I'm not aware of any places that are wrong at the moment, but I've got
> more testing to do in general.

Ok

>> Does the generated type verifier should check for and reject things
>> like "llvm.cos.i32"?
>
> Yes, because it distinguishes between iAny and fAny, and cos uses  
> fAny.

Ok.

>> +  case ISD::CopyFromReg:
>> +    Lo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, NewVT, Op,
>> +                     DAG.getConstant(0, MVT::i32));
>> +    Hi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, NewVT, Op,
>> +                     DAG.getConstant(NewNumElts, MVT::i32));
>> +    break;
>>
>> Why does legalize need to split up CopyFromReg nodes?  Previously,
>> they were always legal, did something change?
>
> That code is used when a CopyFromReg is an operand of a vector  
> intrinsic
> that is scalarized. I'm not sure this is the right approach though.  
> I'll
> be reevaluating it as I proceed.

Sounds good, thanks Dan!

-Chris



More information about the llvm-commits mailing list