On Mar 20, 2007, at 9:29 AM, Anton Korobeynikov wrote:
This is the first patch targeting switch lowering refactoring as
indicated in PR926.
oooh!
Currently it implements "worklist" strategy, where we're deciding
either
emit JT or split the case range or each step (not only in the early
beginning). Also, I've included some heuristic to calculate pivot:
maximise sum of densities of RHS & LHS. This lead to unbalanced tree,
but really increase chances of JT emission in the future.
E.g. we split switch (0-5, 120-126, 1024) into 2 JT's and 1 specific
comparison + some "glue" code to discriminate cases.
Tested with:
1. llvm-gcc bootstrap
2. Building mozilla & qt with bootstrapped compiler.
+ struct JumpTableHeader
+ {
+ JumpTableHeader(uint64_t F, uint64_t L, Value* SV,
MachineBasicBlock* H,
+ bool E = false):
Nitpick: the { should go on the same line as the struct.
+void SelectionDAGLowering::visitJumpTableHeader
(SelectionDAGISel::JumpTable &JT,
+
SelectionDAGISel::JumpTableHeader &JTH) {
Please add a comment block before this method, describing what it does.
+ unsigned LSize = 1;
+ unsigned RSize = Size-1;
+ for (CaseItr I = CR.Range.first, J=I+1, E = CR.Range.second;
+ J!=E; ++I, ++J, ++LSize, --RSize) {
+ uint64_t LEnd = cast<ConstantInt>(I->first)->getSExtValue();
+ uint64_t RBegin = cast<ConstantInt>(J->first)->getSExtValue();
+ double LDensity = (double)LSize / (double)((LEnd - First) +
1ULL);
+ double RDensity = (double)RSize / (double)((Last - RBegin) +
1ULL);
+ if (Density < (LDensity + RDensity)) {
+ Pivot = J;
+ Density = LDensity + RDensity;
+ }
+ }
Please add some comments explaining how this works.
I have to say, you did an *excellent* job. Nice work,
-Chris
_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits