UNCONFIRMED73402
Legacy JIT (JSVALUE32_64) doesn't map() on all opcodes, and does too many store
https://bugs.webkit.org/show_bug.cgi?id=73402
Summary Legacy JIT (JSVALUE32_64) doesn't map() on all opcodes, and does too many store
Zheng Liu
Reported 2011-11-29 22:35:03 PST
Legacy JIT (32bit) doesn't have map() on all opcodes. Besides, it keep storing result register which is apparently dead at next opcode.
Attachments
Patch. Extend map() to most opcodes, and skip storing the result when possible. (248.45 KB, patch)
2011-11-29 22:48 PST, Zheng Liu
webkit-ews: commit-queue-
Fix some style and build problem (247.69 KB, patch)
2011-11-29 23:48 PST, Zheng Liu
no flags
Fix style (247.68 KB, patch)
2011-11-30 00:00 PST, Zheng Liu
ggaren: review-
gyuyoung.kim: commit-queue-
Zheng Liu
Comment 1 2011-11-29 22:48:15 PST
Created attachment 117129 [details] Patch. Extend map() to most opcodes, and skip storing the result when possible.
Zheng Liu
Comment 2 2011-11-29 22:48:36 PST
Extend map() to most opcodes. And skip storing the result, if it is known dead (at next opcode). With DFG, it is 1% win on SS, 4% win on Kraken, neutral on V8, by default harnness. It seems to have no regression in IE Test Center/mozilla Test/sputnik Test. Patch have two parts: bytecompiler: Try to find dead Temporary virtual registers, by finding where Temporaries are recycled. Unfortunately BytecodeGenerator does not accurately manage Temporaries' life cycle. So there are a lot of fixes to restrict unrefed Temporary usage. jit: Try to extend map() to most opcodes, make it possible to skip storing the result.
Zheng Liu
Comment 3 2011-11-29 22:49:02 PST
DFG off, gtk2 static build, iterations=default, Fedora 14-x86, Nehalem CPU 2.8G VMs tested: "TipOfTree" at /home/zheng.z.liu/WebKit0/WebKitBuild/custom/build.m/Programs/jsc "MyChanges" at /home/zheng.z.liu/WebKit2/WebKitBuild/custom/build.m/Programs/jsc TipOfTree MyChanges 3d-cube 10.7299+-0.0979 ? 10.8028+-0.0430 ? 3d-morph 12.1760+-0.0827 ^ 11.7386+-0.0822 ^ definitely 1.0373x faster 3d-raytrace 13.1111+-0.0652 ^ 12.2848+-0.0242 ^ definitely 1.0673x faster access-binary-trees 3.4129+-0.0342 ^ 3.1783+-0.0197 ^ definitely 1.0738x faster access-fannkuch 21.6341+-0.0205 ^ 20.3443+-0.1177 ^ definitely 1.0634x faster access-nbody 12.2242+-0.0027 ^ 10.2661+-0.0913 ^ definitely 1.1907x faster access-nsieve 6.2169+-0.0779 6.1782+-0.0030 bitops-3bit-bits-in-byte 3.3198+-0.0269 ^ 3.0664+-0.0426 ^ definitely 1.0827x faster bitops-bits-in-byte 7.2323+-0.1291 ? 7.2978+-0.0762 ? bitops-bitwise-and 7.8786+-0.0796 ^ 7.5659+-0.1007 ^ definitely 1.0413x faster bitops-nsieve-bits 8.0953+-0.1030 8.0018+-0.0531 might be 1.0117x faster controlflow-recursive 3.3424+-0.0555 ^ 2.9797+-0.0321 ^ definitely 1.1217x faster crypto-aes 10.1450+-0.0191 ! 10.5361+-0.0688 ! definitely 1.0385x slower crypto-md5 4.6435+-0.0608 ^ 4.4566+-0.0192 ^ definitely 1.0419x faster crypto-sha1 3.7764+-0.0362 ^ 3.6538+-0.0507 ^ definitely 1.0335x faster date-format-tofte 12.8445+-0.0775 ^ 12.3438+-0.0222 ^ definitely 1.0406x faster date-format-xparb 13.0317+-0.3405 12.8203+-0.0767 might be 1.0165x faster math-cordic 11.0584+-0.0394 ^ 9.1355+-0.1178 ^ definitely 1.2105x faster math-partial-sums 16.6719+-0.0501 ^ 15.6420+-0.0261 ^ definitely 1.0658x faster math-spectral-norm 6.4410+-0.0681 ! 7.4509+-0.0414 ! definitely 1.1568x slower regexp-dna 13.6106+-0.0573 ? 13.6178+-0.0579 ? string-base64 6.5187+-0.0790 ^ 6.1316+-0.0622 ^ definitely 1.0631x faster string-fasta 11.2200+-0.0458 ^ 10.9082+-0.1047 ^ definitely 1.0286x faster string-tagcloud 17.0479+-0.0730 ^ 16.9126+-0.0547 ^ definitely 1.0080x faster string-unpack-code 28.3535+-0.0649 ! 28.5932+-0.1197 ! definitely 1.0085x slower string-validate-input 8.4994+-0.1049 ^ 8.0978+-0.0715 ^ definitely 1.0496x faster <arithmetic> * 10.5091+-0.0315 ^ 10.1540+-0.0264 ^ definitely 1.0350x faster <geometric> 9.0324+-0.0284 ^ 8.6973+-0.0229 ^ definitely 1.0385x faster <harmonic> 7.6695+-0.0237 ^ 7.3361+-0.0204 ^ definitely 1.0454x faster TipOfTree MyChanges ai-astar 2060.0095+-1.1673 ^ 1917.0529+-3.7938 ^ definitely 1.0746x faster audio-beat-detection 802.3960+-1.6252 ^ 656.6187+-0.9128 ^ definitely 1.2220x faster audio-dft 682.1333+-1.4464 ^ 656.7744+-2.6981 ^ definitely 1.0386x faster audio-fft 639.7906+-0.4321 ^ 500.7726+-1.4362 ^ definitely 1.2776x faster audio-oscillator 517.0060+-1.3634 ^ 505.7039+-1.7654 ^ definitely 1.0223x faster imaging-darkroom 775.1255+-4.8726 ^ 752.3020+-5.3094 ^ definitely 1.0303x faster imaging-desaturate 1111.1603+-1.6052 ^ 928.8943+-5.7744 ^ definitely 1.1962x faster imaging-gaussian-blur 3210.9204+-3.7735 ^ 3036.3846+-2.6880 ^ definitely 1.0575x faster json-parse-financial 85.6507+-0.1636 ! 87.5040+-0.0996 ! definitely 1.0216x slower json-stringify-tinderbox 131.2256+-0.6026 130.8460+-0.4191 stanford-crypto-aes 189.0765+-2.5922 ^ 184.7670+-1.2266 ^ definitely 1.0233x faster stanford-crypto-ccm 154.2613+-0.2227 ^ 151.4467+-0.2868 ^ definitely 1.0186x faster stanford-crypto-pbkdf2 833.7041+-2.7048 ^ 824.7818+-2.3132 ^ definitely 1.0108x faster stanford-crypto-sha256-iterative 290.7925+-0.5356 ^ 285.7382+-0.2441 ^ definitely 1.0177x faster <arithmetic> * 820.2323+-0.7731 ^ 758.5419+-0.6139 ^ definitely 1.0813x faster <geometric> 510.6352+-0.6970 ^ 479.0637+-0.5239 ^ definitely 1.0659x faster <harmonic> 311.7726+-0.5813 ^ 303.8483+-0.4844 ^ definitely 1.0261x faster TipOfTree MyChanges crypto 279.5371+-1.2833 ^ 263.4939+-1.3707 ^ definitely 1.0609x faster deltablue 338.0535+-1.1744 ? 339.8352+-17.1564 ? earley-boyer 178.3192+-0.2212 ^ 165.4536+-0.4651 ^ definitely 1.0778x faster raytrace 83.6897+-0.6032 ^ 81.0091+-0.8318 ^ definitely 1.0331x faster regexp 143.8896+-0.3438 ! 144.6095+-0.3610 ! definitely 1.0050x slower richards 400.9171+-1.1698 ^ 370.9047+-1.3849 ^ definitely 1.0809x faster splay 156.1654+-0.3635 ^ 152.4389+-0.3542 ^ definitely 1.0244x faster <arithmetic> 225.7959+-0.3067 ^ 216.8207+-2.6747 ^ definitely 1.0414x faster <geometric> * 199.7837+-0.3258 ^ 192.4874+-1.4562 ^ definitely 1.0379x faster <harmonic> 175.2581+-0.4546 ^ 169.4389+-0.7903 ^ definitely 1.0343x faster
Zheng Liu
Comment 4 2011-11-29 22:49:21 PST
DFG on, gtk2 static build, iterations=default, Fedora 14-x86, Nehalem CPU 2.8G 1% win on SS, 4% win on Kraken, neutral on V8 VMs tested: "TipOfTree" at /home/zheng.z.liu/WebKit0/WebKitBuild/custom/build.dfg.m/Programs/jsc "MyChanges" at /home/zheng.z.liu/WebKit2/WebKitBuild/custom/build.dfg.m/Programs/jsc TipOfTree MyChanges 3d-cube 9.0533+-0.0631 ! 9.3978+-0.0488 ! definitely 1.0380x slower 3d-morph 12.0757+-0.0484 ^ 11.7738+-0.0786 ^ definitely 1.0256x faster 3d-raytrace 10.8133+-0.1269 ! 11.1413+-0.0345 ! definitely 1.0303x slower access-binary-trees 2.1949+-0.0217 ! 2.2329+-0.0108 ! definitely 1.0173x slower access-fannkuch 11.3794+-0.0502 ? 11.4030+-0.0417 ? access-nbody 6.3210+-0.0469 ? 6.4044+-0.0630 ? might be 1.0132x slower access-nsieve 4.4698+-0.0480 ? 4.4778+-0.0478 ? bitops-3bit-bits-in-byte 1.4032+-0.0145 ? 1.4221+-0.0103 ? might be 1.0135x slower bitops-bits-in-byte 5.5803+-0.0524 ? 5.6032+-0.0344 ? bitops-bitwise-and 5.1132+-0.0657 ? 5.1188+-0.0543 ? bitops-nsieve-bits 8.1424+-0.1310 7.9915+-0.0455 might be 1.0189x faster controlflow-recursive 3.5910+-0.0247 3.5438+-0.0258 might be 1.0133x faster crypto-aes 10.7692+-0.0296 ! 11.0797+-0.0929 ! definitely 1.0288x slower crypto-md5 4.0194+-0.0399 ? 4.0714+-0.0467 ? might be 1.0129x slower crypto-sha1 3.2182+-0.0191 ! 3.2985+-0.0257 ! definitely 1.0250x slower date-format-tofte 12.7867+-0.0593 ^ 12.6268+-0.0346 ^ definitely 1.0127x faster date-format-xparb 12.6973+-0.0532 12.6012+-0.1494 math-cordic 10.9853+-0.0648 ^ 9.1645+-0.0417 ^ definitely 1.1987x faster math-partial-sums 16.6687+-0.0315 ^ 15.6784+-0.0348 ^ definitely 1.0632x faster math-spectral-norm 2.9213+-0.0093 ! 2.9942+-0.0216 ! definitely 1.0249x slower regexp-dna 13.6129+-0.0824 13.5872+-0.0669 string-base64 5.7356+-0.0580 5.6871+-0.0678 string-fasta 11.7362+-0.0338 ^ 11.2978+-0.0308 ^ definitely 1.0388x faster string-tagcloud 17.2178+-0.0852 ? 17.2631+-0.0879 ? string-unpack-code 29.7422+-0.1879 29.4895+-0.0956 string-validate-input 8.3988+-0.0997 ? 8.4087+-0.1002 ? <arithmetic> * 9.2557+-0.0283 ^ 9.1446+-0.0234 ^ definitely 1.0121x faster <geometric> 7.4442+-0.0237 ^ 7.3979+-0.0214 ^ definitely 1.0063x faster <harmonic> 5.7180+-0.0214 ? 5.7343+-0.0189 ? TipOfTree MyChanges ai-astar 886.6191+-0.5268 886.2381+-0.3731 audio-beat-detection 469.0883+-5.5741 ^ 458.9102+-1.1328 ^ definitely 1.0222x faster audio-dft 419.5918+-1.5033 419.1186+-2.0605 audio-fft 300.1250+-0.1926 ? 300.2916+-0.3497 ? audio-oscillator 422.8794+-3.6703 ? 423.3500+-3.9690 ? imaging-darkroom 494.0113+-4.0936 ? 494.3817+-4.2241 ? imaging-desaturate 1093.3916+-0.6154 ^ 867.8375+-10.8851 ^ definitely 1.2599x faster imaging-gaussian-blur 844.3448+-0.1412 ? 844.5581+-0.1032 ? json-parse-financial 86.6360+-0.0937 ? 86.7410+-0.0817 ? json-stringify-tinderbox 130.3629+-0.1476 ? 130.4264+-0.2830 ? stanford-crypto-aes 152.4441+-0.3615 ^ 149.0378+-0.4452 ^ definitely 1.0229x faster stanford-crypto-ccm 150.8112+-0.5162 ^ 149.1371+-0.7646 ^ definitely 1.0112x faster stanford-crypto-pbkdf2 302.5644+-1.4650 ? 305.9965+-2.2138 ? might be 1.0113x slower stanford-crypto-sha256-iterative 124.9219+-0.1413 ! 125.2364+-0.0862 ! definitely 1.0025x slower <arithmetic> * 419.8423+-0.5168 ^ 402.9472+-0.9790 ^ definitely 1.0419x faster <geometric> 316.0232+-0.3920 ^ 309.9823+-0.6101 ^ definitely 1.0195x faster <harmonic> 236.5713+-0.2326 ^ 234.8587+-0.3960 ^ definitely 1.0073x faster TipOfTree MyChanges crypto 118.4429+-0.1800 ! 119.2441+-0.1329 ! definitely 1.0068x slower deltablue 204.3261+-1.0771 ? 204.7609+-1.5262 ? earley-boyer 154.0166+-2.0974 152.2883+-0.1779 might be 1.0113x faster raytrace 69.8034+-0.5384 ? 70.3572+-0.3343 ? regexp 144.2229+-0.2078 ? 144.9580+-0.6145 ? richards 220.3087+-0.7897 ? 221.0064+-0.9982 ? splay 142.6716+-0.5784 142.2516+-0.5147 <arithmetic> 150.5417+-0.2619 ? 150.6952+-0.2573 ? <geometric> * 142.2582+-0.2667 ? 142.4813+-0.1887 ? <harmonic> 132.9727+-0.3263 ? 133.3218+-0.1822 ?
WebKit Review Bot
Comment 5 2011-11-29 22:50:34 PST
Attachment 117129 [details] did not pass style-queue: Failed to run "['Tools/Scripts/check-webkit-style', '--diff-files', u'Source/JavaScriptCore/ChangeLog', u'Source..." exit_code: 1 Last 3072 characters of output: espace/indent] [4] Source/JavaScriptCore/bytecompiler/RegisterID.h:116: Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons. [readability/comparison_to_zero] [5] Source/JavaScriptCore/jit/CompactJITCodeMap.h:237: Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons. [readability/comparison_to_zero] [5] Source/JavaScriptCore/jit/CompactJITCodeMap.h:238: Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons. [readability/comparison_to_zero] [5] Source/JavaScriptCore/jit/CompactJITCodeMap.h:337: Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons. [readability/comparison_to_zero] [5] Source/JavaScriptCore/ChangeLog:8: Line contains tab character. [whitespace/tab] [5] Source/JavaScriptCore/ChangeLog:9: Line contains tab character. [whitespace/tab] [5] Source/JavaScriptCore/ChangeLog:10: Line contains tab character. [whitespace/tab] [5] Source/JavaScriptCore/ChangeLog:11: Line contains tab character. [whitespace/tab] [5] Source/JavaScriptCore/assembler/X86Assembler.h:1244: leal_mr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1501: movdqa_rr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1507: movdqa_rm is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1513: movdqu_rm is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1519: movdqa_mr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1525: movdqu_mr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1570: pcmpeqd_rr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/jit/JIT.cpp:1146: Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons. [readability/comparison_to_zero] [5] Source/JavaScriptCore/jit/JITArithmetic32_64.cpp:293: Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons. [readability/comparison_to_zero] [5] Source/JavaScriptCore/jit/JITOpcodes32_64.cpp:1473: Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons. [readability/comparison_to_zero] [5] Source/JavaScriptCore/jit/JITInlineMethods.h:674: An else statement can be removed when the prior "if" concludes with a return, break, continue or goto statement. [readability/control_flow] [4] Total errors found: 20 in 31 files If any of these errors are false positives, please file a bug against check-webkit-style.
Early Warning System Bot
Comment 6 2011-11-29 22:59:39 PST
Comment on attachment 117129 [details] Patch. Extend map() to most opcodes, and skip storing the result when possible. Attachment 117129 [details] did not pass qt-ews (qt): Output: http://queues.webkit.org/results/10693078
Gyuyoung Kim
Comment 7 2011-11-29 23:08:01 PST
Comment on attachment 117129 [details] Patch. Extend map() to most opcodes, and skip storing the result when possible. Attachment 117129 [details] did not pass efl-ews (efl): Output: http://queues.webkit.org/results/10709069
Zheng Liu
Comment 8 2011-11-29 23:48:48 PST
Created attachment 117132 [details] Fix some style and build problem
WebKit Review Bot
Comment 9 2011-11-29 23:52:18 PST
Attachment 117132 [details] did not pass style-queue: Failed to run "['Tools/Scripts/check-webkit-style', '--diff-files', u'Source/JavaScriptCore/ChangeLog', u'Source..." exit_code: 1 Source/JavaScriptCore/bytecompiler/RegisterID.h:37: Code inside a namespace should not be indented. [whitespace/indent] [4] Source/JavaScriptCore/bytecompiler/RegisterID.h:116: Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons. [readability/comparison_to_zero] [5] Source/JavaScriptCore/assembler/X86Assembler.h:1244: leal_mr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1501: movdqa_rr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1507: movdqa_rm is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1513: movdqu_rm is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1519: movdqa_mr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1525: movdqu_mr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1570: pcmpeqd_rr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Total errors found: 9 in 31 files If any of these errors are false positives, please file a bug against check-webkit-style.
Zheng Liu
Comment 10 2011-11-29 23:54:20 PST
Comment on attachment 117132 [details] Fix some style and build problem PS: Non-x86 JSVALUE32_64 won't build, because: 1. Need to define 2 more GPR as scratch;(which I'm not sure which ones are safe) 2. There may be some bug e.g forget to wrap CPU(X86) switch.
Zheng Liu
Comment 11 2011-11-30 00:00:10 PST
Created attachment 117133 [details] Fix style
Zheng Liu
Comment 12 2011-11-30 00:03:09 PST
Comment on attachment 117133 [details] Fix style Don't know how to deal with the rest style problems? RegisterID.h: It's originally indented. Fix indent for the whole file? X86Assembler.h: ??
WebKit Review Bot
Comment 13 2011-11-30 00:06:17 PST
Attachment 117133 [details] did not pass style-queue: Failed to run "['Tools/Scripts/check-webkit-style', '--diff-files', u'Source/JavaScriptCore/ChangeLog', u'Source..." exit_code: 1 Source/JavaScriptCore/bytecompiler/RegisterID.h:37: Code inside a namespace should not be indented. [whitespace/indent] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1244: leal_mr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1501: movdqa_rr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1507: movdqa_rm is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1513: movdqu_rm is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1519: movdqa_mr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1525: movdqu_mr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Source/JavaScriptCore/assembler/X86Assembler.h:1570: pcmpeqd_rr is incorrectly named. Don't use underscores in your identifier names. [readability/naming] [4] Total errors found: 8 in 31 files If any of these errors are false positives, please file a bug against check-webkit-style.
Gyuyoung Kim
Comment 14 2011-11-30 00:27:01 PST
Geoffrey Garen
Comment 15 2011-11-30 11:08:11 PST
I like the performance result here, but I think this is the wrong approach. Our strategy is to use the DFG to track liveness and perform register allocation and dead store elimination. Over time, we want the DFG to get smarter, while the baseline execution engine remains constant or gets significantly simpler, thus improving execution times for one-time code and reducing our maintenance burden. If there's hot code that benefits from these optimizations, the best approach is to make sure the DFG compiles and optimizes that code. These are your biggest speedups, which account for almost 100% of your total net speedup: imaging-desaturate 1093.3916+-0.6154 ^ 867.8375+-10.8851 ^ definitely 1.2599x faster math-cordic 10.9853+-0.0648 ^ 9.1645+-0.0417 ^ definitely 1.1987x faster math-partial-sums 16.6687+-0.0315 ^ 15.6784+-0.0348 ^ definitely 1.0632x faster The best approach is to analyze why this code didn't execute in the DFG JIT, and fix that. Historically, optimizations based on assumptions about bytecode virtual register allocation patterns have proven fragile. I'm very concerned that this new liveness tracking framework will introduce subtle bugs and a not-so-subtle maintenance burden. To justify this risk / burden, I'd like to see evidence that there's some essential reason the DFG should not compile and optimize this code. Otherwise, please solve this performance problem by ensuring that the DFG compiles and optimizes this code.
Geoffrey Garen
Comment 16 2011-11-30 11:08:45 PST
Comment on attachment 117133 [details] Fix style View in context: https://bugs.webkit.org/attachment.cgi?id=117133&action=review > Source/JavaScriptCore/bytecode/CodeBlock.cpp:1442 > + , m_instructionsSrcDstInfo() You can omit this line of code. > Source/JavaScriptCore/bytecode/CodeBlock.cpp:1496 > + , m_instructionsSrcDstInfo() You can omit this line of code.
Note You need to log in before you can comment on or make changes to this bug.