From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 5709E3987943; Fri, 30 Oct 2020 17:57:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5709E3987943 From: "jakub at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/97642] Incorrect replacement of vmovdqu32 with vpblendd can cause fault Date: Fri, 30 Oct 2020 17:57:52 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c++ X-Bugzilla-Version: 10.2.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: jakub at gcc dot gnu.org X-Bugzilla-Status: NEW X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: gcc-bugs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-bugs mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Oct 2020 17:57:52 -0000 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D97642 --- Comment #2 from Jakub Jelinek --- The testcase is: #include #include #include #include #define N 5 // Faults with GCC because usage of vpblendd __m256i __attribute__((noinline)) mask_load(uint32_t * arr) { __m256i tmp; return _mm256_mask_loadu_epi32(tmp, (1 << N) - 1, arr); } // Faults __m256i __attribute__((noinline)) blend_load_asm(uint32_t * arr) { __m256i tmp =3D _mm256_set1_epi64x(0); asm volatile("vpblendd %[m], (%[arr]), %[tmp], %[tmp]\n\t" : [ tmp ] "+x"(tmp) : [ arr ] "r"(arr), [ m ] "i"(((1 << N) - 1)) :); return tmp; } // Does not fault __m256i __attribute__((noinline)) mask_load_asm(uint32_t * arr) { __m256i tmp; asm volatile( "movb %[m], %%al\n\t" "kmovb %%eax, %%k1\n\t" "vmovdqu32 (%[arr]), %[tmp] %{%%k1} %{z%}\n\t" : [ tmp ] "+x"(tmp) : [ arr ] "r"(arr), [ m ] "i"(((1 << N) - 1)) : "eax", "k1"); return tmp; } void __attribute__((noinline)) mask_store(uint32_t * arr, __m256i v) { return _mm256_mask_storeu_epi32(arr, (1 << N) - 1, v); } #define NPAGES (2) #define END_OF_PAGE (1024 - N) #ifndef LOAD_METHOD #define LOAD_METHOD mask_load // mask_load_asm does not fault #endif int main() { uint32_t * addr =3D (uint32_t *)mmap(NULL, NPAGES * 4096, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); for (uint32_t i =3D 0; i < NPAGES; i +=3D 2) { uint32_t page_offset =3D 1024 * i + END_OF_PAGE; uint32_t next_page_offset =3D 1024 * (i + 1); assert(!mprotect(addr + next_page_offset, 4096, PROT_NONE)); mask_store(addr + page_offset, LOAD_METHOD(addr + page_offset)); } }=