Skip to content

Commit 48be84b

Browse files
committed
[Mangler] Optimzie the code that inserts bits to APInt.
This commit optimizes the code that inserts bits into a bitstream (APInt). Instead of adding the bits one by one we calculate the size we need, shift the APInt and add the numeric value representing the bitstream.
1 parent e5ed768 commit 48be84b

File tree

2 files changed

+73
-68
lines changed

2 files changed

+73
-68
lines changed

lib/ABI/HuffTables.h

Lines changed: 64 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -521,70 +521,70 @@ if ((tailbits & 1) == 1) {
521521
assert(false); return 0;
522522
}
523523
void variable_encode(APInt &num, char ch) {
524-
if (ch == 'w') {/*000000*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); return;}
525-
if (ch == 'I') {/*0100000*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); return;}
526-
if (ch == 'U') {/*1100000*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); return;}
527-
if (ch == '4') {/*010000*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); return;}
528-
if (ch == '5') {/*110000*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); return;}
529-
if (ch == 't') {/*01000*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); return;}
530-
if (ch == 'a') {/*11000*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); return;}
531-
if (ch == 'i') {/*00100*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); return;}
532-
if (ch == 'A') {/*010100*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); return;}
533-
if (ch == 'm') {/*110100*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); return;}
534-
if (ch == '3') {/*001100*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); return;}
535-
if (ch == 'd') {/*101100*/ num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); return;}
536-
if (ch == 'l') {/*011100*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); return;}
537-
if (ch == 'M') {/*0111100*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); return;}
538-
if (ch == 'K') {/*1111100*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); return;}
539-
if (ch == 'Y') {/*00010*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); return;}
540-
if (ch == 'r') {/*10010*/ num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); return;}
541-
if (ch == 'E') {/*0001010*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); return;}
542-
if (ch == 'k') {/*1001010*/ num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); return;}
543-
if (ch == 'c') {/*101010*/ num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); return;}
544-
if (ch == 'p') {/*011010*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); return;}
545-
if (ch == 'B') {/*0111010*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); return;}
546-
if (ch == 'O') {/*1111010*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); return;}
547-
if (ch == '1') {/*00110*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); return;}
548-
if (ch == 's') {/*10110*/ num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); return;}
549-
if (ch == '9') {/*001110*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); return;}
550-
if (ch == 'x') {/*101110*/ num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); return;}
551-
if (ch == 'T') {/*11110*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); return;}
552-
if (ch == 'S') {/*00001*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; return;}
553-
if (ch == 'y') {/*0010001*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; return;}
554-
if (ch == 'X') {/*01010001*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; return;}
555-
if (ch == 'L') {/*11010001*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; return;}
556-
if (ch == 'o') {/*110001*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; return;}
557-
if (ch == 'D') {/*0001001*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; return;}
558-
if (ch == 'G') {/*1001001*/ num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; return;}
559-
if (ch == 'F') {/*101001*/ num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; return;}
560-
if (ch == '6') {/*011001*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; return;}
561-
if (ch == 'N') {/*0111001*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; return;}
562-
if (ch == 'P') {/*1111001*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; return;}
563-
if (ch == 'J') {/*101*/ num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; return;}
564-
if (ch == '_') {/*0011*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
565-
if (ch == 'W') {/*0001011*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
566-
if (ch == 'v') {/*01001011*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
567-
if (ch == 'Z') {/*11001011*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
568-
if (ch == 'h') {/*0101011*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
569-
if (ch == 'R') {/*01101011*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
570-
if (ch == 'q') {/*11101011*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
571-
if (ch == 'e') {/*11011*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
572-
if (ch == 'f') {/*000111*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
573-
if (ch == '8') {/*0100111*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
574-
if (ch == 'b') {/*1100111*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
575-
if (ch == '2') {/*010111*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
576-
if (ch == 'V') {/*0110111*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
577-
if (ch == 'u') {/*1110111*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
578-
if (ch == 'n') {/*001111*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
579-
if (ch == 'g') {/*0101111*/ num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
580-
if (ch == '7') {/*1101111*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
581-
if (ch == 'C') {/*0011111*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
582-
if (ch == 'z') {/*1011111*/ num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
583-
if (ch == 'j') {/*00111111*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
584-
if (ch == '$') {/*0010111111*/ num = num.shl(1); num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
585-
if (ch == 'Q') {/*1010111111*/ num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
586-
if (ch == 'H') {/*110111111*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
587-
if (ch == '0') {/*1111111*/ num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; num = num.shl(1); num = ++num; return;}
524+
if (ch == 'w') {/*000000*/ num = num.shl(6); num = num + 0; return; }
525+
if (ch == 'I') {/*0100000*/ num = num.shl(7); num = num + 32; return; }
526+
if (ch == 'U') {/*1100000*/ num = num.shl(7); num = num + 96; return; }
527+
if (ch == '4') {/*010000*/ num = num.shl(6); num = num + 16; return; }
528+
if (ch == '5') {/*110000*/ num = num.shl(6); num = num + 48; return; }
529+
if (ch == 't') {/*01000*/ num = num.shl(5); num = num + 8; return; }
530+
if (ch == 'a') {/*11000*/ num = num.shl(5); num = num + 24; return; }
531+
if (ch == 'i') {/*00100*/ num = num.shl(5); num = num + 4; return; }
532+
if (ch == 'A') {/*010100*/ num = num.shl(6); num = num + 20; return; }
533+
if (ch == 'm') {/*110100*/ num = num.shl(6); num = num + 52; return; }
534+
if (ch == '3') {/*001100*/ num = num.shl(6); num = num + 12; return; }
535+
if (ch == 'd') {/*101100*/ num = num.shl(6); num = num + 44; return; }
536+
if (ch == 'l') {/*011100*/ num = num.shl(6); num = num + 28; return; }
537+
if (ch == 'M') {/*0111100*/ num = num.shl(7); num = num + 60; return; }
538+
if (ch == 'K') {/*1111100*/ num = num.shl(7); num = num + 124; return; }
539+
if (ch == 'Y') {/*00010*/ num = num.shl(5); num = num + 2; return; }
540+
if (ch == 'r') {/*10010*/ num = num.shl(5); num = num + 18; return; }
541+
if (ch == 'E') {/*0001010*/ num = num.shl(7); num = num + 10; return; }
542+
if (ch == 'k') {/*1001010*/ num = num.shl(7); num = num + 74; return; }
543+
if (ch == 'c') {/*101010*/ num = num.shl(6); num = num + 42; return; }
544+
if (ch == 'p') {/*011010*/ num = num.shl(6); num = num + 26; return; }
545+
if (ch == 'B') {/*0111010*/ num = num.shl(7); num = num + 58; return; }
546+
if (ch == 'O') {/*1111010*/ num = num.shl(7); num = num + 122; return; }
547+
if (ch == '1') {/*00110*/ num = num.shl(5); num = num + 6; return; }
548+
if (ch == 's') {/*10110*/ num = num.shl(5); num = num + 22; return; }
549+
if (ch == '9') {/*001110*/ num = num.shl(6); num = num + 14; return; }
550+
if (ch == 'x') {/*101110*/ num = num.shl(6); num = num + 46; return; }
551+
if (ch == 'T') {/*11110*/ num = num.shl(5); num = num + 30; return; }
552+
if (ch == 'S') {/*00001*/ num = num.shl(5); num = num + 1; return; }
553+
if (ch == 'y') {/*0010001*/ num = num.shl(7); num = num + 17; return; }
554+
if (ch == 'X') {/*01010001*/ num = num.shl(8); num = num + 81; return; }
555+
if (ch == 'L') {/*11010001*/ num = num.shl(8); num = num + 209; return; }
556+
if (ch == 'o') {/*110001*/ num = num.shl(6); num = num + 49; return; }
557+
if (ch == 'D') {/*0001001*/ num = num.shl(7); num = num + 9; return; }
558+
if (ch == 'G') {/*1001001*/ num = num.shl(7); num = num + 73; return; }
559+
if (ch == 'F') {/*101001*/ num = num.shl(6); num = num + 41; return; }
560+
if (ch == '6') {/*011001*/ num = num.shl(6); num = num + 25; return; }
561+
if (ch == 'N') {/*0111001*/ num = num.shl(7); num = num + 57; return; }
562+
if (ch == 'P') {/*1111001*/ num = num.shl(7); num = num + 121; return; }
563+
if (ch == 'J') {/*101*/ num = num.shl(3); num = num + 5; return; }
564+
if (ch == '_') {/*0011*/ num = num.shl(4); num = num + 3; return; }
565+
if (ch == 'W') {/*0001011*/ num = num.shl(7); num = num + 11; return; }
566+
if (ch == 'v') {/*01001011*/ num = num.shl(8); num = num + 75; return; }
567+
if (ch == 'Z') {/*11001011*/ num = num.shl(8); num = num + 203; return; }
568+
if (ch == 'h') {/*0101011*/ num = num.shl(7); num = num + 43; return; }
569+
if (ch == 'R') {/*01101011*/ num = num.shl(8); num = num + 107; return; }
570+
if (ch == 'q') {/*11101011*/ num = num.shl(8); num = num + 235; return; }
571+
if (ch == 'e') {/*11011*/ num = num.shl(5); num = num + 27; return; }
572+
if (ch == 'f') {/*000111*/ num = num.shl(6); num = num + 7; return; }
573+
if (ch == '8') {/*0100111*/ num = num.shl(7); num = num + 39; return; }
574+
if (ch == 'b') {/*1100111*/ num = num.shl(7); num = num + 103; return; }
575+
if (ch == '2') {/*010111*/ num = num.shl(6); num = num + 23; return; }
576+
if (ch == 'V') {/*0110111*/ num = num.shl(7); num = num + 55; return; }
577+
if (ch == 'u') {/*1110111*/ num = num.shl(7); num = num + 119; return; }
578+
if (ch == 'n') {/*001111*/ num = num.shl(6); num = num + 15; return; }
579+
if (ch == 'g') {/*0101111*/ num = num.shl(7); num = num + 47; return; }
580+
if (ch == '7') {/*1101111*/ num = num.shl(7); num = num + 111; return; }
581+
if (ch == 'C') {/*0011111*/ num = num.shl(7); num = num + 31; return; }
582+
if (ch == 'z') {/*1011111*/ num = num.shl(7); num = num + 95; return; }
583+
if (ch == 'j') {/*00111111*/ num = num.shl(8); num = num + 63; return; }
584+
if (ch == '$') {/*0010111111*/ num = num.shl(10); num = num + 191; return; }
585+
if (ch == 'Q') {/*1010111111*/ num = num.shl(10); num = num + 703; return; }
586+
if (ch == 'H') {/*110111111*/ num = num.shl(9); num = num + 447; return; }
587+
if (ch == '0') {/*1111111*/ num = num.shl(7); num = num + 127; return; }
588588
assert(false);
589589
}
590590
} // namespace

utils/name-compression/HuffGen.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,15 @@ def generate_encoder(self, stack):
7575
if self.val:
7676
sb = "if (ch == '" + str(self.val) +"') {"
7777
sb += "/*" + "".join(map(str, reversed(stack))) + "*/ "
78-
for bit in reversed(stack):
79-
sb += "num = num.shl(1); "
80-
if bit: sb += "num = ++num; "
81-
sb += "return;}\n"
78+
# Encode the bit stream as a numeric value. Updating the APInt in one go
79+
# is much faster than inserting one bit at a time.
80+
numeric_val = 0
81+
for bit in reversed(stack): numeric_val = numeric_val * 2 + bit
82+
# Shift the value to make room in the bitstream and then add the numeric
83+
# value that represents the sequence of bits that we need to add.
84+
sb += "num = num.shl(%d); " % len(stack)
85+
sb += "num = num + %d; " % (numeric_val)
86+
sb += "return; }\n"
8287
return sb
8388
sb = ""
8489
if (self.left): sb += self.left .generate_encoder(stack + [0])

0 commit comments

Comments
 (0)