https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119456
Bug ID: 119456 Summary: gcobol: huge codegen for use of reference-modification (and missing optimization) Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: cobol Assignee: unassigned at gcc dot gnu.org Reporter: simonsobisch at gnu dot org Target Milestone: --- Sample program: ~~~ PROGRAM-ID. STRMOV. DATA DIVISION. WORKING-STORAGE SECTION. 77 dat pic x. PROCEDURE DIVISION. move 'a' to dat (1:1) STOP RUN. ~~~ This program has a single byte data field and assigns a single-byte. While this assignment can easily be "inlined", it currently creates a temporary item and uses multiple calls into libgcobol. To reproduce: ~~~ gcobol -g STRMOV.cob gdb -batch -ex "set disassemble-next-line on" -ex "b STRMOV.cob:6" -ex run a.out ~~~ Result: ~~~ Breakpoint 1, strmov () at STRMOV.cob:6 6 move 'a' to dat (1:1) => 0x00000000004015d2 <strmov+723>: 48 c7 85 20 ff ff ff 00 00 00 00 movq $0x0,-0xe0(%rbp) 0x00000000004015dd <strmov+734>: 48 8b 05 0c 0c 20 00 mov 0x200c0c(%rip),%rax # 0x6021f0 <dat.64.0+80> 0x00000000004015e4 <strmov+741>: 48 0d 00 00 04 00 or $0x40000,%rax 0x00000000004015ea <strmov+747>: 48 89 05 ff 0b 20 00 mov %rax,0x200bff(%rip) # 0x6021f0 <dat.64.0+80> 0x00000000004015f1 <strmov+754>: 48 c7 85 18 ff ff ff 01 00 00 00 movq $0x1,-0xe8(%rbp) 0x00000000004015fc <strmov+765>: 48 c7 05 e9 11 20 00 01 00 00 00 movq $0x1,0x2011e9(%rip) # 0x6027f0 0x0000000000401607 <strmov+776>: 48 c7 85 10 ff ff ff 00 00 00 00 movq $0x0,-0xf0(%rbp) 0x0000000000401612 <strmov+787>: 0f b6 0d 47 11 20 00 movzbl 0x201147(%rip),%ecx # 0x602760 <_literaln_1.1.0> 0x0000000000401619 <strmov+794>: 0f b6 c1 movzbl %cl,%eax 0x000000000040161c <strmov+797>: 48 89 c0 mov %rax,%rax 0x000000000040161f <strmov+800>: ba 00 00 00 00 mov $0x0,%edx 0x0000000000401624 <strmov+805>: 48 89 05 d5 11 20 00 mov %rax,0x2011d5(%rip) # 0x602800 0x000000000040162b <strmov+812>: 48 89 15 d6 11 20 00 mov %rdx,0x2011d6(%rip) # 0x602808 0x0000000000401632 <strmov+819>: 0f b6 05 c2 10 20 00 movzbl 0x2010c2(%rip),%eax # 0x6026fb <_intermediate__literaln_1_1.0.0+91> 0x0000000000401639 <strmov+826>: 0f be c0 movsbl %al,%eax 0x000000000040163c <strmov+829>: 89 05 ce 11 20 00 mov %eax,0x2011ce(%rip) # 0x602810 0x0000000000401642 <strmov+835>: 8b 05 c8 11 20 00 mov 0x2011c8(%rip),%eax # 0x602810 0x0000000000401648 <strmov+841>: f7 d8 neg %eax 0x000000000040164a <strmov+843>: 89 c1 mov %eax,%ecx 0x000000000040164c <strmov+845>: 48 8b 05 ad 11 20 00 mov 0x2011ad(%rip),%rax # 0x602800 0x0000000000401653 <strmov+852>: 48 8b 15 ae 11 20 00 mov 0x2011ae(%rip),%rdx # 0x602808 0x000000000040165a <strmov+859>: 48 89 c6 mov %rax,%rsi 0x000000000040165d <strmov+862>: 48 89 d0 mov %rdx,%rax 0x0000000000401660 <strmov+865>: 89 ca mov %ecx,%edx 0x0000000000401662 <strmov+867>: 48 89 f7 mov %rsi,%rdi 0x0000000000401665 <strmov+870>: 48 89 c6 mov %rax,%rsi 0x0000000000401668 <strmov+873>: e8 33 fa ff ff callq 0x4010a0 <__gg__scale_by_power_of_ten_2@plt> 0x000000000040166d <strmov+878>: 48 89 05 8c 11 20 00 mov %rax,0x20118c(%rip) # 0x602800 0x0000000000401674 <strmov+885>: 48 89 15 8d 11 20 00 mov %rdx,0x20118d(%rip) # 0x602808 0x000000000040167b <strmov+892>: c7 05 a3 11 20 00 00 00 00 00 movl $0x0,0x2011a3(%rip) # 0x602828 0x0000000000401685 <strmov+902>: 48 8b 05 74 11 20 00 mov 0x201174(%rip),%rax # 0x602800 0x000000000040168c <strmov+909>: 48 8b 15 75 11 20 00 mov 0x201175(%rip),%rdx # 0x602808 0x0000000000401693 <strmov+916>: 48 89 05 46 11 20 00 mov %rax,0x201146(%rip) # 0x6027e0 0x000000000040169a <strmov+923>: 48 8b 05 3f 11 20 00 mov 0x20113f(%rip),%rax # 0x6027e0 0x00000000004016a1 <strmov+930>: 48 89 05 40 11 20 00 mov %rax,0x201140(%rip) # 0x6027e8 0x00000000004016a8 <strmov+937>: 48 8b 05 39 11 20 00 mov 0x201139(%rip),%rax # 0x6027e8 0x00000000004016af <strmov+944>: 48 83 e8 01 sub $0x1,%rax 0x00000000004016b3 <strmov+948>: 48 89 05 2e 11 20 00 mov %rax,0x20112e(%rip) # 0x6027e8 0x00000000004016ba <strmov+955>: 48 c7 85 08 ff ff ff 00 00 00 00 movq $0x0,-0xf8(%rbp) 0x00000000004016c5 <strmov+966>: 0f b6 0d 94 10 20 00 movzbl 0x201094(%rip),%ecx # 0x602760 <_literaln_1.1.0> 0x00000000004016cc <strmov+973>: 0f b6 c1 movzbl %cl,%eax 0x00000000004016cf <strmov+976>: 48 89 c0 mov %rax,%rax 0x00000000004016d2 <strmov+979>: ba 00 00 00 00 mov $0x0,%edx 0x00000000004016d7 <strmov+984>: 48 89 05 22 11 20 00 mov %rax,0x201122(%rip) # 0x602800 0x00000000004016de <strmov+991>: 48 89 15 23 11 20 00 mov %rdx,0x201123(%rip) # 0x602808 0x00000000004016e5 <strmov+998>: 0f b6 05 0f 10 20 00 movzbl 0x20100f(%rip),%eax # 0x6026fb <_intermediate__literaln_1_1.0.0+91> 0x00000000004016ec <strmov+1005>: 0f be c0 movsbl %al,%eax 0x00000000004016ef <strmov+1008>: 89 05 1b 11 20 00 mov %eax,0x20111b(%rip) # 0x602810 0x00000000004016f5 <strmov+1014>: 8b 05 15 11 20 00 mov 0x201115(%rip),%eax # 0x602810 0x00000000004016fb <strmov+1020>: f7 d8 neg %eax 0x00000000004016fd <strmov+1022>: 89 c1 mov %eax,%ecx 0x00000000004016ff <strmov+1024>: 48 8b 05 fa 10 20 00 mov 0x2010fa(%rip),%rax # 0x602800 0x0000000000401706 <strmov+1031>: 48 8b 15 fb 10 20 00 mov 0x2010fb(%rip),%rdx # 0x602808 0x000000000040170d <strmov+1038>: 48 89 c6 mov %rax,%rsi 0x0000000000401710 <strmov+1041>: 48 89 d0 mov %rdx,%rax 0x0000000000401713 <strmov+1044>: 89 ca mov %ecx,%edx 0x0000000000401715 <strmov+1046>: 48 89 f7 mov %rsi,%rdi 0x0000000000401718 <strmov+1049>: 48 89 c6 mov %rax,%rsi 0x000000000040171b <strmov+1052>: e8 80 f9 ff ff callq 0x4010a0 <__gg__scale_by_power_of_ten_2@plt> 0x0000000000401720 <strmov+1057>: 48 89 05 d9 10 20 00 mov %rax,0x2010d9(%rip) # 0x602800 0x0000000000401727 <strmov+1064>: 48 89 15 da 10 20 00 mov %rdx,0x2010da(%rip) # 0x602808 0x000000000040172e <strmov+1071>: c7 05 f0 10 20 00 00 00 00 00 movl $0x0,0x2010f0(%rip) # 0x602828 0x0000000000401738 <strmov+1081>: 48 8b 05 c1 10 20 00 mov 0x2010c1(%rip),%rax # 0x602800 0x000000000040173f <strmov+1088>: 48 8b 15 c2 10 20 00 mov 0x2010c2(%rip),%rdx # 0x602808 0x0000000000401746 <strmov+1095>: 48 89 05 93 10 20 00 mov %rax,0x201093(%rip) # 0x6027e0 0x000000000040174d <strmov+1102>: 48 8b 05 8c 10 20 00 mov 0x20108c(%rip),%rax # 0x6027e0 0x0000000000401754 <strmov+1109>: 48 89 05 95 10 20 00 mov %rax,0x201095(%rip) # 0x6027f0 0x000000000040175b <strmov+1116>: 48 8b 05 8e 10 20 00 mov 0x20108e(%rip),%rax # 0x6027f0 0x0000000000401762 <strmov+1123>: 48 89 c2 mov %rax,%rdx 0x0000000000401765 <strmov+1126>: b8 01 00 00 00 mov $0x1,%eax 0x000000000040176a <strmov+1131>: 48 29 d0 sub %rdx,%rax 0x000000000040176d <strmov+1134>: 48 29 85 18 ff ff ff sub %rax,-0xe8(%rbp) 0x0000000000401774 <strmov+1141>: 48 c7 85 00 ff ff ff 00 00 00 00 movq $0x0,-0x100(%rbp) 0x000000000040177f <strmov+1152>: 48 c7 85 f8 fe ff ff 00 00 00 00 movq $0x0,-0x108(%rbp) 0x000000000040178a <strmov+1163>: 0f b6 0d cf 0f 20 00 movzbl 0x200fcf(%rip),%ecx # 0x602760 <_literaln_1.1.0> 0x0000000000401791 <strmov+1170>: 0f b6 c1 movzbl %cl,%eax 0x0000000000401794 <strmov+1173>: 48 89 c0 mov %rax,%rax 0x0000000000401797 <strmov+1176>: ba 00 00 00 00 mov $0x0,%edx 0x000000000040179c <strmov+1181>: 48 89 05 5d 10 20 00 mov %rax,0x20105d(%rip) # 0x602800 0x00000000004017a3 <strmov+1188>: 48 89 15 5e 10 20 00 mov %rdx,0x20105e(%rip) # 0x602808 0x00000000004017aa <strmov+1195>: 0f b6 05 4a 0f 20 00 movzbl 0x200f4a(%rip),%eax # 0x6026fb <_intermediate__literaln_1_1.0.0+91> 0x00000000004017b1 <strmov+1202>: 0f be c0 movsbl %al,%eax 0x00000000004017b4 <strmov+1205>: 89 05 56 10 20 00 mov %eax,0x201056(%rip) # 0x602810 0x00000000004017ba <strmov+1211>: 8b 05 50 10 20 00 mov 0x201050(%rip),%eax # 0x602810 0x00000000004017c0 <strmov+1217>: f7 d8 neg %eax 0x00000000004017c2 <strmov+1219>: 89 c1 mov %eax,%ecx 0x00000000004017c4 <strmov+1221>: 48 8b 05 35 10 20 00 mov 0x201035(%rip),%rax # 0x602800 0x00000000004017cb <strmov+1228>: 48 8b 15 36 10 20 00 mov 0x201036(%rip),%rdx # 0x602808 0x00000000004017d2 <strmov+1235>: 48 89 c6 mov %rax,%rsi 0x00000000004017d5 <strmov+1238>: 48 89 d0 mov %rdx,%rax 0x00000000004017d8 <strmov+1241>: 89 ca mov %ecx,%edx 0x00000000004017da <strmov+1243>: 48 89 f7 mov %rsi,%rdi 0x00000000004017dd <strmov+1246>: 48 89 c6 mov %rax,%rsi 0x00000000004017e0 <strmov+1249>: e8 bb f8 ff ff callq 0x4010a0 <__gg__scale_by_power_of_ten_2@plt> 0x00000000004017e5 <strmov+1254>: 48 89 05 14 10 20 00 mov %rax,0x201014(%rip) # 0x602800 0x00000000004017ec <strmov+1261>: 48 89 15 15 10 20 00 mov %rdx,0x201015(%rip) # 0x602808 0x00000000004017f3 <strmov+1268>: c7 05 2b 10 20 00 00 00 00 00 movl $0x0,0x20102b(%rip) # 0x602828 0x00000000004017fd <strmov+1278>: 48 8b 05 fc 0f 20 00 mov 0x200ffc(%rip),%rax # 0x602800 0x0000000000401804 <strmov+1285>: 48 8b 15 fd 0f 20 00 mov 0x200ffd(%rip),%rdx # 0x602808 0x000000000040180b <strmov+1292>: 48 89 05 1e 10 20 00 mov %rax,0x20101e(%rip) # 0x602830 0x0000000000401812 <strmov+1299>: 48 8b 05 17 10 20 00 mov 0x201017(%rip),%rax # 0x602830 0x0000000000401819 <strmov+1306>: 48 89 05 18 10 20 00 mov %rax,0x201018(%rip) # 0x602838 0x0000000000401820 <strmov+1313>: 48 8b 05 11 10 20 00 mov 0x201011(%rip),%rax # 0x602838 0x0000000000401827 <strmov+1320>: 48 83 e8 01 sub $0x1,%rax 0x000000000040182b <strmov+1324>: 48 89 05 06 10 20 00 mov %rax,0x201006(%rip) # 0x602838 0x0000000000401832 <strmov+1331>: 48 8b 05 ff 0f 20 00 mov 0x200fff(%rip),%rax # 0x602838 0x0000000000401839 <strmov+1338>: 48 01 85 00 ff ff ff add %rax,-0x100(%rbp) 0x0000000000401840 <strmov+1345>: 48 8b 95 18 ff ff ff mov -0xe8(%rbp),%rdx 0x0000000000401847 <strmov+1352>: 48 8b 85 00 ff ff ff mov -0x100(%rbp),%rax 0x000000000040184e <strmov+1359>: 41 b9 01 00 00 00 mov $0x1,%r9d 0x0000000000401854 <strmov+1365>: 41 b8 06 1a 40 00 mov $0x401a06,%r8d 0x000000000040185a <strmov+1371>: b9 07 00 00 00 mov $0x7,%ecx 0x000000000040185f <strmov+1376>: 48 89 c6 mov %rax,%rsi 0x0000000000401862 <strmov+1379>: bf a0 21 60 00 mov $0x6021a0,%edi 0x0000000000401867 <strmov+1384>: e8 a4 f7 ff ff callq 0x401010 <__gg__move_literala@plt> 0x000000000040186c <strmov+1389>: 48 8b 05 7d 09 20 00 mov 0x20097d(%rip),%rax # 0x6021f0 <dat.64.0+80> 0x0000000000401873 <strmov+1396>: 48 c7 c2 ff ff fb ff mov $0xfffffffffffbffff,%rdx 0x000000000040187a <strmov+1403>: 48 21 d0 and %rdx,%rax 0x000000000040187d <strmov+1406>: 48 89 05 6c 09 20 00 mov %rax,0x20096c(%rip) # 0x6021f0 <dat.64.0+80> ~~~ This issue is similar to 119455 but highlights multiple issues related to reference-modification "on top of this", which need to be inspected separately * missing optimization for "until end" (there's less code generated if "(1:)" is used, which is identical here as the variable "dat" is exactly one byte) * missing optimization for "complete item" (the variable "dat" is exactly one byte and already alphanumeric, so the effect of "(1:1)" is identical to no reference-modification - it would be different if var would not be of type USAGE DISPLAY, which it is) * a lot of calls to __gg__scale_by_power_of_ten_2 - I have no clue why that is necessary