On 19/9/25 14:49, WANG Rui wrote:
It looks like a typo.

Likely from the TCG_TARGET_HAS_andc_vec case.

When the false value (C) is the constant -1, the
correct fold should be: R = B | ~A

Reproducer (LoongArch64 assembly):

      .text
      .globl  _start
  _start:
      vldi    $vr1, 3073
      vldi    $vr2, 1023
      vbitsel.v       $vr0, $vr2, $vr1, $vr2
      vpickve2gr.d    $a1, $vr0, 1
      xori    $a0, $a1, 1
      li.w    $a7, 93
      syscall 0

Fixes: e58b977238e3 ("tcg/optimize: Optimize bitsel_vec")
Link: https://github.com/llvm/llvm-project/issues/159610
Signed-off-by: WANG Rui <[email protected]>
---
  tcg/optimize.c | 3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tcg/optimize.c b/tcg/optimize.c
index 3638ab9fea..f69702b26e 100644
--- a/tcg/optimize.c
+++ b/tcg/optimize.c
@@ -1568,9 +1568,10 @@ static bool fold_bitsel_vec(OptContext *ctx, TCGOp *op)
              return fold_and(ctx, op);
          }
          if (fv == -1 && TCG_TARGET_HAS_orc_vec) {
+            TCGArg ta = op->args[2];
              op->opc = INDEX_op_orc_vec;
              op->args[2] = op->args[1];
-            op->args[1] = op->args[3];
+            op->args[1] = ta;
              return fold_orc(ctx, op);
          }
      }
Looks correct, but I don't understand the swap. Can't we justkeep the same argument order for an ORC opcode? I'd have done:

-- >8 --
@@ -1569,8 +1569,6 @@ static bool fold_bitsel_vec(OptContext *ctx, TCGOp *op)
         }
         if (fv == -1 && TCG_TARGET_HAS_orc_vec) {
             op->opc = INDEX_op_orc_vec;
-            op->args[2] = op->args[1];
-            op->args[1] = op->args[3];
             return fold_orc(ctx, op);
         }
     }
---

Reply via email to