diff options
author | Richard Biener <rguenther@suse.de> | 2022-07-07 10:46:01 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2022-07-07 12:03:45 +0200 |
commit | 8bc243943765f969c0d4625721a9944e9516d013 (patch) | |
tree | 8b5330844f9861efada959656ceb6e369b397c59 /gcc | |
parent | c1b1c4e58bda152ae932b45396ab67b07dd8c3fe (diff) | |
download | gcc-8bc243943765f969c0d4625721a9944e9516d013.zip gcc-8bc243943765f969c0d4625721a9944e9516d013.tar.gz gcc-8bc243943765f969c0d4625721a9944e9516d013.tar.bz2 |
target/106219 - proprly mark builtins pure via ix86_add_new_builtins
The target optimize pragma path to initialize extra target specific
builtins missed handling of the pure_p flag which in turn causes
extra clobber side-effects of gather builtins leading to unexpected
issues downhill.
PR target/106219
* config/i386/i386-builtins.cc (ix86_add_new_builtins): Properly
set DECL_PURE_P.
* g++.dg/pr106219.C: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/i386/i386-builtins.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr106219.C | 31 |
2 files changed, 33 insertions, 0 deletions
diff --git a/gcc/config/i386/i386-builtins.cc b/gcc/config/i386/i386-builtins.cc index 96743e6..fe7243c 100644 --- a/gcc/config/i386/i386-builtins.cc +++ b/gcc/config/i386/i386-builtins.cc @@ -385,6 +385,8 @@ ix86_add_new_builtins (HOST_WIDE_INT isa, HOST_WIDE_INT isa2) ix86_builtins[i] = decl; if (ix86_builtins_isa[i].const_p) TREE_READONLY (decl) = 1; + if (ix86_builtins_isa[i].pure_p) + DECL_PURE_P (decl) = 1; } } diff --git a/gcc/testsuite/g++.dg/pr106219.C b/gcc/testsuite/g++.dg/pr106219.C new file mode 100644 index 0000000..3cad150 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr106219.C @@ -0,0 +1,31 @@ +// { dg-do compile } +// { dg-options "-O3" } +// { dg-additional-options "-march=bdver2" { target x86_64-*-* } } + +int max(int __b) { + if (0 < __b) + return __b; + return 0; +} +struct Plane { + Plane(int, int); + int *Row(); +}; +#ifdef __x86_64__ +#pragma GCC target "sse2,ssse3,avx,avx2" +#endif +float *ConvolveXSampleAndTranspose_rowp; +int ConvolveXSampleAndTranspose_res, ConvolveXSampleAndTranspose_r; +void ConvolveXSampleAndTranspose() { + Plane out(0, ConvolveXSampleAndTranspose_res); + for (int y;;) { + float sum; + for (int i = ConvolveXSampleAndTranspose_r; i; ++i) + sum += i; + for (; ConvolveXSampleAndTranspose_r; ++ConvolveXSampleAndTranspose_r) + sum += + ConvolveXSampleAndTranspose_rowp[max(ConvolveXSampleAndTranspose_r)] * + ConvolveXSampleAndTranspose_r; + out.Row()[y] = sum; + } +} |