Files
clang-p2996/llvm/test/CodeGen/RISCV/fold-binop-into-select.ll
Mikhail Gudim c158ddd99e Reapply [RISCV] Fold binary op into select if profitable.
This fixes some bugs in the original commit:
  (1) Operands are passed in correct order when creating new constant
  and the binary operator. New tests were added to cover these cases.
  (2) Check was added to see if it is safe to commute the select and the binary operator.

Reviewed By: Craig Topper

Differential Revision: https://reviews.llvm.org/D152147
2023-07-14 15:30:54 -04:00

61 lines
1.7 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
; RUN: llc -mtriple=riscv64 < %s | FileCheck %s
define i64 @fold_binop_into_select_0(i1 %c, i64 %x) {
; CHECK-LABEL: fold_binop_into_select_0:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: addi a1, a1, -2
; CHECK-NEXT: slli a0, a0, 63
; CHECK-NEXT: srai a0, a0, 63
; CHECK-NEXT: and a0, a0, a1
; CHECK-NEXT: ret
entry:
%select_ = select i1 %c, i64 %x, i64 2
%res = sub i64 %select_, 2
ret i64 %res
}
define i64 @fold_binop_into_select_1(i1 %c, i64 %x) {
; CHECK-LABEL: fold_binop_into_select_1:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: andi a0, a0, 1
; CHECK-NEXT: addi a1, a1, -2
; CHECK-NEXT: addi a0, a0, -1
; CHECK-NEXT: and a0, a0, a1
; CHECK-NEXT: ret
entry:
%select_ = select i1 %c, i64 2, i64 %x
%res = sub i64 %select_, 2
ret i64 %res
}
define i64 @fold_binop_into_select_2(i1 %c, i64 %x) {
; CHECK-LABEL: fold_binop_into_select_2:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: li a2, 2
; CHECK-NEXT: sub a2, a2, a1
; CHECK-NEXT: slli a0, a0, 63
; CHECK-NEXT: srai a0, a0, 63
; CHECK-NEXT: and a0, a0, a2
; CHECK-NEXT: ret
entry:
%select_ = select i1 %c, i64 %x, i64 2
%res = sub i64 2, %select_
ret i64 %res
}
define i64 @fold_binop_into_select_3(i1 %c, i64 %x) {
; CHECK-LABEL: fold_binop_into_select_3:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: andi a0, a0, 1
; CHECK-NEXT: li a2, 2
; CHECK-NEXT: sub a2, a2, a1
; CHECK-NEXT: addi a0, a0, -1
; CHECK-NEXT: and a0, a0, a2
; CHECK-NEXT: ret
entry:
%select_ = select i1 %c, i64 2, i64 %x
%res = sub i64 2, %select_
ret i64 %res
}