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
61 lines
1.7 KiB
LLVM
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
|
|
}
|