| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| ; RUN: llc -mtriple=riscv32-unknown-elf -mattr=+zba %s -o - | FileCheck %s |
| |
| declare i32 @callee2(i32, i32) |
| declare i32 @callee3(i32, i32, i32) |
| |
| ; Positive test |
| ; The users of addi aren't more than 2 |
| define void @t1(i32 %a, i32 %b, i32 %c) { |
| ; CHECK-LABEL: t1: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: sh2add a2, a0, a2 |
| ; CHECK-NEXT: sh2add a0, a0, a1 |
| ; CHECK-NEXT: addi a0, a0, 42 |
| ; CHECK-NEXT: addi a1, a2, 42 |
| ; CHECK-NEXT: tail callee2 |
| entry: |
| %shl = shl i32 %a, 2 |
| %add = add nsw i32 %shl, 42 |
| %add1 = add nsw i32 %add, %b |
| %add2 = add nsw i32 %add, %c |
| %call = tail call i32 @callee2(i32 %add1, i32 %add2) |
| ret void |
| } |
| |
| ; Negative test |
| ; The users of addi are more than 2. |
| define void @t2(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) { |
| ; CHECK-LABEL: t2: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: slli a0, a0, 2 |
| ; CHECK-NEXT: addi a4, a0, 42 |
| ; CHECK-NEXT: add a0, a4, a1 |
| ; CHECK-NEXT: add a1, a4, a2 |
| ; CHECK-NEXT: add a2, a4, a3 |
| ; CHECK-NEXT: tail callee3 |
| entry: |
| %shl = shl i32 %a, 2 |
| %add = add nsw i32 %shl, 42 |
| %add1 = add nsw i32 %add, %b |
| %add2 = add nsw i32 %add, %c |
| %add3 = add nsw i32 %add, %d |
| %call = tail call i32 @callee3(i32 %add1, i32 %add2, i32 %add3) |
| ret void |
| } |
| |
| ; Negative test |
| ; shl doesn't have one use. |
| define void @t3(i32 %a, i32 %b, i32 %c, i32 %d) { |
| ; CHECK-LABEL: t3: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: slli a4, a0, 2 |
| ; CHECK-NEXT: addi a5, a4, 45 |
| ; CHECK-NEXT: add a4, a5, a1 |
| ; CHECK-NEXT: add a1, a5, a2 |
| ; CHECK-NEXT: sh2add a2, a0, a3 |
| ; CHECK-NEXT: mv a0, a4 |
| ; CHECK-NEXT: tail callee3 |
| entry: |
| %shl = shl i32 %a, 2 |
| %add = add nsw i32 %shl, 45 |
| %add1 = add nsw i32 %add, %b |
| %add2 = add nsw i32 %add, %c |
| %add3 = add nsw i32 %shl, %d |
| %call = tail call i32 @callee3(i32 %add1, i32 %add2, i32 %add3) |
| ret void |
| } |
| |
| ; Negative test |
| ; shift amount isn't 1, 2, or 3. |
| define void @t4(i32 %a, i32 %b, i32 %c, i32 %d) { |
| ; CHECK-LABEL: t4: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: slli a0, a0, 4 |
| ; CHECK-NEXT: addi a3, a0, 45 |
| ; CHECK-NEXT: add a0, a3, a1 |
| ; CHECK-NEXT: add a1, a3, a2 |
| ; CHECK-NEXT: tail callee2 |
| entry: |
| %shl = shl i32 %a, 4 |
| %add = add nsw i32 %shl, 45 |
| %add1 = add nsw i32 %add, %b |
| %add2 = add nsw i32 %add, %c |
| %call = tail call i32 @callee2(i32 %add1, i32 %add2) |
| ret void |
| } |