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

Reply via email to