diff options
Diffstat (limited to 'gcc/testsuite/gcc.target/i386/pr121572-1a.c')
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr121572-1a.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/i386/pr121572-1a.c b/gcc/testsuite/gcc.target/i386/pr121572-1a.c new file mode 100644 index 0000000..270d8ff --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr121572-1a.c @@ -0,0 +1,41 @@ +/* { dg-do compile { target *-*-linux* } } */ +/* { dg-options "-O0 -fpic -fplt -mtls-dialect=gnu" } */ +/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc'). */ +/* { dg-final { check-function-bodies "**" "" "" { target { ! ia32 } } {^\t?\.} } } */ + +/* +**bug: +**.LFB[0-9]+: +**... +** leaq tv_cache@tlsld\(%rip\), %rdi +** call __tls_get_addr@PLT +** movl \$-1, %edi +** mov[l|q] %[e|r]ax, %[e|r]bx +** call val@PLT +**... +*/ + +extern __thread int tv_cache __attribute__ ((visibility ("hidden"))); +extern void use_cache (int); +extern int val (int v); + +__attribute__ ((optimize (2))) +void +bug (void) +{ + int compared = val (-1); + + if (compared == 0 || (compared > 0 && val (2) == 0)) + { + __builtin_trap (); + } + + if (compared < 0) + { + use_cache (tv_cache); + return; + } + + use_cache (tv_cache); + __builtin_trap (); +} |