llvm/utils
Chad Rosier b7110cf5b5 Improve the compression of the tablegen DiffLists by introducing a new sort
algorithm when assigning EnumValues to the synthesized registers.

The current algorithm, LessRecord, uses the StringRef compare_numeric
function.  This function compares strings, while handling embedded numbers.
For example, the R600 backend registers are sorted as follows:

  T1
  T1_W
  T1_X
  T1_XYZW
  T1_Y
  T1_Z
  T2
  T2_W
  T2_X
  T2_XYZW
  T2_Y
  T2_Z

In this example, the 'scaling factor' is dEnum/dN = 6 because T0, T1, T2
have an EnumValue offset of 6 from one another.  However, in other parts
of the register bank, the scaling factors are different:

dEnum/dN = 5:
  KC0_128_W
  KC0_128_X
  KC0_128_XYZW
  KC0_128_Y
  KC0_128_Z
  KC0_129_W
  KC0_129_X
  KC0_129_XYZW
  KC0_129_Y
  KC0_129_Z

The diff lists do not work correctly because different kinds of registers have
different 'scaling factors'.  This new algorithm, LessRecordRegister, tries to
enforce a scaling factor of 1.  For example, the registers are now sorted as
follows:

  T1
  T2
  T3
  ...
  T0_W
  T1_W
  T2_W
  ...
  T0_X
  T1_X
  T2_X
  ...
  KC0_128_W
  KC0_129_W
  KC0_130_W
  ...

For the Mips and R600 I see a 19% and 6% reduction in size, respectively.  I
did see a few small regressions, but the differences were on the order of a
few bytes (e.g., AArch64 was 16 bytes).  I suspect there will be even
greater wins for targets with larger register files.

Patch reviewed by Jakob.
rdar://14006013


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185094 91177308-0d34-0410-b5e6-96231b3b80d8
2013-06-27 19:38:13 +00:00
..
bugpoint
buildit Build Apple's llvmCore with --disable-zlib. <rdar://problem/14182316> 2013-06-18 01:22:29 +00:00
count
crosstool
emacs
FileCheck keep only the StringRef version of getFileOrSTDIN. 2013-06-25 05:28:34 +00:00
FileUpdate keep only the StringRef version of getFileOrSTDIN. 2013-06-25 05:28:34 +00:00
fpcmp Don't use PathV1.h in FileUtilities.h. 2013-06-13 20:41:00 +00:00
git
git-svn Use 'git svn find-rev' in git-svnrevert instead of shell script fu. 2013-04-26 03:27:39 +00:00
jedit
kate
KillTheDoctor
lint
lit Fixed bug when tests in executable partially used absolute paths. 2013-05-30 04:56:28 +00:00
llvm-build
llvm-lit
Misc
not Avoid using PathV1.h in Program.h. 2013-06-13 20:25:38 +00:00
PerfectShuffle
release Add a script to help us create source tar balls for the release. 2013-06-07 11:15:30 +00:00
TableGen Improve the compression of the tablegen DiffLists by introducing a new sort 2013-06-27 19:38:13 +00:00
Target/ARM
testgen
textmate
unittest Get the unittests compiling when building with cmake and the setting 2013-05-14 13:29:16 +00:00
valgrind
vim
yaml-bench
check-each-file
clang-parse-diagnostics-file
codegen-diff
countloc.sh
DSAclean.py
DSAextract.py
findmisopt
findoptdiff
findsym.pl
GenLibDeps.pl
GetRepositoryPath
GetSourceVersion
getsrcs.sh
lldbDataFormatters.py
llvm-compilers-check
llvm-native-gcc
llvm-native-gxx
llvm.grm
llvm.natvis
LLVMBuild.txt
llvmdo
llvmgrep
Makefile
makellvm
profile.pl
sort_includes.py
test_debuginfo.pl
UpdateCMakeLists.pl
wciia.py