public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "macro at orcam dot me.uk" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug target/112092] RISC-V: Wrong RVV code produced for vsetvl-11.c and vsetvlmax-8.c Date: Thu, 26 Oct 2023 23:31:00 +0000 [thread overview] Message-ID: <bug-112092-4-sfrEMPPe9M@http.gcc.gnu.org/bugzilla/> (raw) In-Reply-To: <bug-112092-4@http.gcc.gnu.org/bugzilla/> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112092 --- Comment #7 from Maciej W. Rozycki <macro at orcam dot me.uk> --- Thank you for all your explanations. I think I'm still missing something here, so I'll write it differently (and let's ignore the tail-agnostic vs tail-undisturbed choice for the purpose of this consideration). Let me paste the whole assembly code produced here (sans decorations): beq a5,zero,.L2 vsetvli zero,a6,e32,m1,tu,ma .L3: beq a4,zero,.L7 li a5,0 .L5: vle32.v v1,0(a0) vle32.v v1,0(a1) vle32.v v1,0(a2) vse32.v v1,0(a3) addi a5,a5,1 bne a4,a5,.L5 .L7: ret .L2: vsetvli zero,a6,e32,m1,tu,ma j .L3 This seems to me to correspond to this source code: if (cond) __riscv_vsetvl_e32m1(avl); else __riscv_vsetvl_e16mf2(avl); for (size_t i = 0; i < n; i += 1) { vint32m1_t a = __riscv_vle32_v_i32m1(in1, avl); vint32m1_t b = __riscv_vle32_v_i32m1_tu(a, in2, avl); vint32m1_t c = __riscv_vle32_v_i32m1_tu(b, in3, avl); __riscv_vse32_v_i32m1(out, c, avl); } And in that case I'd expect the conditional to be optimised away, as its result is ignored (along with the intrinsics) and does not affect actual code executed except for the different execution path, i.e.: beq a4,zero,.L7 vsetvli zero,a6,e32,m1,tu,ma li a5,0 .L5: vle32.v v1,0(a0) vle32.v v1,0(a1) vle32.v v1,0(a2) vse32.v v1,0(a3) addi a5,a5,1 bne a4,a5,.L5 .L7: ret However actual source code is as follows: size_t vl; if (cond) vl = __riscv_vsetvl_e32m1(avl); else vl = __riscv_vsetvl_e16mf2(avl); for (size_t i = 0; i < n; i += 1) { vint32m1_t a = __riscv_vle32_v_i32m1(in1, vl); vint32m1_t b = __riscv_vle32_v_i32m1_tu(a, in2, vl); vint32m1_t c = __riscv_vle32_v_i32m1_tu(b, in3, vl); __riscv_vse32_v_i32m1(out, c, vl); } Based on what you write I'd expect code like this instead: beq a5,zero,.L2 vsetvli a6,a6,e16,mf2,ta,ma .L3: beq a4,zero,.L7 vsetvli zero,a6,e32,m1,tu,ma li a5,0 .L5: vle32.v v1,0(a0) vle32.v v1,0(a1) vle32.v v1,0(a2) vse32.v v1,0(a3) addi a5,a5,1 bne a4,a5,.L5 .L7: ret .L2: vsetvli a6,a6,e32,m1,ta,ma j .L3 which is roughly what you say LLVM produces. Why is the `vl' value determined by hardware from `avl' by an explicit request (!) of the programmer who inserted the vsetvl intrinsics ignored? Is the compiler able to prove the use of `avl' in place of `vl' does not affect the operation of the VLE32.V and VSE32.V instructions in any way? What is the purpose of these intrinsics if they can be freely ignored? Please forgive me if my questions seem to you obvious to answer or irrelevant, I'm still rather new to this RVV stuff.
next prev parent reply other threads:[~2023-10-26 23:31 UTC|newest] Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-10-26 1:00 [Bug target/112092] New: " macro at orcam dot me.uk 2023-10-26 1:46 ` [Bug target/112092] " juzhe.zhong at rivai dot ai 2023-10-26 1:57 ` juzhe.zhong at rivai dot ai 2023-10-26 4:01 ` macro at orcam dot me.uk 2023-10-26 6:38 ` kito at gcc dot gnu.org 2023-10-26 6:51 ` juzhe.zhong at rivai dot ai 2023-10-26 7:08 ` juzhe.zhong at rivai dot ai 2023-10-26 23:31 ` macro at orcam dot me.uk [this message] 2023-10-27 0:57 ` juzhe.zhong at rivai dot ai 2023-10-27 1:03 ` juzhe.zhong at rivai dot ai 2023-10-31 13:58 ` [Bug target/112092] RISC-V: Suboptimal " macro at orcam dot me.uk 2023-11-08 6:38 ` cvs-commit at gcc dot gnu.org 2023-11-08 6:39 ` juzhe.zhong at rivai dot ai
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=bug-112092-4-sfrEMPPe9M@http.gcc.gnu.org/bugzilla/ \ --to=gcc-bugzilla@gcc.gnu.org \ --cc=gcc-bugs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).