[llvm-dev] Addressing TableGen's error "Ran out of lanemask bits" in order to use more than 32 subregisters per register
Alex Susu via llvm-dev
llvm-dev at lists.llvm.org
Fri Jul 28 04:30:27 PDT 2017
Hello.
I come back to this older thread.
As I've said before, I managed to patch the various files from the back end related
to lanemask in order to support at most 1024 vector lanes. For this I am using a 1024-bit
long lanemask of type uint1024_t from boost::multiprecision, instead of uint32_t. For this
I changed the following LLVM source files:
[repository]/llvm/utils/TableGen/CodeGenRegisters.cpp
[repository]/llvm/utils/TableGen/CodeGenRegisters.h
[repository]/llvm/utils/TableGen/RegisterInfoEmitter.cpp
[repository]/llvm/lib/CodeGen/TargetRegisterInfo.cpp
[repository]/llvm/lib/CodeGen/MachineVerifier.cpp
[repository]/llvm/include/llvm/Target/TargetRegisterInfo.h
[repository]/llvm/include/llvm/MC/MCRegisterInfo.h
[repository]/llvm/include/llvm/CodeGen/MachineBasicBlock.h
[repository]/llvm/include/llvm/CodeGen/RegisterPressure.h
I plan to contribute patches for these changes to the llvm-commits mailing list.
These changes were tested by me for more than 6 months with llc on various benchmarks
- things seem to work well.
Besides these changes I added new vector types (basically all vector types that were
not already present in LLVM, from 32 lanes to 1024, for types i8, i16, i32, i64 and
f16/32/64, etc - examples of types that I needed are v128i1, v128i16, also v1024f64). The
files I changed are:
[repository]/llvm/include/llvm/CodeGen/ValueTypes.td
[repository]/lib/IR/ValueTypes.cpp
[repository]/include/llvm/IR/Intrinsics.td
[repository]/llvm/include/llvm/CodeGen/MachineValueType.h
[repository]/llvm/utils/TableGen/CodeGenTarget.cpp
Please let me know if you want to commit these changes also - they are rather complex
in the sense there are a lot of small dependencies for these types.
Best regards,
Alex
On 9/20/2016 12:48 PM, Alex Susu wrote:
> Hello.
> I managed to use SIMD units with more than 32 lanes (32 subregisters per vector
> register) in TableGen, llc and opt. For example, I use SIMD instructions with types
> v128i16 and v512i16.
>
> An important questions I have is if it is OK to add the types IIT_V128 = 37, IIT_V256
> = 38 like I did below:
> enum IIT_Info {
> ...
> IIT_V2 = 9,
> IIT_V4 = 10,
> IIT_V8 = 11,
> IIT_V16 = 12,
> IIT_V32 = 13,
> ...
> IIT_V64 = 16,
> IIT_V1 = 28,
> IIT_VEC_OF_PTRS_TO_ELT = 33,
> IIT_V512 = 35,
> IIT_V1024 = 36,
>
> /* Alex: added these new values. Note that these IIT_* that I add below must be
> defined in llvm.org/docs/doxygen/html/Function_8cpp.html also */
> IIT_V128 = 37,
> IIT_V256 = 38
> };
>
> I ask because enum IIT_Info has some values that are not consecutive for vector types
> for intrinsics (used e.g. in include/llvm/IR/Intriniscs*.td).
> Although not important, I wonder why do I still need to define them again (since these
> values are basically already defined in ValueTypes.td) ?
>
>
> So, I managed to get the code compiled. I had issues because I did not synchronize the
> following code:
> - enum IIT_Info defined in files llvm/utils/TableGen/IntrinsicEmitter.cpp and
> llvm/lib/IR/Function.cpp;
> - enum SympleValueType defined in files llvm/include/llvm/CodeGen/ValueTypes.td and
> llvm/include/llvm/CodeGen/MachineValueType.h .
> I was getting errors because of this out-of-sync like:
> - "error:unhandled vector type width in intrinsic!", "error:unhandled MVT in
> intrinsic!"
> - "Not a vector MVT!", "getSizeInBits called on extended MVT."
>
>
> Best regards,
> Alex
>
> On 9/19/2016 12:14 AM, Alex Susu wrote:
>> Hello.
>> I've managed to patch the various files from the back end related to lanemask - now I
>> have 1024-bit long lanemask.
>> But now I get the following error when giving make llc:
>> <<error:unhandled vector type width in intrinsic!>>
>> This error comes from this file
>> https://github.com/llvm-mirror/llvm/blob/master/utils/TableGen/IntrinsicEmitter.cpp, comes
>> from the fact there is no IIT_V128 (nor IIT_V256), and they is a switch case using them in
>> method static void EncodeFixedType(Record *R, std::vector<unsigned char> &ArgCodes,
>> std::vector<unsigned char> &Sig).
>>
>> Is there any reason these enum IIT_Info ( IIT_V128, IIT_V256) are not added in file
>> /IntrinsicEmitter.cpp?
>>
>> Thank you,
>> Alex
>>
>>
>> On Tue, Sep 13, 2016 at 1:47 AM, Matthias Braun <mbraun at apple.com
>> <mailto:mbraun at apple.com>> wrote:
>>
>>
>> > On Sep 8, 2016, at 6:37 AM, Alex Susu via llvm-dev <llvm-dev at lists.llvm.org
>> <mailto:llvm-dev at lists.llvm.org>> wrote:
>> >
>> > Hello.
>> > In my TableGen back end description I need to use more than 32 (e.g., 128,
>> 1024, etc) subregisters per register for my research SIMD processor. I have used so far
>> with success 32 subregisters.
>> >
>> > However, when using 128 subregisters when I now give the command:
>> > llvm-tblgen -gen-register-info Connex.td
>> > I get an error message "error:Ran out of lanemask bits to represent
>> subregister sub_16_033".
>> >
>> > To handle this limitation, I started editing the files where this error comes
>> from:
>> > llvm/utils/TableGen/CodeGenRegisters.h
>> > llvm/utils/TableGen/CodeGenRegisters.cpp
>> > More exactly, the error comes from the fact the member LaneMask of the classes
>> CodeGenSubRegIndex and CodeGenRegister is unsigned (i.e., 32 bits). So for every
>> lane/subregister we require a bit from the type LaneMask.
>> > I plan to use type long (or even type int1024_t from the boost library, header
>> cpp_int.hpp) for LaneMask and change accordingly the methods handing the type.
>> >
>> > Is there are any limitation I am not aware of (maybe in LLVMV's register
>> allocator) that would prevent me from using more than 32 lanes/subregisters?
>>
>> There is no known limitation. I chose uint32_t out of concern for compiletime. Going
>> up for uint64_t should be no problem, I'd be more concerned about bigger types;
>> hopefully all code properly uses the LaneBitmask type instead of plain unsigned, you
>> may need a few fixes in that area.
>> (For history: We had a scheme in the past where the liveness tracking mapped all lanes
>> after lane 31 to the bit 32, however that turned out to need special code in some
>> places that turned out to be a constant source of bugs that typically only happened in
>> big and hard to debug inputs so we moved away from this scheme).
>>
>> - Matthias
>>
>>
>>
More information about the llvm-dev
mailing list