Skip to content

movaps (16 byte aligned) generated instead of movups incorrectly for pointer (8 byte aligned) assignment #179605

@grooverdan

Description

@grooverdan

I have a class like:

   class Query_arena
  { 
  public:
    /*  
      List of items created in the parser for this query. Every item puts
      itself to the list on creation (see Item::Item() for details))
    */
    void *free_list;
    void *mem_root; 
    enum enum_state
    {
      STMT_INITIALIZED= 0, STMT_INITIALIZED_FOR_SP= 1, STMT_PREPARED= 2,
      STMT_CONVENTIONAL_EXECUTION= 3, STMT_EXECUTED= 4,
      STMT_SP_QUERY_ARGUMENTS= 5, STMT_ERROR= -1
    };
  
    enum_state state;

      
    void set_query_arena(Query_arena *set);
  
  };
 
 
  void Query_arena::set_query_arena(Query_arena *set)
  {
    mem_root=  set->mem_root;
    free_list= set->free_list;
    state= set->state;
  }

Code generated by:

 clang --version
Debian clang version 21.1.8 (++20251221033036+2078da43e25a-1~exp1~20251221153213.50)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-21/bin

Without -stdlib=libc++:

$  /usr/bin/clang++ -DHAVE_CONFIG_H -DHAVE_EVENT_SCHEDULER -DHAVE_POOL_OF_THREADS -DMYSQL_SERVER -D_FILE_OFFSET_BITS=64 -I/source/wsrep-lib/include -I/source/wsrep-lib/wsrep-API/v26 -I/build/include -I/source/include/providers -I/source/include -I/source/sql -I/source/zlib -I/build/zlib -I/build/sql -I/source/tpool  -O2    sql/CMakeFiles/sql.dir/sql_class.cc.o -MF sql/CMakeFiles/sql.dir/sql_class.cc.o.d -o sql/CMakeFiles/sql.dir/sql_class.cc.o -c /source/sql/sql_class.cc
clang++: warning: sql/CMakeFiles/sql.dir/sql_class.cc.o: 'linker' input unused [-Wunused-command-line-argument]
clang++: warning: argument unused during compilation: '-MF sql/CMakeFiles/sql.dir/sql_class.cc.o.d' [-Wunused-command-line-argument]

buildbot@dedc0770fda6:/build$ 
buildbot@dedc0770fda6:/build$ objdump -d sql/CMakeFiles/sql.dir/sql_class.cc.o | grep -A 100 _ZN3THD25set_n_backup_active_arenaEP11Query_arenaS1_ | more
000000000000b1b0 <_ZN3THD25set_n_backup_active_arenaEP11Query_arenaS1_>:
    b1b0:	41 57                	push   %r15
    b1b2:	41 56                	push   %r14
    b1b4:	53                   	push   %rbx
    b1b5:	80 7a 18 00          	cmpb   $0x0,0x18(%rdx)
    b1b9:	75 26                	jne    b1e1 <_ZN3THD25set_n_backup_active_arenaEP11Query_arenaS1_+0x31>
    b1bb:	0f 10 47 20          	movups 0x20(%rdi),%xmm0
    b1bf:	0f 11 42 08          	movups %xmm0,0x8(%rdx)
    b1c3:	8b 47 34             	mov    0x34(%rdi),%eax
    b1c6:	89 42 1c             	mov    %eax,0x1c(%rdx)
    b1c9:	0f 10 46 08          	movups 0x8(%rsi),%xmm0
    b1cd:	0f 11 47 20          	movups %xmm0,0x20(%rdi)

With -stdlib=libc++:

  /usr/bin/clang++ -DHAVE_CONFIG_H -DHAVE_EVENT_SCHEDULER -DHAVE_POOL_OF_THREADS -DMYSQL_SERVER -D_FILE_OFFSET_BITS=64 -I/source/wsrep-lib/include -I/source/wsrep-lib/wsrep-API/v26 -I/build/include -I/source/include/providers -I/source/include -I/source/sql -I/source/zlib -I/build/zlib -I/build/sql -I/source/tpool -stdlib=libc++ -O2    sql/CMakeFiles/sql.dir/sql_class.cc.o -MF sql/CMakeFiles/sql.dir/sql_class.cc.o.d -o sql/CMakeFiles/sql.dir/sql_class.cc.o -c /source/sql/sql_class.cc


000000000000b070 <_ZN3THD25set_n_backup_active_arenaEP11Query_arenaS1_>:
    b070:	41 57                	push   %r15
    b072:	41 56                	push   %r14
    b074:	53                   	push   %rbx
    b075:	80 7a 18 00          	cmpb   $0x0,0x18(%rdx)
    b079:	75 26                	jne    b0a1 <_ZN3THD25set_n_backup_active_arenaEP11Query_arenaS1_+0x31>
    b07b:	0f 28 47 20          	movaps 0x20(%rdi),%xmm0
    b07f:	0f 11 42 08          	movups %xmm0,0x8(%rdx)
    b083:	8b 47 34             	mov    0x34(%rdi),%eax
    b086:	89 42 1c             	mov    %eax,0x1c(%rdx)
    b089:	0f 10 46 08          	movups 0x8(%rsi),%xmm0
    b08d:	0f 29 47 20          	movaps %xmm0,0x20(%rdi)

The class allocation is a fairly normal.

This resulted in a SEGV - code below with sanitizer=memory, however functionally identical :

Thread 1 received signal SIGSEGV, Segmentation fault.
0x00005602d34313dd in Query_arena::set_query_arena (this=0x7ffc957f4360, set=0x72b0000ee030) at /source/sql/sql_class.cc:4281
4281	  free_list= set->free_list;
(rr) disassemble 
Dump of assembler code for function _ZN3THD25set_n_backup_active_arenaEP11Query_arenaS1_:
   0x00005602d34313b0 <+0>:	push   %rbp
   0x00005602d34313b1 <+1>:	mov    %rsp,%rbp
   0x00005602d34313b4 <+4>:	push   %r15
   0x00005602d34313b6 <+6>:	push   %r14
   0x00005602d34313b8 <+8>:	push   %r13
   0x00005602d34313ba <+10>:	push   %r12
   0x00005602d34313bc <+12>:	push   %rbx
   0x00005602d34313bd <+13>:	sub    $0x38,%rsp
   0x00005602d34313c1 <+17>:	movabs $0x500000000000,%r14
   0x00005602d34313cb <+27>:	movabs $0x100000000000,%r8
   0x00005602d34313d5 <+37>:	lea    0x20(%rdi),%r9
   0x00005602d34313d9 <+41>:	lea    0x8(%rdx),%r13
=> 0x00005602d34313dd <+45>:	movaps 0x20(%rdi),%xmm2

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions