testsuite, fortran: Remove self assignment non-statements
authorNils-Christian Kempke <nils-christian.kempke@intel.com>
Fri, 20 May 2022 15:15:44 +0000 (17:15 +0200)
committerIjaz, Abdul B <abdul.b.ijaz@intel.com>
Thu, 7 Sep 2023 22:35:18 +0000 (00:35 +0200)
There were a couple of places in the testsuite where instructions like

  var = var

were written in the source code of tests.  These were usually dummy
statements meant to generate a line table entry at that line on which
to break later on.

This worked fine for gfortran and ifx, but it seems that, when compiled
with ifort (2021.6.0) these statements do not actually create any
assmbler instructions and especially no line table entries.  Consider
the program

  program test
    Integer var :: var = 1
    var = var
  end program

compiled with gfortran (13.0.0, -O0 -g).  The linetable as emitted by
'objdump --dwarf=decodedline ./a.out' looks like

  test.f90:
  File name   Line number    Starting address    View    Stmt
  test.f90              1            0x401172               x
  test.f90              3            0x401176               x
  test.f90              4            0x401182               x
  test.f90              4            0x401185               x
  test.f90              4            0x401194               x
  test.f90              -            0x4011c0

actually containing line table info for line 3.  Running gdb, breaking
at 3 and checking the assembly we see

   0x0000000000401172 <+0>:     push   %rbp
   0x0000000000401173 <+1>:     mov    %rsp,%rbp
=> 0x0000000000401176 <+4>:     mov    0x2ebc(%rip),%eax   # 0x404038 <var.1>
   0x000000000040117c <+10>:    mov    %eax,0x2eb6(%rip)   # 0x404038 <var.1>
   0x0000000000401182 <+16>:    nop
   0x0000000000401183 <+17>:    pop    %rbp
   0x0000000000401184 <+18>:    ret

so two mov instructions are being issued for this assignment one copying
the value into a register and one writing it back to the same memory.
Ifort (2021.6.0, -O0 -g) on the other hand does not emit anything here
and also has no line table entry:

  test.f90:
  File name   Line number    Starting address    View    Stmt
  test.f90              1            0x4040f8               x
  test.f90              4            0x404109               x
  test.f90              4            0x40410e               x
  test.f90              -            0x404110

As I do not think that this is really a bug (on either side, gfortran/ifx or
ifort), and as I don't think this behavior is covered in the Fortran
standard, I changed these lines to become actual value assignments.

This removes a few FAILs in the testsuite when ran with ifort.

Approved-by: Tom Tromey <tom@tromey.com>
gdb/testsuite/gdb.fortran/library-module-lib.f90
gdb/testsuite/gdb.fortran/library-module-main.f90
gdb/testsuite/gdb.fortran/module.f90

index 89e5f3fc6f45a088a899284bc1e13531e236ff76..24a7a8f6287bb07e028caf434292907711bc7285 100644 (file)
@@ -19,7 +19,7 @@ contains
         subroutine lib_func
         if (var_i .ne. 1) call abort
         var_i = 2
-        var_i = var_i                 ! i-is-2-in-lib
+        var_i = 2                 ! i-is-2-in-lib
         end subroutine lib_func
 end module lib
 
index 6b5fe87d0ea93914a2a9cda97537ae5bc414696b..85f9e6f119e4226910543d655653f6ad0dbf3255 100644 (file)
@@ -19,5 +19,5 @@
        call lib_func
         if (var_i .ne. 2) call abort
         if (var_j .ne. 3) call abort
-        var_i = var_i                 ! i-is-2-in-main
+        var_i = 7                 ! i-is-2-in-main
 end
index 4aaf22441d0f5d3c498673aeb977b3838d6a385c..fba899bbd38334baf4fe899cff1806f03dc712d2 100644 (file)
@@ -40,18 +40,19 @@ end module moduse
         subroutine sub1
         use mod1
         if (var_i .ne. 1) call abort
-        var_i = var_i                         ! i-is-1
+        var_i = 1                         ! i-is-1
         end
 
         subroutine sub2
         use mod2
         if (var_i .ne. 2) call abort
-        var_i = var_i                         ! i-is-2
+        var_i = 2                         ! i-is-2
         end
 
         subroutine sub3
-        USE mod3
-        var_i = var_i                         ! i-is-3
+        use mod3
+        if (var_i .ne. 3) call abort
+        var_i = 3                         ! i-is-3
         END
 
         program module
@@ -68,5 +69,5 @@ end module moduse
         if (var_i .ne. 14) call abort
         if (var_x .ne. 30) call abort
         if (var_z .ne. 31) call abort
-        var_b = var_b                         ! a-b-c-d
+        var_b = 11                         ! a-b-c-d
 end