[Bug c/105134] New: tree-vectorize produces error code
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105134 Bug ID: 105134 Summary: tree-vectorize produces error code Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: piliu at redhat dot com Target Milestone: --- On x86_64, kexec-tools built with gcc-12 can not boot the 2nd kernel successfully. After debugging, it turns out to be related with "tree-vectorize" option. As kexec-tools commit 1b03cf7 purgatory: do not enable vectorization automatically for purgatory compiling. I have no idea about what happens, but it seems to be related with the generation of the code piece void sha256_starts( sha256_context *ctx ) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x6A09E667; ctx->state[1] = 0xBB67AE85; ctx->state[2] = 0x3C6EF372; ctx->state[3] = 0xA54FF53A; ctx->state[4] = 0x510E527F; ctx->state[5] = 0x9B05688C; ctx->state[6] = 0x1F83D9AB; ctx->state[7] = 0x5BE0CD19; }
[Bug c/105134] tree-vectorize produces error code
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105134 --- Comment #1 from piliu at redhat dot com --- More description about the background. There is a built file kexec-tools/purgatory/purgatory.ro, which is a tiny bootload, compare and verify the sha256, if ok, then jump to the 2nd kernel. The original sha256 value comes from update_purgatory() { .. elf_rel_set_symbol(&info->rhdr, "sha256_regions", ®ion, sizeof(region)); elf_rel_set_symbol(&info->rhdr, "sha256_digest", &digest, sizeof(digest)); } They are based on the loaded linux kernel image. Now, "kexec -e" and purgatory.ro runs, and in void purgatory(void) { printf("I'm in purgatory\n"); setup_arch(); if (!skip_checks && verify_sha256_digest()) { for(;;) { /* loop forever */ --> stuck here } } post_verification_setup_arch(); }
[Bug c/105134] tree-vectorize produces error code
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105134 --- Comment #2 from piliu at redhat dot com --- More specific, the following directive beats out the bug. diff --git a/util_lib/sha256.c b/util_lib/sha256.c index 2e61a31..3b3e533 100644 --- a/util_lib/sha256.c +++ b/util_lib/sha256.c @@ -38,6 +38,7 @@ (b)[(i) + 3] = (uint8_t) ( (n) ); \ } + __attribute__((optimize("no-tree-vectorize"))) void sha256_starts( sha256_context *ctx )
[Bug c/105134] tree-vectorize produces error code
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105134 --- Comment #4 from piliu at redhat dot com --- (In reply to Richard Biener from comment #3) > Can you provide preprocessed source of the TU containing sha256_starts and > the full compiler command-line used to compile it? For a single file. gcc -fno-zero-initialized-in-bss -mcmodel=large -Os -fno-builtin -ffreestanding -fno-zero-initialized-in-bss -fno-PIC -fno-PIE -fno-stack-protector -O2 -mcmodel=large -I./purgatory/include -I./purgatory/arch/x86_64/include -I./util_lib/include -I./include -Iinclude -I/usr/lib/gcc/x86_64-redhat-linux/12/include -c -o purgatory/sha256.o util_lib/sha256.c For the complete compile log, please see the attachment.
[Bug c/105134] tree-vectorize produces error code
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105134 --- Comment #5 from piliu at redhat dot com --- Created attachment 52756 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=52756&action=edit -ftree-vectorize can not produce correct code for kexec-tools
[Bug c/105134] tree-vectorize produces error code
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105134 --- Comment #6 from piliu at redhat dot com --- Created attachment 52757 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=52757&action=edit precompiled code of sha256 compile command: gcc -E -fno-zero-initialized-in-bss -mcmodel=large -Os -fno-builtin -ffreestanding -fno-zero-initialized-in-bss -fno-PIC -fno-PIE -fno-stack-protector -O2 -mcmodel=large -I./purgatory/include -I./purgatory/arch/x86_64/include -I./util_lib/include -I./include -Iinclude -I/usr/lib/gcc/x86_64-redhat-linux/12/include -c -o purgatory/sha256.o util_lib/sha256.c
[Bug c/105134] tree-vectorize produces error code
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105134 --- Comment #10 from piliu at redhat dot com --- (In reply to Andrew Pinski from comment #7) > I am trying to understand this. Is it ok to use the SSE registers inside > purgatory or not? > SSE can speed up the program, and if possible it is suggested to turn on. Any guideline about when it can not be used? > Now that the vectorizer is used turned on at -O2 and above, without > -mno-sse, on x86_64 target, the vector instructions are generated. and since > this is inside a tiny bootloader, I am suspecting you can't use SSE > instructions here. > What is broken by SSE? That can be more persuaded. Thanks, Pingfan