| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc < %s -mtriple=riscv32 | FileCheck %s --check-prefixes=RV32 |
| ; RUN: llc < %s -mtriple=riscv64 | FileCheck %s --check-prefixes=RV64 |
| |
| define signext i32 @test1(i32 signext %x) { |
| ; RV32-LABEL: test1: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a0, a0, 1 |
| ; RV32-NEXT: addi a0, a0, 1 |
| ; RV32-NEXT: ret |
| ; |
| ; RV64-LABEL: test1: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a0, a0, 1 |
| ; RV64-NEXT: addiw a0, a0, 1 |
| ; RV64-NEXT: ret |
| %a = shl i32 %x, 1 |
| %b = or i32 %a, 1 |
| ret i32 %b |
| } |
| |
| define i64 @test2(i64 %x) { |
| ; RV32-LABEL: test2: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: andi a0, a0, -4 |
| ; RV32-NEXT: addi a0, a0, 2 |
| ; RV32-NEXT: ret |
| ; |
| ; RV64-LABEL: test2: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: andi a0, a0, -4 |
| ; RV64-NEXT: addi a0, a0, 2 |
| ; RV64-NEXT: ret |
| %a = and i64 %x, -4 |
| %b = or i64 %a, 2 |
| ret i64 %b |
| } |
| |
| define signext i32 @test3(i32 signext %x) { |
| ; RV32-LABEL: test3: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a0, a0, 3 |
| ; RV32-NEXT: addi a0, a0, 6 |
| ; RV32-NEXT: ret |
| ; |
| ; RV64-LABEL: test3: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a0, a0, 3 |
| ; RV64-NEXT: addiw a0, a0, 6 |
| ; RV64-NEXT: ret |
| %a = shl i32 %x, 3 |
| %b = add i32 %a, 6 |
| ret i32 %b |
| } |
| |
| define i64 @test4(i64 %x) { |
| ; RV32-LABEL: test4: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: srli a2, a0, 28 |
| ; RV32-NEXT: slli a1, a1, 4 |
| ; RV32-NEXT: slli a0, a0, 4 |
| ; RV32-NEXT: or a1, a1, a2 |
| ; RV32-NEXT: addi a0, a0, 13 |
| ; RV32-NEXT: ret |
| ; |
| ; RV64-LABEL: test4: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a0, a0, 4 |
| ; RV64-NEXT: addi a0, a0, 13 |
| ; RV64-NEXT: ret |
| %a = shl i64 %x, 4 |
| %b = add i64 %a, 13 |
| ret i64 %b |
| } |
| |
| define signext i32 @test5(i32 signext %x) { |
| ; RV32-LABEL: test5: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: srli a0, a0, 24 |
| ; RV32-NEXT: addi a0, a0, 256 |
| ; RV32-NEXT: ret |
| ; |
| ; RV64-LABEL: test5: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: srliw a0, a0, 24 |
| ; RV64-NEXT: addiw a0, a0, 256 |
| ; RV64-NEXT: ret |
| %a = lshr i32 %x, 24 |
| %b = xor i32 %a, 256 |
| ret i32 %b |
| } |
| |
| define i64 @test6(i64 %x) { |
| ; RV32-LABEL: test6: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: srli a1, a1, 22 |
| ; RV32-NEXT: addi a0, a1, 1024 |
| ; RV32-NEXT: li a1, 0 |
| ; RV32-NEXT: ret |
| ; |
| ; RV64-LABEL: test6: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: srli a0, a0, 54 |
| ; RV64-NEXT: addiw a0, a0, 1024 |
| ; RV64-NEXT: ret |
| %a = lshr i64 %x, 54 |
| %b = xor i64 %a, 1024 |
| ret i64 %b |
| } |
| |
| define signext i32 @test7(i32 signext %x) { |
| ; RV32-LABEL: test7: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: addi a0, a0, 1 |
| ; RV32-NEXT: ret |
| ; |
| ; RV64-LABEL: test7: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: ori a0, a0, 1 |
| ; RV64-NEXT: ret |
| %a = or disjoint i32 %x, 1 |
| ret i32 %a |
| } |
| |
| define void @pr128468(ptr %0, i32 signext %1, i32 signext %2) { |
| ; RV32-LABEL: pr128468: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a3, a1, 3 |
| ; RV32-NEXT: add a3, a0, a3 |
| ; RV32-NEXT: lw a2, 4(a3) |
| ; RV32-NEXT: bgez a2, .LBB7_6 |
| ; RV32-NEXT: # %bb.1: |
| ; RV32-NEXT: slli a2, a1, 1 |
| ; RV32-NEXT: addi a2, a2, 1 |
| ; RV32-NEXT: beq a2, a1, .LBB7_6 |
| ; RV32-NEXT: # %bb.2: # %.preheader |
| ; RV32-NEXT: addi a3, a3, 4 |
| ; RV32-NEXT: j .LBB7_4 |
| ; RV32-NEXT: .LBB7_3: # in Loop: Header=BB7_4 Depth=1 |
| ; RV32-NEXT: mv a2, a1 |
| ; RV32-NEXT: addi a3, a3, 4 |
| ; RV32-NEXT: beq a1, a1, .LBB7_6 |
| ; RV32-NEXT: .LBB7_4: # =>This Inner Loop Header: Depth=1 |
| ; RV32-NEXT: slli a1, a1, 2 |
| ; RV32-NEXT: add a1, a0, a1 |
| ; RV32-NEXT: lw a4, 0(a1) |
| ; RV32-NEXT: mv a1, a2 |
| ; RV32-NEXT: sw a4, 0(a3) |
| ; RV32-NEXT: slli a3, a2, 3 |
| ; RV32-NEXT: add a3, a0, a3 |
| ; RV32-NEXT: lw a2, 4(a3) |
| ; RV32-NEXT: bgez a2, .LBB7_3 |
| ; RV32-NEXT: # %bb.5: # in Loop: Header=BB7_4 Depth=1 |
| ; RV32-NEXT: slli a2, a1, 1 |
| ; RV32-NEXT: addi a2, a2, 1 |
| ; RV32-NEXT: addi a3, a3, 4 |
| ; RV32-NEXT: bne a2, a1, .LBB7_4 |
| ; RV32-NEXT: .LBB7_6: |
| ; RV32-NEXT: ret |
| ; |
| ; RV64-LABEL: pr128468: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slliw a2, a1, 1 |
| ; RV64-NEXT: slli a3, a2, 2 |
| ; RV64-NEXT: add a3, a0, a3 |
| ; RV64-NEXT: lw a4, 4(a3) |
| ; RV64-NEXT: bgez a4, .LBB7_6 |
| ; RV64-NEXT: # %bb.1: |
| ; RV64-NEXT: addiw a2, a2, 1 |
| ; RV64-NEXT: beq a2, a1, .LBB7_6 |
| ; RV64-NEXT: # %bb.2: # %.preheader |
| ; RV64-NEXT: addi a3, a3, 4 |
| ; RV64-NEXT: j .LBB7_4 |
| ; RV64-NEXT: .LBB7_3: # in Loop: Header=BB7_4 Depth=1 |
| ; RV64-NEXT: mv a2, a1 |
| ; RV64-NEXT: addi a3, a3, 4 |
| ; RV64-NEXT: beq a1, a1, .LBB7_6 |
| ; RV64-NEXT: .LBB7_4: # =>This Inner Loop Header: Depth=1 |
| ; RV64-NEXT: slli a1, a1, 2 |
| ; RV64-NEXT: add a1, a0, a1 |
| ; RV64-NEXT: lw a4, 0(a1) |
| ; RV64-NEXT: mv a1, a2 |
| ; RV64-NEXT: slliw a2, a2, 1 |
| ; RV64-NEXT: sw a4, 0(a3) |
| ; RV64-NEXT: slli a3, a2, 2 |
| ; RV64-NEXT: add a3, a0, a3 |
| ; RV64-NEXT: lw a4, 4(a3) |
| ; RV64-NEXT: bgez a4, .LBB7_3 |
| ; RV64-NEXT: # %bb.5: # in Loop: Header=BB7_4 Depth=1 |
| ; RV64-NEXT: addiw a2, a2, 1 |
| ; RV64-NEXT: addi a3, a3, 4 |
| ; RV64-NEXT: bne a2, a1, .LBB7_4 |
| ; RV64-NEXT: .LBB7_6: |
| ; RV64-NEXT: ret |
| %4 = shl nsw i32 %1, 1 |
| %5 = or disjoint i32 %4, 1 |
| %6 = sext i32 %5 to i64 |
| %7 = getelementptr inbounds i32, ptr %0, i64 %6 |
| %8 = load i32, ptr %7, align 4 |
| %9 = icmp sgt i32 %8, -1 |
| %10 = icmp eq i32 %5, %1 |
| %11 = or i1 %9, %10 |
| br i1 %11, label %27, label %12 |
| |
| 12: ; preds = %3, %12 |
| %13 = phi i32 [ %25, %12 ], [ %5, %3 ] |
| %14 = phi ptr [ %22, %12 ], [ %7, %3 ] |
| %15 = phi i32 [ %13, %12 ], [ %1, %3 ] |
| %16 = sext i32 %15 to i64 |
| %17 = getelementptr inbounds i32, ptr %0, i64 %16 |
| %18 = load i32, ptr %17, align 4 |
| store i32 %18, ptr %14, align 4 |
| %19 = shl nsw i32 %13, 1 |
| %20 = or disjoint i32 %19, 1 |
| %21 = sext i32 %20 to i64 |
| %22 = getelementptr inbounds i32, ptr %0, i64 %21 |
| %23 = load i32, ptr %22, align 4 |
| %24 = icmp slt i32 %23, 0 |
| %25 = select i1 %24, i32 %20, i32 %13 |
| %26 = icmp eq i32 %25, %13 |
| br i1 %26, label %27, label %12 |
| |
| 27: ; preds = %12, %3 |
| ret void |
| } |