1f36ec414SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2eae1e28cSAlex Bradbury; RUN: llc < %s -mtriple=riscv32 -target-abi=ilp32f -mattr=+zfa \ 3f36ec414SCraig Topper; RUN: | FileCheck %s --check-prefix=RV32 4eae1e28cSAlex Bradbury; RUN: llc < %s -mtriple=riscv64 -target-abi=lp64f -mattr=+zfa \ 5f36ec414SCraig Topper; RUN: | FileCheck %s --check-prefix=RV64 6f36ec414SCraig Topper 7f36ec414SCraig Topper; The purpose of this test is to check that an FLI instruction that 8f36ec414SCraig Topper; materializes an immediate is not MachineLICM'd out of a loop. 9f36ec414SCraig Topper 10*ff9af4c4SNikita Popov%struct.Node = type { ptr, ptr } 11f36ec414SCraig Topper 12f36ec414SCraig Topperdefine void @process_nodes(ptr %0) nounwind { 13f36ec414SCraig Topper; RV32-LABEL: process_nodes: 14f36ec414SCraig Topper; RV32: # %bb.0: # %entry 15c4a60c9dSsgokhale; RV32-NEXT: beqz a0, .LBB0_4 16c4a60c9dSsgokhale; RV32-NEXT: # %bb.1: # %loop.preheader 17f36ec414SCraig Topper; RV32-NEXT: addi sp, sp, -16 18f36ec414SCraig Topper; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 19f36ec414SCraig Topper; RV32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 20f36ec414SCraig Topper; RV32-NEXT: mv s0, a0 21f36ec414SCraig Topper; RV32-NEXT: .LBB0_2: # %loop 22f36ec414SCraig Topper; RV32-NEXT: # =>This Inner Loop Header: Depth=1 230a895c39SCraig Topper; RV32-NEXT: fli.s fa0, 1.0 24f36ec414SCraig Topper; RV32-NEXT: mv a0, s0 25eabaee0cSFangrui Song; RV32-NEXT: call do_it 26f36ec414SCraig Topper; RV32-NEXT: lw s0, 0(s0) 27f36ec414SCraig Topper; RV32-NEXT: bnez s0, .LBB0_2 28c4a60c9dSsgokhale; RV32-NEXT: # %bb.3: 29f36ec414SCraig Topper; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 30f36ec414SCraig Topper; RV32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 31f36ec414SCraig Topper; RV32-NEXT: addi sp, sp, 16 32c4a60c9dSsgokhale; RV32-NEXT: .LBB0_4: # %exit 33f36ec414SCraig Topper; RV32-NEXT: ret 34f36ec414SCraig Topper; 35f36ec414SCraig Topper; RV64-LABEL: process_nodes: 36f36ec414SCraig Topper; RV64: # %bb.0: # %entry 37c4a60c9dSsgokhale; RV64-NEXT: beqz a0, .LBB0_4 38c4a60c9dSsgokhale; RV64-NEXT: # %bb.1: # %loop.preheader 390a895c39SCraig Topper; RV64-NEXT: addi sp, sp, -16 400a895c39SCraig Topper; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 410a895c39SCraig Topper; RV64-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 42f36ec414SCraig Topper; RV64-NEXT: mv s0, a0 43f36ec414SCraig Topper; RV64-NEXT: .LBB0_2: # %loop 44f36ec414SCraig Topper; RV64-NEXT: # =>This Inner Loop Header: Depth=1 450a895c39SCraig Topper; RV64-NEXT: fli.s fa0, 1.0 46f36ec414SCraig Topper; RV64-NEXT: mv a0, s0 47eabaee0cSFangrui Song; RV64-NEXT: call do_it 48f36ec414SCraig Topper; RV64-NEXT: ld s0, 0(s0) 49f36ec414SCraig Topper; RV64-NEXT: bnez s0, .LBB0_2 50c4a60c9dSsgokhale; RV64-NEXT: # %bb.3: 510a895c39SCraig Topper; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 520a895c39SCraig Topper; RV64-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 530a895c39SCraig Topper; RV64-NEXT: addi sp, sp, 16 54c4a60c9dSsgokhale; RV64-NEXT: .LBB0_4: # %exit 55f36ec414SCraig Topper; RV64-NEXT: ret 56f36ec414SCraig Topperentry: 57f36ec414SCraig Topper %1 = icmp eq ptr %0, null 58f36ec414SCraig Topper br i1 %1, label %exit, label %loop 59f36ec414SCraig Topper 60f36ec414SCraig Topperloop: 61*ff9af4c4SNikita Popov %2 = phi ptr [ %4, %loop ], [ %0, %entry ] 62f36ec414SCraig Topper tail call void @do_it(float 1.000000e+00, ptr nonnull %2) 63f36ec414SCraig Topper %3 = getelementptr inbounds %struct.Node, ptr %2, i64 0, i32 0 64f36ec414SCraig Topper %4 = load ptr, ptr %3, align 8 65f36ec414SCraig Topper %5 = icmp eq ptr %4, null 66f36ec414SCraig Topper br i1 %5, label %exit, label %loop 67f36ec414SCraig Topper 68f36ec414SCraig Topperexit: 69f36ec414SCraig Topper ret void 70f36ec414SCraig Topper} 71f36ec414SCraig Topper 72f36ec414SCraig Topperdeclare void @do_it(float, ptr) 73