PATCH: Use size reduction -- wave1

Hi all,

here comes the patch for the first wave of Use class size reduction.

I have split it into 3 files, corresponding to
- header changes
- implementation changes
- applications

This at the moment does not contain the description how the
size of the Use class will be reduced from 16 to 12 bytes,
I am going to send that in a separate patch.

This wave primarily consists of changes that are needed
to allocate objects with a variable number of embedded <Use>s.

Where the number of <Use>s is constant in the lifetime of an object,
I preferred to keep the 'new Instr(...)' syntax. Otherwise I have
introduced static 'Create(...)' methods, which are used instead of the
'new Instr(...)' construct. These replace the constructors and the
constructors become private/protected. The arguments of the 'Create'
methods are identical to the corresponding constructors.
Essentially at the moment all introduced 'operator new's end up calling
'::operator new(size_t)', so there should be no functionality change at all.
This will change in subsequent waves.

At the moment of writing this my trunk working copy is at r48837,
I have used this command to do the merge:

svn merge http://llvm.org/svn/llvm-project/llvm/branches/ggreif/use-diet@48564 http://llvm.org/svn/llvm-project/llvm/branches/ggreif/use-diet .

This is what it printed on the console:

U include/llvm/BasicBlock.h
U include/llvm/GlobalVariable.h
U include/llvm/Support/LLVMBuilder.h
U include/llvm/Instructions.h
U include/llvm/GlobalAlias.h
U include/llvm/Constants.h
U include/llvm/User.h
U include/llvm/InstrTypes.h
U include/llvm/Function.h
U tools/bugpoint/CrashDebugger.cpp
U tools/bugpoint/Miscompilation.cpp
U lib/Analysis/ScalarEvolutionExpander.cpp
U lib/CodeGen/ShadowStackCollector.cpp
U lib/CodeGen/IntrinsicLowering.cpp
U lib/Linker/LinkModules.cpp
U lib/Target/X86/X86TargetAsmInfo.cpp
U lib/Bitcode/Reader/BitcodeReader.cpp
U lib/ExecutionEngine/JIT/JIT.cpp
U lib/VMCore/Instructions.cpp
U lib/VMCore/Constants.cpp
U lib/VMCore/AutoUpgrade.cpp
U lib/VMCore/Function.cpp
U lib/VMCore/Module.cpp
U lib/VMCore/Core.cpp
U lib/VMCore/BasicBlock.cpp
U lib/AsmParser/llvmAsmParser.y
U lib/AsmParser/llvmAsmParser.cpp.cvs
U lib/AsmParser/llvmAsmParser.h.cvs
U lib/AsmParser/llvmAsmParser.y.cvs
U lib/Transforms/Utils/LowerInvoke.cpp
U lib/Transforms/Utils/LCSSA.cpp
U lib/Transforms/Utils/CodeExtractor.cpp
U lib/Transforms/Utils/CloneModule.cpp
U lib/Transforms/Utils/CloneFunction.cpp
U lib/Transforms/Utils/BreakCriticalEdges.cpp
U lib/Transforms/Utils/LowerSwitch.cpp
U lib/Transforms/Utils/SimplifyCFG.cpp
U lib/Transforms/Utils/BasicBlockUtils.cpp
U lib/Transforms/Utils/LowerAllocations.cpp
U lib/Transforms/Utils/UnifyFunctionExitNodes.cpp
U lib/Transforms/Utils/InlineFunction.cpp
U lib/Transforms/Utils/LoopSimplify.cpp
U lib/Transforms/Utils/PromoteMemoryToRegister.cpp
U lib/Transforms/Utils/Local.cpp
U lib/Transforms/Instrumentation/RSProfiling.cpp
U lib/Transforms/Instrumentation/ProfilingUtils.cpp
U lib/Transforms/Scalar/LoopUnswitch.cpp
U lib/Transforms/Scalar/IndVarSimplify.cpp
U lib/Transforms/Scalar/GVNPRE.cpp
U lib/Transforms/Scalar/InstructionCombining.cpp
U lib/Transforms/Scalar/SimplifyCFG.cpp
U lib/Transforms/Scalar/TailRecursionElimination.cpp
U lib/Transforms/Scalar/LoopIndexSplit.cpp
U lib/Transforms/Scalar/LoopStrengthReduce.cpp
U lib/Transforms/Scalar/GCSE.cpp
U lib/Transforms/Scalar/ScalarReplAggregates.cpp
U lib/Transforms/Scalar/SCCP.cpp
U lib/Transforms/Scalar/LoopRotation.cpp
U lib/Transforms/Scalar/GVN.cpp
U lib/Transforms/Scalar/ADCE.cpp
U lib/Transforms/IPO/IndMemRemoval.cpp
U lib/Transforms/IPO/SimplifyLibCalls.cpp
U lib/Transforms/IPO/PruneEH.cpp
U lib/Transforms/IPO/StructRetPromotion.cpp
U lib/Transforms/IPO/ExtractGV.cpp
U lib/Transforms/IPO/LowerSetJmp.cpp
Skipped missing target: 'lib/Transforms/IPO/ExtractFunction.cpp'
U lib/Transforms/IPO/GlobalOpt.cpp
U lib/Transforms/IPO/DeadArgumentElimination.cpp
U lib/Transforms/IPO/ArgumentPromotion.cpp
U lib/Transforms/IPO/RaiseAllocations.cpp
U examples/BrainF/BrainF.cpp
U examples/BrainF/BrainFDriver.cpp
U examples/ParallelJIT/ParallelJIT.cpp
U examples/HowToUseJIT/HowToUseJIT.cpp
U examples/ModuleMaker/ModuleMaker.cpp
U examples/Fibonacci/fibonacci.cpp

Notes:

- I shall take the *.cvs files out of the patch.
- lib/Transforms/IPO/ExtractFunction.cpp seems to have been deleted from trunk
- GVN.cpp had a compile error due to changes --> I had to manually change the file
    emacs +1224 lib/Transforms/Scalar/GVN.cpp
    emacs +1231 lib/Transforms/Scalar/GVN.cpp
- the patch is pretty dull, mostly mechanical changes
- r48837 + this patch builds and the tests run without errors
- I have omitted Create-ifying llvm-upgrade, as it is not on trunk any more
- Some statistics:
  ggreif$ svn diff include > wave1-include.diff
  ggreif$ svn diff lib > wave1-lib.diff
  ggreif$ svn diff examples tools > wave1-rest.diff
  ggreif$ wc *.diff
      798 3883 33028 wave1-include.diff
     3894 16494 179719 wave1-lib.diff
      441 1769 18291 wave1-rest.diff
     5133 22146 231038 total
- I cared about
   o Tab-freeness
   o correct re-indentation
- I did not (yet) care about the 80-column regime
- the explanation of my wave nomenclature is here:
   svn cat http(s)://llvm.org/svn/llvm-project/llvm/branches/ggreif/README

Cheers,

  Gabor

wave1-include.diff (32.3 KB)

wave1-lib.diff (176 KB)

wave1-rest.diff (17.9 KB)

here comes the patch for the first wave of Use class size reduction.

I have split it into 3 files, corresponding to
- header changes
- implementation changes
- applications

nice!

This at the moment does not contain the description how the
size of the Use class will be reduced from 16 to 12 bytes,
I am going to send that in a separate patch.

Right, sounds great.

This wave primarily consists of changes that are needed
to allocate objects with a variable number of embedded <Use>s.

Ok.

Where the number of <Use>s is constant in the lifetime of an object,
I preferred to keep the 'new Instr(...)' syntax. Otherwise I have
introduced static 'Create(...)' methods, which are used instead of the
'new Instr(...)' construct.

The bad thing about this is that it is inconsistent. I'd prefer to have consistent use of ::Create for all IR classes to make it easier to learn the API. That said, a temporary moment of inconsistency is ok: you could commit this part, then switch the remaining classes over.

These replace the constructors and the
constructors become private/protected. The arguments of the 'Create'
methods are identical to the corresponding constructors.
Essentially at the moment all introduced 'operator new's end up calling
'::operator new(size_t)', so there should be no functionality change at all.
This will change in subsequent waves.

This basically looks good, some thoughts for the future:

1) Please (eventually) don't make the 'operator new' override be public. I'd actually prefer all memory alloc/dealloc stuff to be done privately to the (vmcore) .cpp files, not exposed through the header.

2) Eventually we'll need to make the dtor private as well.

3) Make sure that make check and some reasonable subset of llvm-test passes with this patch :slight_smile:

Finally, please update llvm-gcc 4.2 as well when you commit this. I'll update clang after you commit.

When you commit, please email llvmdev/commits with an email that says "API CHANGE" in the subject line with info on how to upgrade out-of-tree projects (e.g. vmkit).

Thanks Gabor!

-Chris