|  | ; 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 @callee1(i32 noundef) | 
|  | declare i32 @callee2(i32 noundef, i32 noundef) | 
|  | declare i32 @callee(i32 noundef, i32 noundef, i32 noundef, i32 noundef) | 
|  |  | 
|  | define void @t1(i32 noundef %a, i32 noundef %b, i32 noundef %c, i32 noundef %d) #0 { | 
|  | ; CHECK-LABEL: t1: | 
|  | ; CHECK:       # %bb.0: # %entry | 
|  | ; CHECK-NEXT:    sh2add a2, a0, a2 | 
|  | ; CHECK-NEXT:    sh2add a1, a0, a1 | 
|  | ; CHECK-NEXT:    addi a1, a1, 45 | 
|  | ; CHECK-NEXT:    addi a2, a2, 45 | 
|  | ; CHECK-NEXT:    sh2add a3, a0, a3 | 
|  | ; CHECK-NEXT:    mv a0, a1 | 
|  | ; CHECK-NEXT:    tail callee | 
|  | entry: | 
|  | %shl = shl i32 %a, 2 | 
|  | %add = add nsw i32 %shl, 45 | 
|  | %add1 = add nsw i32 %add, %b | 
|  | %add3 = add nsw i32 %add, %c | 
|  | %add5 = add nsw i32 %shl, %d | 
|  | %call = tail call i32 @callee(i32 noundef %add1, i32 noundef %add1, i32 noundef %add3, i32 noundef %add5) | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @t2(i32 noundef %a, i32 noundef %b, i32 noundef %c) #0 { | 
|  | ; CHECK-LABEL: t2: | 
|  | ; CHECK:       # %bb.0: # %entry | 
|  | ; CHECK-NEXT:    slli a0, a0, 2 | 
|  | ; CHECK-NEXT:    addi a5, a0, 42 | 
|  | ; CHECK-NEXT:    add a4, a5, a1 | 
|  | ; CHECK-NEXT:    add a3, a5, a2 | 
|  | ; CHECK-NEXT:    mv a1, a5 | 
|  | ; CHECK-NEXT:    mv a2, a4 | 
|  | ; CHECK-NEXT:    tail callee | 
|  | entry: | 
|  | %shl = shl i32 %a, 2 | 
|  | %add = add nsw i32 %shl, 42 | 
|  | %add4 = add nsw i32 %add, %b | 
|  | %add7 = add nsw i32 %add, %c | 
|  | %call = tail call i32 @callee(i32 noundef %shl, i32 noundef %add, i32 noundef %add4, i32 noundef %add7) | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @t3(i32 noundef %a, i32 noundef %b, i32 noundef %c, i32 noundef %d, i32 noundef %e) #0 { | 
|  | ; CHECK-LABEL: t3: | 
|  | ; CHECK:       # %bb.0: # %entry | 
|  | ; CHECK-NEXT:    slli a0, a0, 2 | 
|  | ; CHECK-NEXT:    addi a5, a0, 42 | 
|  | ; CHECK-NEXT:    add a0, a5, a1 | 
|  | ; CHECK-NEXT:    add a1, a5, a2 | 
|  | ; CHECK-NEXT:    add a2, a5, a3 | 
|  | ; CHECK-NEXT:    add a3, a5, a4 | 
|  | ; CHECK-NEXT:    tail callee | 
|  | 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 | 
|  | %add4 = add nsw i32 %add, %e | 
|  | %call = tail call i32 @callee(i32 noundef %add1, i32 noundef %add2, i32 noundef %add3, i32 noundef %add4) | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @t4(i32 noundef %a, i32 noundef %b) #0 { | 
|  | ; CHECK-LABEL: t4: | 
|  | ; CHECK:       # %bb.0: # %entry | 
|  | ; CHECK-NEXT:    sh2add a0, a0, a1 | 
|  | ; CHECK-NEXT:    addi a0, a0, 42 | 
|  | ; CHECK-NEXT:    tail callee1 | 
|  | entry: | 
|  | %shl = shl i32 %a, 2 | 
|  | %add = add nsw i32 %shl, 42 | 
|  | %add1 = add nsw i32 %add, %b | 
|  | %call = tail call i32 @callee1(i32 noundef %add1) | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @t5(i32 noundef %a, i32 noundef %b, i32 noundef %c) #0 { | 
|  | ; CHECK-LABEL: t5: | 
|  | ; 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 noundef %add1, i32 noundef %add2) | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @t6(i32 noundef %a, i32 noundef %b) #0 { | 
|  | ; CHECK-LABEL: t6: | 
|  | ; CHECK:       # %bb.0: # %entry | 
|  | ; CHECK-NEXT:    slli a2, a0, 2 | 
|  | ; CHECK-NEXT:    sh2add a0, a0, a1 | 
|  | ; CHECK-NEXT:    addi a0, a0, 42 | 
|  | ; CHECK-NEXT:    mv a1, a2 | 
|  | ; CHECK-NEXT:    mv a3, a2 | 
|  | ; CHECK-NEXT:    tail callee | 
|  | entry: | 
|  | %shl = shl i32 %a, 2 | 
|  | %add = add nsw i32 %shl, 42 | 
|  | %add1 = add nsw i32 %add, %b | 
|  | %call = tail call i32 @callee(i32 noundef %add1, i32 noundef %shl, i32 noundef %shl, i32 noundef %shl) | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @t7(i32 noundef %a, i32 noundef %b) #0 { | 
|  | ; CHECK-LABEL: t7: | 
|  | ; CHECK:       # %bb.0: # %entry | 
|  | ; CHECK-NEXT:    slli a0, a0, 2 | 
|  | ; CHECK-NEXT:    addi a2, a0, 42 | 
|  | ; CHECK-NEXT:    add a0, a2, a1 | 
|  | ; CHECK-NEXT:    mv a1, a2 | 
|  | ; CHECK-NEXT:    mv a3, a2 | 
|  | ; CHECK-NEXT:    tail callee | 
|  | entry: | 
|  | %shl = shl i32 %a, 2 | 
|  | %add = add nsw i32 %shl, 42 | 
|  | %add1 = add nsw i32 %add, %b | 
|  | %call = tail call i32 @callee(i32 noundef %add1, i32 noundef %add, i32 noundef %add, i32 noundef %add) | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @t8(i32 noundef %a, i32 noundef %b, i32 noundef %c, i32 noundef %d) #0 { | 
|  | ; CHECK-LABEL: t8: | 
|  | ; CHECK:       # %bb.0: # %entry | 
|  | ; CHECK-NEXT:    sh3add a2, a0, a2 | 
|  | ; CHECK-NEXT:    sh3add a1, a0, a1 | 
|  | ; CHECK-NEXT:    lui a4, 1 | 
|  | ; CHECK-NEXT:    addi a4, a4, 1307 | 
|  | ; CHECK-NEXT:    add a1, a1, a4 | 
|  | ; CHECK-NEXT:    add a2, a2, a4 | 
|  | ; CHECK-NEXT:    sh3add a3, a0, a3 | 
|  | ; CHECK-NEXT:    mv a0, a1 | 
|  | ; CHECK-NEXT:    tail callee | 
|  | entry: | 
|  | %shl = shl i32 %a, 3 | 
|  | %add = add nsw i32 %shl, 5403 | 
|  | %add1 = add nsw i32 %add, %b | 
|  | %add3 = add nsw i32 %add, %c | 
|  | %add5 = add nsw i32 %shl, %d | 
|  | %call = tail call i32 @callee(i32 noundef %add1, i32 noundef %add1, i32 noundef %add3, i32 noundef %add5) | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @t9(i32 noundef %a, i32 noundef %b, i32 noundef %c, i32 noundef %d) #0 { | 
|  | ; CHECK-LABEL: t9: | 
|  | ; CHECK:       # %bb.0: # %entry | 
|  | ; CHECK-NEXT:    sh2add a2, a0, a2 | 
|  | ; CHECK-NEXT:    sh2add a1, a0, a1 | 
|  | ; CHECK-NEXT:    addi a1, a1, -42 | 
|  | ; CHECK-NEXT:    addi a2, a2, -42 | 
|  | ; CHECK-NEXT:    sh2add a3, a0, a3 | 
|  | ; CHECK-NEXT:    mv a0, a1 | 
|  | ; CHECK-NEXT:    tail callee | 
|  | entry: | 
|  | %shl = shl i32 %a, 2 | 
|  | %add = add nsw i32 %shl, -42 | 
|  | %add1 = add nsw i32 %add, %b | 
|  | %add3 = add nsw i32 %add, %c | 
|  | %add5 = add nsw i32 %shl, %d | 
|  | %call = tail call i32 @callee(i32 noundef %add1, i32 noundef %add1, i32 noundef %add3, i32 noundef %add5) | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @t10(i32 noundef %a, i32 noundef %b, i32 noundef %c, i32 noundef %d) #0 { | 
|  | ; CHECK-LABEL: t10: | 
|  | ; CHECK:       # %bb.0: # %entry | 
|  | ; CHECK-NEXT:    tail callee | 
|  | entry: | 
|  | %shl = shl i32 %a, -2 | 
|  | %add = add nsw i32 %shl, 42 | 
|  | %add1 = add nsw i32 %add, %b | 
|  | %add3 = add nsw i32 %add, %c | 
|  | %add5 = add nsw i32 %shl, %d | 
|  | %call = tail call i32 @callee(i32 noundef %add1, i32 noundef %add1, i32 noundef %add3, i32 noundef %add5) | 
|  | ret void | 
|  | } | 
|  |  | 
|  | attributes #0 = { nounwind optsize } |