1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2;RUN: llc < %s -mtriple=riscv64 -mattr=+f -mcpu=sifive-u74 -target-abi=lp64f \ 3;RUN: | FileCheck %s --check-prefix=NOFUSION 4;RUN: llc < %s -mtriple=riscv64 -mattr=+f,+lui-addi-fusion -mcpu=sifive-u74 \ 5;RUN: -target-abi=lp64f | FileCheck %s --check-prefix=FUSION 6;RUN: llc < %s -mtriple=riscv64 -mattr=+f,+lui-addi-fusion,+use-postra-scheduler -mcpu=sifive-u74 \ 7;RUN: -misched-postra-direction=topdown -target-abi=lp64f \ 8;RUN: | FileCheck %s --check-prefixes=FUSION-POSTRA,FUSION-POSTRA-TOPDOWN 9;RUN: llc < %s -mtriple=riscv64 -mattr=+f,+lui-addi-fusion,+use-postra-scheduler -mcpu=sifive-u74 \ 10;RUN: -misched-postra-direction=bottomup -target-abi=lp64f \ 11;RUN: | FileCheck %s --check-prefixes=FUSION-POSTRA,FUSION-POSTRA-BOTTOMUP 12;RUN: llc < %s -mtriple=riscv64 -mattr=+f,+lui-addi-fusion,+use-postra-scheduler -mcpu=sifive-u74 \ 13;RUN: -misched-postra-direction=bidirectional -target-abi=lp64f \ 14;RUN: | FileCheck %s --check-prefixes=FUSION-POSTRA,FUSION-POSTRA-BIDIRECTIONAL 15;RUN: llc < %s -mtriple=riscv64 -mattr=+f,+lui-addi-fusion -target-abi=lp64f \ 16;RUN: | FileCheck %s --check-prefix=FUSION-GENERIC 17 18@.str = private constant [4 x i8] c"%f\0A\00", align 1 19 20define void @foo(i32 signext %0, i32 signext %1) { 21; NOFUSION-LABEL: foo: 22; NOFUSION: # %bb.0: 23; NOFUSION-NEXT: lui a0, %hi(.L.str) 24; NOFUSION-NEXT: fcvt.s.w fa0, a1 25; NOFUSION-NEXT: addi a0, a0, %lo(.L.str) 26; NOFUSION-NEXT: tail bar 27; 28; FUSION-LABEL: foo: 29; FUSION: # %bb.0: 30; FUSION-NEXT: lui a0, %hi(.L.str) 31; FUSION-NEXT: addi a0, a0, %lo(.L.str) 32; FUSION-NEXT: fcvt.s.w fa0, a1 33; FUSION-NEXT: tail bar 34; 35; FUSION-POSTRA-TOPDOWN-LABEL: foo: 36; FUSION-POSTRA-TOPDOWN: # %bb.0: 37; FUSION-POSTRA-TOPDOWN-NEXT: lui a0, %hi(.L.str) 38; FUSION-POSTRA-TOPDOWN-NEXT: addi a0, a0, %lo(.L.str) 39; FUSION-POSTRA-TOPDOWN-NEXT: fcvt.s.w fa0, a1 40; FUSION-POSTRA-TOPDOWN-NEXT: tail bar 41; 42; FUSION-POSTRA-BOTTOMUP-LABEL: foo: 43; FUSION-POSTRA-BOTTOMUP: # %bb.0: 44; FUSION-POSTRA-BOTTOMUP-NEXT: fcvt.s.w fa0, a1 45; FUSION-POSTRA-BOTTOMUP-NEXT: lui a0, %hi(.L.str) 46; FUSION-POSTRA-BOTTOMUP-NEXT: addi a0, a0, %lo(.L.str) 47; FUSION-POSTRA-BOTTOMUP-NEXT: tail bar 48; 49; FUSION-POSTRA-BIDIRECTIONAL-LABEL: foo: 50; FUSION-POSTRA-BIDIRECTIONAL: # %bb.0: 51; FUSION-POSTRA-BIDIRECTIONAL-NEXT: lui a0, %hi(.L.str) 52; FUSION-POSTRA-BIDIRECTIONAL-NEXT: addi a0, a0, %lo(.L.str) 53; FUSION-POSTRA-BIDIRECTIONAL-NEXT: fcvt.s.w fa0, a1 54; FUSION-POSTRA-BIDIRECTIONAL-NEXT: tail bar 55; 56; FUSION-GENERIC-LABEL: foo: 57; FUSION-GENERIC: # %bb.0: 58; FUSION-GENERIC-NEXT: fcvt.s.w fa0, a1 59; FUSION-GENERIC-NEXT: lui a0, %hi(.L.str) 60; FUSION-GENERIC-NEXT: addi a0, a0, %lo(.L.str) 61; FUSION-GENERIC-NEXT: tail bar 62 %3 = sitofp i32 %1 to float 63 tail call void @bar(ptr @.str, float %3) 64 ret void 65} 66 67declare void @bar(ptr, float) 68 69; Test that we prefer lui+addiw over li+slli. 70define i32 @test_matint() { 71; NOFUSION-LABEL: test_matint: 72; NOFUSION: # %bb.0: 73; NOFUSION-NEXT: li a0, 1 74; NOFUSION-NEXT: slli a0, a0, 11 75; NOFUSION-NEXT: ret 76; 77; FUSION-LABEL: test_matint: 78; FUSION: # %bb.0: 79; FUSION-NEXT: lui a0, 1 80; FUSION-NEXT: addiw a0, a0, -2048 81; FUSION-NEXT: ret 82; 83; FUSION-POSTRA-LABEL: test_matint: 84; FUSION-POSTRA: # %bb.0: 85; FUSION-POSTRA-NEXT: lui a0, 1 86; FUSION-POSTRA-NEXT: addiw a0, a0, -2048 87; FUSION-POSTRA-NEXT: ret 88; 89; FUSION-GENERIC-LABEL: test_matint: 90; FUSION-GENERIC: # %bb.0: 91; FUSION-GENERIC-NEXT: lui a0, 1 92; FUSION-GENERIC-NEXT: addiw a0, a0, -2048 93; FUSION-GENERIC-NEXT: ret 94 ret i32 2048 95} 96 97define void @test_regalloc_hint(i32 noundef signext %0, i32 noundef signext %1) { 98; NOFUSION-LABEL: test_regalloc_hint: 99; NOFUSION: # %bb.0: 100; NOFUSION-NEXT: mv a0, a1 101; NOFUSION-NEXT: lui a1, 3014 102; NOFUSION-NEXT: addiw a1, a1, 334 103; NOFUSION-NEXT: tail bar 104; 105; FUSION-LABEL: test_regalloc_hint: 106; FUSION: # %bb.0: 107; FUSION-NEXT: mv a0, a1 108; FUSION-NEXT: lui a1, 3014 109; FUSION-NEXT: addiw a1, a1, 334 110; FUSION-NEXT: tail bar 111; 112; FUSION-POSTRA-LABEL: test_regalloc_hint: 113; FUSION-POSTRA: # %bb.0: 114; FUSION-POSTRA-NEXT: mv a0, a1 115; FUSION-POSTRA-NEXT: lui a1, 3014 116; FUSION-POSTRA-NEXT: addiw a1, a1, 334 117; FUSION-POSTRA-NEXT: tail bar 118; 119; FUSION-GENERIC-LABEL: test_regalloc_hint: 120; FUSION-GENERIC: # %bb.0: 121; FUSION-GENERIC-NEXT: lui a2, 3014 122; FUSION-GENERIC-NEXT: addiw a2, a2, 334 123; FUSION-GENERIC-NEXT: mv a0, a1 124; FUSION-GENERIC-NEXT: mv a1, a2 125; FUSION-GENERIC-NEXT: tail bar 126 tail call void @bar(i32 noundef signext %1, i32 noundef signext 12345678) 127 ret void 128} 129