https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63247

Thomas Schwinge <tschwinge at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |openmp
                 CC|                            |tschwinge at gcc dot gnu.org
            Version|unknown                     |5.0

--- Comment #1 from Thomas Schwinge <tschwinge at gcc dot gnu.org> ---
Actually, here is a C test case that exhibits the problem on x86 (which has a
flag to switch on alignment checking), with OpenMP using the non-shared memory
host plugin.  Need to build with -O, as otherwise there will be other alignment
errors.  This is probably too fragile for any test suite usage, though.

    #include <stdlib.h>

    int
    main(int argc, char **argv)
    {
    #define N 4
        short a[N];

        a[0] = 10;
        a[1] = 10;
        a[2] = 10;
        a[3] = 10;

    #pragma omp target map(a[1:N-1])
        {
            __asm__("pushf\norl $(1<<18),(%rsp)\npopf");
            a[1] = 51;
            a[2] = 52;
            a[3] = 53;
            __asm__("pushf\nandl $(~(1<<18)),(%rsp)\npopf");
        }

        if (a[0] != 10)
          abort ();
        if (a[1] != 51)
          abort ();
        if (a[2] != 52)
          abort ();
        if (a[3] != 53)
          abort ();

        return 0;
    }

    $ gdb -q ./a.out 
    Reading symbols from ./a.out...done.
    (gdb) r
    Starting program: [...]/a.out 
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

    Program received signal SIGBUS, Bus error.
    0x000000000040080e in main._omp_fn.0 (.omp_data_i=0x6020c0) at
source-gcc/libgomp/testsuite/libgomp.c/pointer-align-1.c:19
    19              a[1] = 51;
    (gdb) disassemble 
    Dump of assembler code for function main._omp_fn.0:
       0x0000000000400801 <+0>:     pushfq 
       0x0000000000400802 <+1>:     orl    $0x40000,(%rsp)
       0x0000000000400809 <+8>:     popfq  
       0x000000000040080a <+9>:     mov    0x8(%rdi),%rax
    => 0x000000000040080e <+13>:    mov    (%rax),%rax
       0x0000000000400811 <+16>:    movw   $0x33,0x2(%rax)
       0x0000000000400817 <+22>:    mov    0x8(%rdi),%rax
       0x000000000040081b <+26>:    mov    (%rax),%rax
       0x000000000040081e <+29>:    movw   $0x34,0x4(%rax)
       0x0000000000400824 <+35>:    mov    0x8(%rdi),%rax
       0x0000000000400828 <+39>:    mov    (%rax),%rax
       0x000000000040082b <+42>:    movw   $0x35,0x6(%rax)
       0x0000000000400831 <+48>:    pushfq 
       0x0000000000400832 <+49>:    andl   $0xfffbffff,(%rsp)
       0x0000000000400839 <+56>:    popfq  
       0x000000000040083a <+57>:    retq   
    End of assembler dump.
    (gdb) info registers rax
    rax            0x6020d6 6299862

Reply via email to