[mlir][IR] Move the storage for results to before the Operation instead of after.
authorRiver Riddle <riddleriver@gmail.com>
Sat, 5 Dec 2020 05:01:26 +0000 (21:01 -0800)
committerRiver Riddle <riddleriver@gmail.com>
Sat, 5 Dec 2020 05:01:42 +0000 (21:01 -0800)
commit47364f95e810f96fd300ceaa095719f76683e6fa
tree11009ce8ef1f43435a19900aa0c10216af5466a9
parent7924fb34f33a76fd3c36f5635dd40990ecd79741
[mlir][IR] Move the storage for results to before the Operation instead of after.

Trailing objects are really nice for storing additional data inline with the main class, and is something that we heavily take advantage of for Operation(and many other classes). To get the address of the inline data you need to compute the address by doing some pointer arithmetic taking into account any objects stored before the object you want to access. Most classes keep the count of the number of objects, so this is relatively cheap to compute. This is not the case for results though, which have two different types(inline and trailing) that are not necessarily as cheap to compute as the count for other objects. This revision moves the storage for results to before the operation and stores them in reverse order. This allows for getting results to still be very fast given that they are never iterated directly in order, and also greatly improves the speed when accessing the other trailing objects of an operation(operands/regions/blocks/etc).

This reduced compile time when compiling a decently sized mlir module by about ~400ms, or 2.17s -> 1.76s.

Differential Revision: https://reviews.llvm.org/D92687
mlir/include/mlir/IR/Operation.h
mlir/include/mlir/IR/OperationSupport.h
mlir/lib/IR/Operation.cpp
mlir/lib/IR/OperationSupport.cpp