1529 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \3; RUN: | FileCheck -check-prefix=RV32I %s4; RUN: llc -mtriple=riscv32 -verify-machineinstrs -mattr=+experimental-xqcili< %s \5; RUN: | FileCheck -check-prefix=RV32IXQCILI %s6; RUN: llc -mtriple=riscv32 -verify-machineinstrs -code-model=medium < %s \7; RUN: | FileCheck -check-prefix=RV32I-MEDIUM %s8; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \9; RUN: | FileCheck -check-prefix=RV64I %s10; RUN: llc -mtriple=riscv64 -verify-machineinstrs -code-model=medium < %s \11; RUN: | FileCheck -check-prefix=RV64I-MEDIUM %s12; RUN: llc -mtriple=riscv64 -verify-machineinstrs -code-model=large < %s \13; RUN: | FileCheck -check-prefix=RV64I-LARGE %s14 15; We can often fold an ADDI into the offset of load/store instructions:16; (load (addi base, off1), off2) -> (load base, off1+off2)17; (store val, (addi base, off1), off2) -> (store val, base, off1+off2)18; This is possible when the off1+off2 continues to fit the 12-bit immediate.19; Check if we do the fold under various conditions. If off1 is (the low part of)20; an address the fold's safety depends on the variable's alignment.21 22@g_0 = dso_local global i64 023@g_1 = dso_local global i64 0, align 124@g_2 = dso_local global i64 0, align 225@g_4 = dso_local global i64 0, align 426@g_8 = dso_local global i64 0, align 827@g_16 = dso_local global i64 0, align 1628 29define dso_local i64 @load_g_0() nounwind {30; RV32I-LABEL: load_g_0:31; RV32I: # %bb.0: # %entry32; RV32I-NEXT: lui a1, %hi(g_0)33; RV32I-NEXT: lw a0, %lo(g_0)(a1)34; RV32I-NEXT: lw a1, %lo(g_0+4)(a1)35; RV32I-NEXT: ret36;37; RV32IXQCILI-LABEL: load_g_0:38; RV32IXQCILI: # %bb.0: # %entry39; RV32IXQCILI-NEXT: qc.e.li a1, g_040; RV32IXQCILI-NEXT: lw a0, 0(a1)41; RV32IXQCILI-NEXT: lw a1, 4(a1)42; RV32IXQCILI-NEXT: ret43;44; RV32I-MEDIUM-LABEL: load_g_0:45; RV32I-MEDIUM: # %bb.0: # %entry46; RV32I-MEDIUM-NEXT: .Lpcrel_hi0:47; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_0)48; RV32I-MEDIUM-NEXT: addi a1, a0, %pcrel_lo(.Lpcrel_hi0)49; RV32I-MEDIUM-NEXT: lw a0, 0(a1)50; RV32I-MEDIUM-NEXT: lw a1, 4(a1)51; RV32I-MEDIUM-NEXT: ret52;53; RV64I-LABEL: load_g_0:54; RV64I: # %bb.0: # %entry55; RV64I-NEXT: lui a0, %hi(g_0)56; RV64I-NEXT: ld a0, %lo(g_0)(a0)57; RV64I-NEXT: ret58;59; RV64I-MEDIUM-LABEL: load_g_0:60; RV64I-MEDIUM: # %bb.0: # %entry61; RV64I-MEDIUM-NEXT: .Lpcrel_hi0:62; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_0)63; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi0)(a0)64; RV64I-MEDIUM-NEXT: ret65;66; RV64I-LARGE-LABEL: load_g_0:67; RV64I-LARGE: # %bb.0: # %entry68; RV64I-LARGE-NEXT: .Lpcrel_hi0:69; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI0_0)70; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi0)(a0)71; RV64I-LARGE-NEXT: ld a0, 0(a0)72; RV64I-LARGE-NEXT: ret73entry:74 %0 = load i64, ptr @g_075 ret i64 %076}77 78define dso_local i64 @load_g_1() nounwind {79; RV32I-LABEL: load_g_1:80; RV32I: # %bb.0: # %entry81; RV32I-NEXT: lui a1, %hi(g_1)82; RV32I-NEXT: addi a1, a1, %lo(g_1)83; RV32I-NEXT: lw a0, 0(a1)84; RV32I-NEXT: lw a1, 4(a1)85; RV32I-NEXT: ret86;87; RV32IXQCILI-LABEL: load_g_1:88; RV32IXQCILI: # %bb.0: # %entry89; RV32IXQCILI-NEXT: qc.e.li a1, g_190; RV32IXQCILI-NEXT: lw a0, 0(a1)91; RV32IXQCILI-NEXT: lw a1, 4(a1)92; RV32IXQCILI-NEXT: ret93;94; RV32I-MEDIUM-LABEL: load_g_1:95; RV32I-MEDIUM: # %bb.0: # %entry96; RV32I-MEDIUM-NEXT: .Lpcrel_hi1:97; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_1)98; RV32I-MEDIUM-NEXT: addi a1, a0, %pcrel_lo(.Lpcrel_hi1)99; RV32I-MEDIUM-NEXT: lw a0, 0(a1)100; RV32I-MEDIUM-NEXT: lw a1, 4(a1)101; RV32I-MEDIUM-NEXT: ret102;103; RV64I-LABEL: load_g_1:104; RV64I: # %bb.0: # %entry105; RV64I-NEXT: lui a0, %hi(g_1)106; RV64I-NEXT: ld a0, %lo(g_1)(a0)107; RV64I-NEXT: ret108;109; RV64I-MEDIUM-LABEL: load_g_1:110; RV64I-MEDIUM: # %bb.0: # %entry111; RV64I-MEDIUM-NEXT: .Lpcrel_hi1:112; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_1)113; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi1)(a0)114; RV64I-MEDIUM-NEXT: ret115;116; RV64I-LARGE-LABEL: load_g_1:117; RV64I-LARGE: # %bb.0: # %entry118; RV64I-LARGE-NEXT: .Lpcrel_hi1:119; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI1_0)120; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi1)(a0)121; RV64I-LARGE-NEXT: ld a0, 0(a0)122; RV64I-LARGE-NEXT: ret123entry:124 %0 = load i64, ptr @g_1125 ret i64 %0126}127 128define dso_local i64 @load_g_2() nounwind {129; RV32I-LABEL: load_g_2:130; RV32I: # %bb.0: # %entry131; RV32I-NEXT: lui a1, %hi(g_2)132; RV32I-NEXT: addi a1, a1, %lo(g_2)133; RV32I-NEXT: lw a0, 0(a1)134; RV32I-NEXT: lw a1, 4(a1)135; RV32I-NEXT: ret136;137; RV32IXQCILI-LABEL: load_g_2:138; RV32IXQCILI: # %bb.0: # %entry139; RV32IXQCILI-NEXT: qc.e.li a1, g_2140; RV32IXQCILI-NEXT: lw a0, 0(a1)141; RV32IXQCILI-NEXT: lw a1, 4(a1)142; RV32IXQCILI-NEXT: ret143;144; RV32I-MEDIUM-LABEL: load_g_2:145; RV32I-MEDIUM: # %bb.0: # %entry146; RV32I-MEDIUM-NEXT: .Lpcrel_hi2:147; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_2)148; RV32I-MEDIUM-NEXT: addi a1, a0, %pcrel_lo(.Lpcrel_hi2)149; RV32I-MEDIUM-NEXT: lw a0, 0(a1)150; RV32I-MEDIUM-NEXT: lw a1, 4(a1)151; RV32I-MEDIUM-NEXT: ret152;153; RV64I-LABEL: load_g_2:154; RV64I: # %bb.0: # %entry155; RV64I-NEXT: lui a0, %hi(g_2)156; RV64I-NEXT: ld a0, %lo(g_2)(a0)157; RV64I-NEXT: ret158;159; RV64I-MEDIUM-LABEL: load_g_2:160; RV64I-MEDIUM: # %bb.0: # %entry161; RV64I-MEDIUM-NEXT: .Lpcrel_hi2:162; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_2)163; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi2)(a0)164; RV64I-MEDIUM-NEXT: ret165;166; RV64I-LARGE-LABEL: load_g_2:167; RV64I-LARGE: # %bb.0: # %entry168; RV64I-LARGE-NEXT: .Lpcrel_hi2:169; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI2_0)170; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi2)(a0)171; RV64I-LARGE-NEXT: ld a0, 0(a0)172; RV64I-LARGE-NEXT: ret173entry:174 %0 = load i64, ptr @g_2175 ret i64 %0176}177 178define dso_local i64 @load_g_4() nounwind {179; RV32I-LABEL: load_g_4:180; RV32I: # %bb.0: # %entry181; RV32I-NEXT: lui a1, %hi(g_4)182; RV32I-NEXT: addi a1, a1, %lo(g_4)183; RV32I-NEXT: lw a0, 0(a1)184; RV32I-NEXT: lw a1, 4(a1)185; RV32I-NEXT: ret186;187; RV32IXQCILI-LABEL: load_g_4:188; RV32IXQCILI: # %bb.0: # %entry189; RV32IXQCILI-NEXT: qc.e.li a1, g_4190; RV32IXQCILI-NEXT: lw a0, 0(a1)191; RV32IXQCILI-NEXT: lw a1, 4(a1)192; RV32IXQCILI-NEXT: ret193;194; RV32I-MEDIUM-LABEL: load_g_4:195; RV32I-MEDIUM: # %bb.0: # %entry196; RV32I-MEDIUM-NEXT: .Lpcrel_hi3:197; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_4)198; RV32I-MEDIUM-NEXT: addi a1, a0, %pcrel_lo(.Lpcrel_hi3)199; RV32I-MEDIUM-NEXT: lw a0, 0(a1)200; RV32I-MEDIUM-NEXT: lw a1, 4(a1)201; RV32I-MEDIUM-NEXT: ret202;203; RV64I-LABEL: load_g_4:204; RV64I: # %bb.0: # %entry205; RV64I-NEXT: lui a0, %hi(g_4)206; RV64I-NEXT: ld a0, %lo(g_4)(a0)207; RV64I-NEXT: ret208;209; RV64I-MEDIUM-LABEL: load_g_4:210; RV64I-MEDIUM: # %bb.0: # %entry211; RV64I-MEDIUM-NEXT: .Lpcrel_hi3:212; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_4)213; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi3)(a0)214; RV64I-MEDIUM-NEXT: ret215;216; RV64I-LARGE-LABEL: load_g_4:217; RV64I-LARGE: # %bb.0: # %entry218; RV64I-LARGE-NEXT: .Lpcrel_hi3:219; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI3_0)220; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi3)(a0)221; RV64I-LARGE-NEXT: ld a0, 0(a0)222; RV64I-LARGE-NEXT: ret223entry:224 %0 = load i64, ptr @g_4225 ret i64 %0226}227 228define dso_local i64 @load_g_8() nounwind {229; RV32I-LABEL: load_g_8:230; RV32I: # %bb.0: # %entry231; RV32I-NEXT: lui a1, %hi(g_8)232; RV32I-NEXT: lw a0, %lo(g_8)(a1)233; RV32I-NEXT: lw a1, %lo(g_8+4)(a1)234; RV32I-NEXT: ret235;236; RV32IXQCILI-LABEL: load_g_8:237; RV32IXQCILI: # %bb.0: # %entry238; RV32IXQCILI-NEXT: qc.e.li a1, g_8239; RV32IXQCILI-NEXT: lw a0, 0(a1)240; RV32IXQCILI-NEXT: lw a1, 4(a1)241; RV32IXQCILI-NEXT: ret242;243; RV32I-MEDIUM-LABEL: load_g_8:244; RV32I-MEDIUM: # %bb.0: # %entry245; RV32I-MEDIUM-NEXT: .Lpcrel_hi4:246; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_8)247; RV32I-MEDIUM-NEXT: addi a1, a0, %pcrel_lo(.Lpcrel_hi4)248; RV32I-MEDIUM-NEXT: lw a0, 0(a1)249; RV32I-MEDIUM-NEXT: lw a1, 4(a1)250; RV32I-MEDIUM-NEXT: ret251;252; RV64I-LABEL: load_g_8:253; RV64I: # %bb.0: # %entry254; RV64I-NEXT: lui a0, %hi(g_8)255; RV64I-NEXT: ld a0, %lo(g_8)(a0)256; RV64I-NEXT: ret257;258; RV64I-MEDIUM-LABEL: load_g_8:259; RV64I-MEDIUM: # %bb.0: # %entry260; RV64I-MEDIUM-NEXT: .Lpcrel_hi4:261; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_8)262; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi4)(a0)263; RV64I-MEDIUM-NEXT: ret264;265; RV64I-LARGE-LABEL: load_g_8:266; RV64I-LARGE: # %bb.0: # %entry267; RV64I-LARGE-NEXT: .Lpcrel_hi4:268; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI4_0)269; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi4)(a0)270; RV64I-LARGE-NEXT: ld a0, 0(a0)271; RV64I-LARGE-NEXT: ret272entry:273 %0 = load i64, ptr @g_8274 ret i64 %0275}276 277define dso_local i64 @load_g_16() nounwind {278; RV32I-LABEL: load_g_16:279; RV32I: # %bb.0: # %entry280; RV32I-NEXT: lui a1, %hi(g_16)281; RV32I-NEXT: lw a0, %lo(g_16)(a1)282; RV32I-NEXT: lw a1, %lo(g_16+4)(a1)283; RV32I-NEXT: ret284;285; RV32IXQCILI-LABEL: load_g_16:286; RV32IXQCILI: # %bb.0: # %entry287; RV32IXQCILI-NEXT: qc.e.li a1, g_16288; RV32IXQCILI-NEXT: lw a0, 0(a1)289; RV32IXQCILI-NEXT: lw a1, 4(a1)290; RV32IXQCILI-NEXT: ret291;292; RV32I-MEDIUM-LABEL: load_g_16:293; RV32I-MEDIUM: # %bb.0: # %entry294; RV32I-MEDIUM-NEXT: .Lpcrel_hi5:295; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_16)296; RV32I-MEDIUM-NEXT: addi a1, a0, %pcrel_lo(.Lpcrel_hi5)297; RV32I-MEDIUM-NEXT: lw a0, 0(a1)298; RV32I-MEDIUM-NEXT: lw a1, 4(a1)299; RV32I-MEDIUM-NEXT: ret300;301; RV64I-LABEL: load_g_16:302; RV64I: # %bb.0: # %entry303; RV64I-NEXT: lui a0, %hi(g_16)304; RV64I-NEXT: ld a0, %lo(g_16)(a0)305; RV64I-NEXT: ret306;307; RV64I-MEDIUM-LABEL: load_g_16:308; RV64I-MEDIUM: # %bb.0: # %entry309; RV64I-MEDIUM-NEXT: .Lpcrel_hi5:310; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_16)311; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi5)(a0)312; RV64I-MEDIUM-NEXT: ret313;314; RV64I-LARGE-LABEL: load_g_16:315; RV64I-LARGE: # %bb.0: # %entry316; RV64I-LARGE-NEXT: .Lpcrel_hi5:317; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI5_0)318; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi5)(a0)319; RV64I-LARGE-NEXT: ld a0, 0(a0)320; RV64I-LARGE-NEXT: ret321entry:322 %0 = load i64, ptr @g_16323 ret i64 %0324}325 326define dso_local void @store_g_4() nounwind {327; RV32I-LABEL: store_g_4:328; RV32I: # %bb.0: # %entry329; RV32I-NEXT: lui a0, %hi(g_4)330; RV32I-NEXT: addi a0, a0, %lo(g_4)331; RV32I-NEXT: sw zero, 0(a0)332; RV32I-NEXT: sw zero, 4(a0)333; RV32I-NEXT: ret334;335; RV32IXQCILI-LABEL: store_g_4:336; RV32IXQCILI: # %bb.0: # %entry337; RV32IXQCILI-NEXT: qc.e.li a0, g_4338; RV32IXQCILI-NEXT: sw zero, 0(a0)339; RV32IXQCILI-NEXT: sw zero, 4(a0)340; RV32IXQCILI-NEXT: ret341;342; RV32I-MEDIUM-LABEL: store_g_4:343; RV32I-MEDIUM: # %bb.0: # %entry344; RV32I-MEDIUM-NEXT: .Lpcrel_hi6:345; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_4)346; RV32I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi6)347; RV32I-MEDIUM-NEXT: sw zero, 0(a0)348; RV32I-MEDIUM-NEXT: sw zero, 4(a0)349; RV32I-MEDIUM-NEXT: ret350;351; RV64I-LABEL: store_g_4:352; RV64I: # %bb.0: # %entry353; RV64I-NEXT: lui a0, %hi(g_4)354; RV64I-NEXT: sd zero, %lo(g_4)(a0)355; RV64I-NEXT: ret356;357; RV64I-MEDIUM-LABEL: store_g_4:358; RV64I-MEDIUM: # %bb.0: # %entry359; RV64I-MEDIUM-NEXT: .Lpcrel_hi6:360; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_4)361; RV64I-MEDIUM-NEXT: sd zero, %pcrel_lo(.Lpcrel_hi6)(a0)362; RV64I-MEDIUM-NEXT: ret363;364; RV64I-LARGE-LABEL: store_g_4:365; RV64I-LARGE: # %bb.0: # %entry366; RV64I-LARGE-NEXT: .Lpcrel_hi6:367; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI6_0)368; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi6)(a0)369; RV64I-LARGE-NEXT: sd zero, 0(a0)370; RV64I-LARGE-NEXT: ret371entry:372 store i64 0, ptr @g_4373 ret void374}375 376define dso_local void @store_g_8() nounwind {377; RV32I-LABEL: store_g_8:378; RV32I: # %bb.0: # %entry379; RV32I-NEXT: lui a0, %hi(g_8)380; RV32I-NEXT: sw zero, %lo(g_8+4)(a0)381; RV32I-NEXT: sw zero, %lo(g_8)(a0)382; RV32I-NEXT: ret383;384; RV32IXQCILI-LABEL: store_g_8:385; RV32IXQCILI: # %bb.0: # %entry386; RV32IXQCILI-NEXT: qc.e.li a0, g_8387; RV32IXQCILI-NEXT: sw zero, 0(a0)388; RV32IXQCILI-NEXT: sw zero, 4(a0)389; RV32IXQCILI-NEXT: ret390;391; RV32I-MEDIUM-LABEL: store_g_8:392; RV32I-MEDIUM: # %bb.0: # %entry393; RV32I-MEDIUM-NEXT: .Lpcrel_hi7:394; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_8)395; RV32I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi7)396; RV32I-MEDIUM-NEXT: sw zero, 0(a0)397; RV32I-MEDIUM-NEXT: sw zero, 4(a0)398; RV32I-MEDIUM-NEXT: ret399;400; RV64I-LABEL: store_g_8:401; RV64I: # %bb.0: # %entry402; RV64I-NEXT: lui a0, %hi(g_8)403; RV64I-NEXT: sd zero, %lo(g_8)(a0)404; RV64I-NEXT: ret405;406; RV64I-MEDIUM-LABEL: store_g_8:407; RV64I-MEDIUM: # %bb.0: # %entry408; RV64I-MEDIUM-NEXT: .Lpcrel_hi7:409; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_8)410; RV64I-MEDIUM-NEXT: sd zero, %pcrel_lo(.Lpcrel_hi7)(a0)411; RV64I-MEDIUM-NEXT: ret412;413; RV64I-LARGE-LABEL: store_g_8:414; RV64I-LARGE: # %bb.0: # %entry415; RV64I-LARGE-NEXT: .Lpcrel_hi7:416; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI7_0)417; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi7)(a0)418; RV64I-LARGE-NEXT: sd zero, 0(a0)419; RV64I-LARGE-NEXT: ret420entry:421 store i64 0, ptr @g_8422 ret void423}424 425; Check if we can fold ADDI into the offset of store instructions,426; when store instructions is the root node in DAG.427 428@g_4_i32 = global i32 0, align 4429 430define dso_local void @inc_g_i32() nounwind {431; RV32I-LABEL: inc_g_i32:432; RV32I: # %bb.0: # %entry433; RV32I-NEXT: lui a0, %hi(g_4_i32)434; RV32I-NEXT: lw a1, %lo(g_4_i32)(a0)435; RV32I-NEXT: addi a1, a1, 1436; RV32I-NEXT: sw a1, %lo(g_4_i32)(a0)437; RV32I-NEXT: ret438;439; RV32IXQCILI-LABEL: inc_g_i32:440; RV32IXQCILI: # %bb.0: # %entry441; RV32IXQCILI-NEXT: qc.e.li a0, g_4_i32442; RV32IXQCILI-NEXT: lw a1, 0(a0)443; RV32IXQCILI-NEXT: addi a1, a1, 1444; RV32IXQCILI-NEXT: sw a1, 0(a0)445; RV32IXQCILI-NEXT: ret446;447; RV32I-MEDIUM-LABEL: inc_g_i32:448; RV32I-MEDIUM: # %bb.0: # %entry449; RV32I-MEDIUM-NEXT: .Lpcrel_hi8:450; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_4_i32)451; RV32I-MEDIUM-NEXT: lw a1, %pcrel_lo(.Lpcrel_hi8)(a0)452; RV32I-MEDIUM-NEXT: addi a1, a1, 1453; RV32I-MEDIUM-NEXT: sw a1, %pcrel_lo(.Lpcrel_hi8)(a0)454; RV32I-MEDIUM-NEXT: ret455;456; RV64I-LABEL: inc_g_i32:457; RV64I: # %bb.0: # %entry458; RV64I-NEXT: lui a0, %hi(g_4_i32)459; RV64I-NEXT: lw a1, %lo(g_4_i32)(a0)460; RV64I-NEXT: addi a1, a1, 1461; RV64I-NEXT: sw a1, %lo(g_4_i32)(a0)462; RV64I-NEXT: ret463;464; RV64I-MEDIUM-LABEL: inc_g_i32:465; RV64I-MEDIUM: # %bb.0: # %entry466; RV64I-MEDIUM-NEXT: .Lpcrel_hi8:467; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g_4_i32)468; RV64I-MEDIUM-NEXT: lw a1, %pcrel_lo(.Lpcrel_hi8)(a0)469; RV64I-MEDIUM-NEXT: addi a1, a1, 1470; RV64I-MEDIUM-NEXT: sw a1, %pcrel_lo(.Lpcrel_hi8)(a0)471; RV64I-MEDIUM-NEXT: ret472;473; RV64I-LARGE-LABEL: inc_g_i32:474; RV64I-LARGE: # %bb.0: # %entry475; RV64I-LARGE-NEXT: .Lpcrel_hi8:476; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI8_0)477; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi8)(a0)478; RV64I-LARGE-NEXT: lw a1, 0(a0)479; RV64I-LARGE-NEXT: addi a1, a1, 1480; RV64I-LARGE-NEXT: sw a1, 0(a0)481; RV64I-LARGE-NEXT: ret482entry:483 %0 = load i32, ptr @g_4_i32484 %inc = add i32 %0, 1485 store i32 %inc, ptr @g_4_i32486 br label %if.end487 488if.end:489 ret void490}491 492; Check for folds in accesses to elements of an i32 array.493 494@ga = dso_local local_unnamed_addr global [2 x i32] zeroinitializer, align 4495 496define dso_local i32 @load_ga() local_unnamed_addr #0 {497; RV32I-LABEL: load_ga:498; RV32I: # %bb.0:499; RV32I-NEXT: lui a0, %hi(ga+4)500; RV32I-NEXT: lw a0, %lo(ga+4)(a0)501; RV32I-NEXT: ret502;503; RV32IXQCILI-LABEL: load_ga:504; RV32IXQCILI: # %bb.0:505; RV32IXQCILI-NEXT: qc.e.li a0, ga506; RV32IXQCILI-NEXT: lw a0, 4(a0)507; RV32IXQCILI-NEXT: ret508;509; RV32I-MEDIUM-LABEL: load_ga:510; RV32I-MEDIUM: # %bb.0:511; RV32I-MEDIUM-NEXT: .Lpcrel_hi9:512; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(ga+4)513; RV32I-MEDIUM-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi9)(a0)514; RV32I-MEDIUM-NEXT: ret515;516; RV64I-LABEL: load_ga:517; RV64I: # %bb.0:518; RV64I-NEXT: lui a0, %hi(ga+4)519; RV64I-NEXT: lw a0, %lo(ga+4)(a0)520; RV64I-NEXT: ret521;522; RV64I-MEDIUM-LABEL: load_ga:523; RV64I-MEDIUM: # %bb.0:524; RV64I-MEDIUM-NEXT: .Lpcrel_hi9:525; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(ga+4)526; RV64I-MEDIUM-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi9)(a0)527; RV64I-MEDIUM-NEXT: ret528;529; RV64I-LARGE-LABEL: load_ga:530; RV64I-LARGE: # %bb.0:531; RV64I-LARGE-NEXT: .Lpcrel_hi9:532; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI9_0)533; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi9)(a0)534; RV64I-LARGE-NEXT: lw a0, 4(a0)535; RV64I-LARGE-NEXT: ret536 %1 = load i32, ptr getelementptr inbounds ([2 x i32], ptr @ga, i32 0, i32 1), align 4537 ret i32 %1538}539 540; Check for folds in accesses to the second element of an i64 array.541 542@ga_8 = dso_local local_unnamed_addr global [2 x i64] zeroinitializer, align 8543@ga_16 = dso_local local_unnamed_addr global [2 x i64] zeroinitializer, align 16544 545define dso_local i64 @load_ga_8() nounwind {546; RV32I-LABEL: load_ga_8:547; RV32I: # %bb.0: # %entry548; RV32I-NEXT: lui a1, %hi(ga_8)549; RV32I-NEXT: addi a1, a1, %lo(ga_8)550; RV32I-NEXT: lw a0, 8(a1)551; RV32I-NEXT: lw a1, 12(a1)552; RV32I-NEXT: ret553;554; RV32IXQCILI-LABEL: load_ga_8:555; RV32IXQCILI: # %bb.0: # %entry556; RV32IXQCILI-NEXT: qc.e.li a1, ga_8557; RV32IXQCILI-NEXT: lw a0, 8(a1)558; RV32IXQCILI-NEXT: lw a1, 12(a1)559; RV32IXQCILI-NEXT: ret560;561; RV32I-MEDIUM-LABEL: load_ga_8:562; RV32I-MEDIUM: # %bb.0: # %entry563; RV32I-MEDIUM-NEXT: .Lpcrel_hi10:564; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(ga_8)565; RV32I-MEDIUM-NEXT: addi a1, a0, %pcrel_lo(.Lpcrel_hi10)566; RV32I-MEDIUM-NEXT: lw a0, 8(a1)567; RV32I-MEDIUM-NEXT: lw a1, 12(a1)568; RV32I-MEDIUM-NEXT: ret569;570; RV64I-LABEL: load_ga_8:571; RV64I: # %bb.0: # %entry572; RV64I-NEXT: lui a0, %hi(ga_8+8)573; RV64I-NEXT: ld a0, %lo(ga_8+8)(a0)574; RV64I-NEXT: ret575;576; RV64I-MEDIUM-LABEL: load_ga_8:577; RV64I-MEDIUM: # %bb.0: # %entry578; RV64I-MEDIUM-NEXT: .Lpcrel_hi10:579; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(ga_8+8)580; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi10)(a0)581; RV64I-MEDIUM-NEXT: ret582;583; RV64I-LARGE-LABEL: load_ga_8:584; RV64I-LARGE: # %bb.0: # %entry585; RV64I-LARGE-NEXT: .Lpcrel_hi10:586; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI10_0)587; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi10)(a0)588; RV64I-LARGE-NEXT: ld a0, 8(a0)589; RV64I-LARGE-NEXT: ret590entry:591 %0 = load i64, ptr getelementptr inbounds ([2 x i64], ptr @ga_8, i32 0, i32 1)592 ret i64 %0593}594 595define dso_local i64 @load_ga_16() nounwind {596; RV32I-LABEL: load_ga_16:597; RV32I: # %bb.0: # %entry598; RV32I-NEXT: lui a1, %hi(ga_16)599; RV32I-NEXT: lw a0, %lo(ga_16+8)(a1)600; RV32I-NEXT: lw a1, %lo(ga_16+12)(a1)601; RV32I-NEXT: ret602;603; RV32IXQCILI-LABEL: load_ga_16:604; RV32IXQCILI: # %bb.0: # %entry605; RV32IXQCILI-NEXT: qc.e.li a1, ga_16606; RV32IXQCILI-NEXT: lw a0, 8(a1)607; RV32IXQCILI-NEXT: lw a1, 12(a1)608; RV32IXQCILI-NEXT: ret609;610; RV32I-MEDIUM-LABEL: load_ga_16:611; RV32I-MEDIUM: # %bb.0: # %entry612; RV32I-MEDIUM-NEXT: .Lpcrel_hi11:613; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(ga_16)614; RV32I-MEDIUM-NEXT: addi a1, a0, %pcrel_lo(.Lpcrel_hi11)615; RV32I-MEDIUM-NEXT: lw a0, 8(a1)616; RV32I-MEDIUM-NEXT: lw a1, 12(a1)617; RV32I-MEDIUM-NEXT: ret618;619; RV64I-LABEL: load_ga_16:620; RV64I: # %bb.0: # %entry621; RV64I-NEXT: lui a0, %hi(ga_16)622; RV64I-NEXT: ld a0, %lo(ga_16+8)(a0)623; RV64I-NEXT: ret624;625; RV64I-MEDIUM-LABEL: load_ga_16:626; RV64I-MEDIUM: # %bb.0: # %entry627; RV64I-MEDIUM-NEXT: .Lpcrel_hi11:628; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(ga_16+8)629; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi11)(a0)630; RV64I-MEDIUM-NEXT: ret631;632; RV64I-LARGE-LABEL: load_ga_16:633; RV64I-LARGE: # %bb.0: # %entry634; RV64I-LARGE-NEXT: .Lpcrel_hi11:635; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI11_0)636; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi11)(a0)637; RV64I-LARGE-NEXT: ld a0, 8(a0)638; RV64I-LARGE-NEXT: ret639entry:640 %0 = load i64, ptr getelementptr inbounds ([2 x i64], ptr @ga_16, i32 0, i32 1)641 ret i64 %0642}643 644; Check for folds in accesses to block address.645define dso_local ptr @load_ba_1() nounwind {646; RV32I-LABEL: load_ba_1:647; RV32I: # %bb.0: # %entry648; RV32I-NEXT: .Ltmp0: # Block address taken649; RV32I-NEXT: # %bb.1: # %label650; RV32I-NEXT: lui a0, %hi(.Ltmp0)651; RV32I-NEXT: lw a0, %lo(.Ltmp0)(a0)652; RV32I-NEXT: ret653;654; RV32IXQCILI-LABEL: load_ba_1:655; RV32IXQCILI: # %bb.0: # %entry656; RV32IXQCILI-NEXT: .Ltmp0: # Block address taken657; RV32IXQCILI-NEXT: # %bb.1: # %label658; RV32IXQCILI-NEXT: qc.e.li a0, .Ltmp0659; RV32IXQCILI-NEXT: lw a0, 0(a0)660; RV32IXQCILI-NEXT: ret661;662; RV32I-MEDIUM-LABEL: load_ba_1:663; RV32I-MEDIUM: # %bb.0: # %entry664; RV32I-MEDIUM-NEXT: .Ltmp0: # Block address taken665; RV32I-MEDIUM-NEXT: # %bb.1: # %label666; RV32I-MEDIUM-NEXT: .Lpcrel_hi12:667; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp0)668; RV32I-MEDIUM-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi12)(a0)669; RV32I-MEDIUM-NEXT: ret670;671; RV64I-LABEL: load_ba_1:672; RV64I: # %bb.0: # %entry673; RV64I-NEXT: .Ltmp0: # Block address taken674; RV64I-NEXT: # %bb.1: # %label675; RV64I-NEXT: lui a0, %hi(.Ltmp0)676; RV64I-NEXT: ld a0, %lo(.Ltmp0)(a0)677; RV64I-NEXT: ret678;679; RV64I-MEDIUM-LABEL: load_ba_1:680; RV64I-MEDIUM: # %bb.0: # %entry681; RV64I-MEDIUM-NEXT: .Ltmp0: # Block address taken682; RV64I-MEDIUM-NEXT: # %bb.1: # %label683; RV64I-MEDIUM-NEXT: .Lpcrel_hi12:684; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp0)685; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi12)(a0)686; RV64I-MEDIUM-NEXT: ret687;688; RV64I-LARGE-LABEL: load_ba_1:689; RV64I-LARGE: # %bb.0: # %entry690; RV64I-LARGE-NEXT: .Ltmp0: # Block address taken691; RV64I-LARGE-NEXT: # %bb.1: # %label692; RV64I-LARGE-NEXT: .Lpcrel_hi12:693; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.Ltmp0)694; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi12)(a0)695; RV64I-LARGE-NEXT: ret696entry:697 br label %label698label:699 %0 = load ptr, ptr blockaddress(@load_ba_1, %label)700 ret ptr %0701}702 703define dso_local ptr @load_ba_2() nounwind {704; RV32I-LABEL: load_ba_2:705; RV32I: # %bb.0: # %entry706; RV32I-NEXT: .Ltmp1: # Block address taken707; RV32I-NEXT: # %bb.1: # %label708; RV32I-NEXT: lui a0, %hi(.Ltmp1+8)709; RV32I-NEXT: lw a0, %lo(.Ltmp1+8)(a0)710; RV32I-NEXT: ret711;712; RV32IXQCILI-LABEL: load_ba_2:713; RV32IXQCILI: # %bb.0: # %entry714; RV32IXQCILI-NEXT: .Ltmp1: # Block address taken715; RV32IXQCILI-NEXT: # %bb.1: # %label716; RV32IXQCILI-NEXT: qc.e.li a0, .Ltmp1717; RV32IXQCILI-NEXT: lw a0, 8(a0)718; RV32IXQCILI-NEXT: ret719;720; RV32I-MEDIUM-LABEL: load_ba_2:721; RV32I-MEDIUM: # %bb.0: # %entry722; RV32I-MEDIUM-NEXT: .Ltmp1: # Block address taken723; RV32I-MEDIUM-NEXT: # %bb.1: # %label724; RV32I-MEDIUM-NEXT: .Lpcrel_hi13:725; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp1+8)726; RV32I-MEDIUM-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi13)(a0)727; RV32I-MEDIUM-NEXT: ret728;729; RV64I-LABEL: load_ba_2:730; RV64I: # %bb.0: # %entry731; RV64I-NEXT: .Ltmp1: # Block address taken732; RV64I-NEXT: # %bb.1: # %label733; RV64I-NEXT: lui a0, %hi(.Ltmp1+8)734; RV64I-NEXT: ld a0, %lo(.Ltmp1+8)(a0)735; RV64I-NEXT: ret736;737; RV64I-MEDIUM-LABEL: load_ba_2:738; RV64I-MEDIUM: # %bb.0: # %entry739; RV64I-MEDIUM-NEXT: .Ltmp1: # Block address taken740; RV64I-MEDIUM-NEXT: # %bb.1: # %label741; RV64I-MEDIUM-NEXT: .Lpcrel_hi13:742; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(.Ltmp1+8)743; RV64I-MEDIUM-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi13)(a0)744; RV64I-MEDIUM-NEXT: ret745;746; RV64I-LARGE-LABEL: load_ba_2:747; RV64I-LARGE: # %bb.0: # %entry748; RV64I-LARGE-NEXT: .Ltmp1: # Block address taken749; RV64I-LARGE-NEXT: # %bb.1: # %label750; RV64I-LARGE-NEXT: .Lpcrel_hi13:751; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.Ltmp1+8)752; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi13)(a0)753; RV64I-LARGE-NEXT: ret754entry:755 br label %label756label:757 %0 = load ptr, ptr getelementptr inbounds (i8, ptr blockaddress(@load_ba_2, %label), i32 8)758 ret ptr %0759}760 761; Check for folds in accesses to thread-local variables.762 763@tl_4 = dso_local thread_local global i64 0, align 4764@tl_8 = dso_local thread_local global i64 0, align 8765 766define dso_local i64 @load_tl_4() nounwind {767; RV32I-LABEL: load_tl_4:768; RV32I: # %bb.0: # %entry769; RV32I-NEXT: lui a0, %tprel_hi(tl_4)770; RV32I-NEXT: add a0, a0, tp, %tprel_add(tl_4)771; RV32I-NEXT: addi a1, a0, %tprel_lo(tl_4)772; RV32I-NEXT: lw a0, 0(a1)773; RV32I-NEXT: lw a1, 4(a1)774; RV32I-NEXT: ret775;776; RV32IXQCILI-LABEL: load_tl_4:777; RV32IXQCILI: # %bb.0: # %entry778; RV32IXQCILI-NEXT: lui a0, %tprel_hi(tl_4)779; RV32IXQCILI-NEXT: add a0, a0, tp, %tprel_add(tl_4)780; RV32IXQCILI-NEXT: addi a1, a0, %tprel_lo(tl_4)781; RV32IXQCILI-NEXT: lw a0, 0(a1)782; RV32IXQCILI-NEXT: lw a1, 4(a1)783; RV32IXQCILI-NEXT: ret784;785; RV32I-MEDIUM-LABEL: load_tl_4:786; RV32I-MEDIUM: # %bb.0: # %entry787; RV32I-MEDIUM-NEXT: lui a0, %tprel_hi(tl_4)788; RV32I-MEDIUM-NEXT: add a0, a0, tp, %tprel_add(tl_4)789; RV32I-MEDIUM-NEXT: addi a1, a0, %tprel_lo(tl_4)790; RV32I-MEDIUM-NEXT: lw a0, 0(a1)791; RV32I-MEDIUM-NEXT: lw a1, 4(a1)792; RV32I-MEDIUM-NEXT: ret793;794; RV64I-LABEL: load_tl_4:795; RV64I: # %bb.0: # %entry796; RV64I-NEXT: lui a0, %tprel_hi(tl_4)797; RV64I-NEXT: add a0, a0, tp, %tprel_add(tl_4)798; RV64I-NEXT: ld a0, %tprel_lo(tl_4)(a0)799; RV64I-NEXT: ret800;801; RV64I-MEDIUM-LABEL: load_tl_4:802; RV64I-MEDIUM: # %bb.0: # %entry803; RV64I-MEDIUM-NEXT: lui a0, %tprel_hi(tl_4)804; RV64I-MEDIUM-NEXT: add a0, a0, tp, %tprel_add(tl_4)805; RV64I-MEDIUM-NEXT: ld a0, %tprel_lo(tl_4)(a0)806; RV64I-MEDIUM-NEXT: ret807;808; RV64I-LARGE-LABEL: load_tl_4:809; RV64I-LARGE: # %bb.0: # %entry810; RV64I-LARGE-NEXT: lui a0, %tprel_hi(tl_4)811; RV64I-LARGE-NEXT: add a0, a0, tp, %tprel_add(tl_4)812; RV64I-LARGE-NEXT: ld a0, %tprel_lo(tl_4)(a0)813; RV64I-LARGE-NEXT: ret814entry:815 %0 = load i64, ptr @tl_4816 ret i64 %0817}818 819define dso_local i64 @load_tl_8() nounwind {820; RV32I-LABEL: load_tl_8:821; RV32I: # %bb.0: # %entry822; RV32I-NEXT: lui a0, %tprel_hi(tl_8)823; RV32I-NEXT: add a1, a0, tp, %tprel_add(tl_8)824; RV32I-NEXT: lw a0, %tprel_lo(tl_8)(a1)825; RV32I-NEXT: lw a1, %tprel_lo(tl_8+4)(a1)826; RV32I-NEXT: ret827;828; RV32IXQCILI-LABEL: load_tl_8:829; RV32IXQCILI: # %bb.0: # %entry830; RV32IXQCILI-NEXT: lui a0, %tprel_hi(tl_8)831; RV32IXQCILI-NEXT: add a1, a0, tp, %tprel_add(tl_8)832; RV32IXQCILI-NEXT: lw a0, %tprel_lo(tl_8)(a1)833; RV32IXQCILI-NEXT: lw a1, %tprel_lo(tl_8+4)(a1)834; RV32IXQCILI-NEXT: ret835;836; RV32I-MEDIUM-LABEL: load_tl_8:837; RV32I-MEDIUM: # %bb.0: # %entry838; RV32I-MEDIUM-NEXT: lui a0, %tprel_hi(tl_8)839; RV32I-MEDIUM-NEXT: add a1, a0, tp, %tprel_add(tl_8)840; RV32I-MEDIUM-NEXT: lw a0, %tprel_lo(tl_8)(a1)841; RV32I-MEDIUM-NEXT: lw a1, %tprel_lo(tl_8+4)(a1)842; RV32I-MEDIUM-NEXT: ret843;844; RV64I-LABEL: load_tl_8:845; RV64I: # %bb.0: # %entry846; RV64I-NEXT: lui a0, %tprel_hi(tl_8)847; RV64I-NEXT: add a0, a0, tp, %tprel_add(tl_8)848; RV64I-NEXT: ld a0, %tprel_lo(tl_8)(a0)849; RV64I-NEXT: ret850;851; RV64I-MEDIUM-LABEL: load_tl_8:852; RV64I-MEDIUM: # %bb.0: # %entry853; RV64I-MEDIUM-NEXT: lui a0, %tprel_hi(tl_8)854; RV64I-MEDIUM-NEXT: add a0, a0, tp, %tprel_add(tl_8)855; RV64I-MEDIUM-NEXT: ld a0, %tprel_lo(tl_8)(a0)856; RV64I-MEDIUM-NEXT: ret857;858; RV64I-LARGE-LABEL: load_tl_8:859; RV64I-LARGE: # %bb.0: # %entry860; RV64I-LARGE-NEXT: lui a0, %tprel_hi(tl_8)861; RV64I-LARGE-NEXT: add a0, a0, tp, %tprel_add(tl_8)862; RV64I-LARGE-NEXT: ld a0, %tprel_lo(tl_8)(a0)863; RV64I-LARGE-NEXT: ret864entry:865 %0 = load i64, ptr @tl_8866 ret i64 %0867}868 869define dso_local i64 @load_const_ok() nounwind {870; RV32I-LABEL: load_const_ok:871; RV32I: # %bb.0: # %entry872; RV32I-NEXT: lw a0, 2040(zero)873; RV32I-NEXT: lw a1, 2044(zero)874; RV32I-NEXT: ret875;876; RV32IXQCILI-LABEL: load_const_ok:877; RV32IXQCILI: # %bb.0: # %entry878; RV32IXQCILI-NEXT: lw a0, 2040(zero)879; RV32IXQCILI-NEXT: lw a1, 2044(zero)880; RV32IXQCILI-NEXT: ret881;882; RV32I-MEDIUM-LABEL: load_const_ok:883; RV32I-MEDIUM: # %bb.0: # %entry884; RV32I-MEDIUM-NEXT: lw a0, 2040(zero)885; RV32I-MEDIUM-NEXT: lw a1, 2044(zero)886; RV32I-MEDIUM-NEXT: ret887;888; RV64I-LABEL: load_const_ok:889; RV64I: # %bb.0: # %entry890; RV64I-NEXT: ld a0, 2040(zero)891; RV64I-NEXT: ret892;893; RV64I-MEDIUM-LABEL: load_const_ok:894; RV64I-MEDIUM: # %bb.0: # %entry895; RV64I-MEDIUM-NEXT: ld a0, 2040(zero)896; RV64I-MEDIUM-NEXT: ret897;898; RV64I-LARGE-LABEL: load_const_ok:899; RV64I-LARGE: # %bb.0: # %entry900; RV64I-LARGE-NEXT: ld a0, 2040(zero)901; RV64I-LARGE-NEXT: ret902entry:903 %0 = load i64, ptr inttoptr (i32 2040 to ptr)904 ret i64 %0905}906 907define dso_local i64 @load_cost_overflow() nounwind {908; RV32I-LABEL: load_cost_overflow:909; RV32I: # %bb.0: # %entry910; RV32I-NEXT: lui a0, 1911; RV32I-NEXT: lw a1, -2048(a0)912; RV32I-NEXT: lw a0, 2044(zero)913; RV32I-NEXT: ret914;915; RV32IXQCILI-LABEL: load_cost_overflow:916; RV32IXQCILI: # %bb.0: # %entry917; RV32IXQCILI-NEXT: lui a0, 1918; RV32IXQCILI-NEXT: lw a1, -2048(a0)919; RV32IXQCILI-NEXT: lw a0, 2044(zero)920; RV32IXQCILI-NEXT: ret921;922; RV32I-MEDIUM-LABEL: load_cost_overflow:923; RV32I-MEDIUM: # %bb.0: # %entry924; RV32I-MEDIUM-NEXT: lui a0, 1925; RV32I-MEDIUM-NEXT: lw a1, -2048(a0)926; RV32I-MEDIUM-NEXT: lw a0, 2044(zero)927; RV32I-MEDIUM-NEXT: ret928;929; RV64I-LABEL: load_cost_overflow:930; RV64I: # %bb.0: # %entry931; RV64I-NEXT: ld a0, 2044(zero)932; RV64I-NEXT: ret933;934; RV64I-MEDIUM-LABEL: load_cost_overflow:935; RV64I-MEDIUM: # %bb.0: # %entry936; RV64I-MEDIUM-NEXT: ld a0, 2044(zero)937; RV64I-MEDIUM-NEXT: ret938;939; RV64I-LARGE-LABEL: load_cost_overflow:940; RV64I-LARGE: # %bb.0: # %entry941; RV64I-LARGE-NEXT: ld a0, 2044(zero)942; RV64I-LARGE-NEXT: ret943entry:944 %0 = load i64, ptr inttoptr (i64 2044 to ptr)945 ret i64 %0946}947 948define dso_local i32 @load_const_medium() nounwind {949; RV32I-LABEL: load_const_medium:950; RV32I: # %bb.0: # %entry951; RV32I-NEXT: lui a0, 1952; RV32I-NEXT: lw a0, -16(a0)953; RV32I-NEXT: ret954;955; RV32IXQCILI-LABEL: load_const_medium:956; RV32IXQCILI: # %bb.0: # %entry957; RV32IXQCILI-NEXT: lui a0, 1958; RV32IXQCILI-NEXT: lw a0, -16(a0)959; RV32IXQCILI-NEXT: ret960;961; RV32I-MEDIUM-LABEL: load_const_medium:962; RV32I-MEDIUM: # %bb.0: # %entry963; RV32I-MEDIUM-NEXT: lui a0, 1964; RV32I-MEDIUM-NEXT: lw a0, -16(a0)965; RV32I-MEDIUM-NEXT: ret966;967; RV64I-LABEL: load_const_medium:968; RV64I: # %bb.0: # %entry969; RV64I-NEXT: lui a0, 1970; RV64I-NEXT: lw a0, -16(a0)971; RV64I-NEXT: ret972;973; RV64I-MEDIUM-LABEL: load_const_medium:974; RV64I-MEDIUM: # %bb.0: # %entry975; RV64I-MEDIUM-NEXT: lui a0, 1976; RV64I-MEDIUM-NEXT: lw a0, -16(a0)977; RV64I-MEDIUM-NEXT: ret978;979; RV64I-LARGE-LABEL: load_const_medium:980; RV64I-LARGE: # %bb.0: # %entry981; RV64I-LARGE-NEXT: lui a0, 1982; RV64I-LARGE-NEXT: lw a0, -16(a0)983; RV64I-LARGE-NEXT: ret984entry:985 %0 = load i32, ptr inttoptr (i64 4080 to ptr)986 ret i32 %0987}988 989; The constant here is 0x7ffff800, this value requires LUI+ADDIW on RV64,990; LUI+ADDI would produce a different constant so we can't fold into the load991; offset.992define dso_local i32 @load_const_large() nounwind {993; RV32I-LABEL: load_const_large:994; RV32I: # %bb.0: # %entry995; RV32I-NEXT: lui a0, 524288996; RV32I-NEXT: lw a0, -2048(a0)997; RV32I-NEXT: ret998;999; RV32IXQCILI-LABEL: load_const_large:1000; RV32IXQCILI: # %bb.0: # %entry1001; RV32IXQCILI-NEXT: lui a0, 5242881002; RV32IXQCILI-NEXT: lw a0, -2048(a0)1003; RV32IXQCILI-NEXT: ret1004;1005; RV32I-MEDIUM-LABEL: load_const_large:1006; RV32I-MEDIUM: # %bb.0: # %entry1007; RV32I-MEDIUM-NEXT: lui a0, 5242881008; RV32I-MEDIUM-NEXT: lw a0, -2048(a0)1009; RV32I-MEDIUM-NEXT: ret1010;1011; RV64I-LABEL: load_const_large:1012; RV64I: # %bb.0: # %entry1013; RV64I-NEXT: lui a0, 5242881014; RV64I-NEXT: addiw a0, a0, -20481015; RV64I-NEXT: lw a0, 0(a0)1016; RV64I-NEXT: ret1017;1018; RV64I-MEDIUM-LABEL: load_const_large:1019; RV64I-MEDIUM: # %bb.0: # %entry1020; RV64I-MEDIUM-NEXT: lui a0, 5242881021; RV64I-MEDIUM-NEXT: addiw a0, a0, -20481022; RV64I-MEDIUM-NEXT: lw a0, 0(a0)1023; RV64I-MEDIUM-NEXT: ret1024;1025; RV64I-LARGE-LABEL: load_const_large:1026; RV64I-LARGE: # %bb.0: # %entry1027; RV64I-LARGE-NEXT: lui a0, 5242881028; RV64I-LARGE-NEXT: addiw a0, a0, -20481029; RV64I-LARGE-NEXT: lw a0, 0(a0)1030; RV64I-LARGE-NEXT: ret1031entry:1032 %0 = load i32, ptr inttoptr (i64 2147481600 to ptr)1033 ret i32 %01034}1035 1036%struct.S = type { i64, i64 }1037 1038define i64 @fold_addi_from_different_bb(i64 %k, i64 %n, ptr %a) nounwind {1039; RV32I-LABEL: fold_addi_from_different_bb:1040; RV32I: # %bb.0: # %entry1041; RV32I-NEXT: addi sp, sp, -481042; RV32I-NEXT: sw ra, 44(sp) # 4-byte Folded Spill1043; RV32I-NEXT: sw s0, 40(sp) # 4-byte Folded Spill1044; RV32I-NEXT: sw s1, 36(sp) # 4-byte Folded Spill1045; RV32I-NEXT: sw s2, 32(sp) # 4-byte Folded Spill1046; RV32I-NEXT: sw s3, 28(sp) # 4-byte Folded Spill1047; RV32I-NEXT: sw s4, 24(sp) # 4-byte Folded Spill1048; RV32I-NEXT: sw s5, 20(sp) # 4-byte Folded Spill1049; RV32I-NEXT: sw s6, 16(sp) # 4-byte Folded Spill1050; RV32I-NEXT: sw s7, 12(sp) # 4-byte Folded Spill1051; RV32I-NEXT: mv s0, a41052; RV32I-NEXT: mv s1, a31053; RV32I-NEXT: mv s2, a21054; RV32I-NEXT: beqz a3, .LBB20_31055; RV32I-NEXT: # %bb.1: # %entry1056; RV32I-NEXT: srli a1, s1, 311057; RV32I-NEXT: beqz a1, .LBB20_41058; RV32I-NEXT: .LBB20_2:1059; RV32I-NEXT: li s3, 01060; RV32I-NEXT: li s4, 01061; RV32I-NEXT: j .LBB20_61062; RV32I-NEXT: .LBB20_3:1063; RV32I-NEXT: seqz a1, s21064; RV32I-NEXT: bnez a1, .LBB20_21065; RV32I-NEXT: .LBB20_4: # %for.body.lr.ph1066; RV32I-NEXT: li s5, 01067; RV32I-NEXT: li s6, 01068; RV32I-NEXT: li s3, 01069; RV32I-NEXT: li s4, 01070; RV32I-NEXT: slli a0, a0, 41071; RV32I-NEXT: add s7, s0, a01072; RV32I-NEXT: .LBB20_5: # %for.body1073; RV32I-NEXT: # =>This Inner Loop Header: Depth=11074; RV32I-NEXT: mv a0, s01075; RV32I-NEXT: call f1076; RV32I-NEXT: lw a0, 8(s7)1077; RV32I-NEXT: lw a1, 12(s7)1078; RV32I-NEXT: addi s5, s5, 11079; RV32I-NEXT: seqz a2, s51080; RV32I-NEXT: add s6, s6, a21081; RV32I-NEXT: xor a2, s5, s21082; RV32I-NEXT: add a1, a1, s41083; RV32I-NEXT: xor a3, s6, s11084; RV32I-NEXT: or a2, a2, a31085; RV32I-NEXT: add s3, a0, s31086; RV32I-NEXT: sltu s4, s3, a01087; RV32I-NEXT: add s4, a1, s41088; RV32I-NEXT: bnez a2, .LBB20_51089; RV32I-NEXT: .LBB20_6: # %for.cond.cleanup1090; RV32I-NEXT: mv a0, s31091; RV32I-NEXT: mv a1, s41092; RV32I-NEXT: lw ra, 44(sp) # 4-byte Folded Reload1093; RV32I-NEXT: lw s0, 40(sp) # 4-byte Folded Reload1094; RV32I-NEXT: lw s1, 36(sp) # 4-byte Folded Reload1095; RV32I-NEXT: lw s2, 32(sp) # 4-byte Folded Reload1096; RV32I-NEXT: lw s3, 28(sp) # 4-byte Folded Reload1097; RV32I-NEXT: lw s4, 24(sp) # 4-byte Folded Reload1098; RV32I-NEXT: lw s5, 20(sp) # 4-byte Folded Reload1099; RV32I-NEXT: lw s6, 16(sp) # 4-byte Folded Reload1100; RV32I-NEXT: lw s7, 12(sp) # 4-byte Folded Reload1101; RV32I-NEXT: addi sp, sp, 481102; RV32I-NEXT: ret1103;1104; RV32IXQCILI-LABEL: fold_addi_from_different_bb:1105; RV32IXQCILI: # %bb.0: # %entry1106; RV32IXQCILI-NEXT: addi sp, sp, -481107; RV32IXQCILI-NEXT: sw ra, 44(sp) # 4-byte Folded Spill1108; RV32IXQCILI-NEXT: sw s0, 40(sp) # 4-byte Folded Spill1109; RV32IXQCILI-NEXT: sw s1, 36(sp) # 4-byte Folded Spill1110; RV32IXQCILI-NEXT: sw s2, 32(sp) # 4-byte Folded Spill1111; RV32IXQCILI-NEXT: sw s3, 28(sp) # 4-byte Folded Spill1112; RV32IXQCILI-NEXT: sw s4, 24(sp) # 4-byte Folded Spill1113; RV32IXQCILI-NEXT: sw s5, 20(sp) # 4-byte Folded Spill1114; RV32IXQCILI-NEXT: sw s6, 16(sp) # 4-byte Folded Spill1115; RV32IXQCILI-NEXT: sw s7, 12(sp) # 4-byte Folded Spill1116; RV32IXQCILI-NEXT: mv s2, a41117; RV32IXQCILI-NEXT: mv s4, a31118; RV32IXQCILI-NEXT: mv s3, a21119; RV32IXQCILI-NEXT: beqz a3, .LBB20_31120; RV32IXQCILI-NEXT: # %bb.1: # %entry1121; RV32IXQCILI-NEXT: srli a1, s4, 311122; RV32IXQCILI-NEXT: beqz a1, .LBB20_41123; RV32IXQCILI-NEXT: .LBB20_2:1124; RV32IXQCILI-NEXT: li s6, 01125; RV32IXQCILI-NEXT: li s5, 01126; RV32IXQCILI-NEXT: j .LBB20_61127; RV32IXQCILI-NEXT: .LBB20_3:1128; RV32IXQCILI-NEXT: seqz a1, s31129; RV32IXQCILI-NEXT: bnez a1, .LBB20_21130; RV32IXQCILI-NEXT: .LBB20_4: # %for.body.lr.ph1131; RV32IXQCILI-NEXT: li s1, 01132; RV32IXQCILI-NEXT: li s0, 01133; RV32IXQCILI-NEXT: li s6, 01134; RV32IXQCILI-NEXT: li s5, 01135; RV32IXQCILI-NEXT: slli a0, a0, 41136; RV32IXQCILI-NEXT: add s7, s2, a01137; RV32IXQCILI-NEXT: .LBB20_5: # %for.body1138; RV32IXQCILI-NEXT: # =>This Inner Loop Header: Depth=11139; RV32IXQCILI-NEXT: mv a0, s21140; RV32IXQCILI-NEXT: call f1141; RV32IXQCILI-NEXT: lw a0, 8(s7)1142; RV32IXQCILI-NEXT: lw a1, 12(s7)1143; RV32IXQCILI-NEXT: addi s1, s1, 11144; RV32IXQCILI-NEXT: seqz a2, s11145; RV32IXQCILI-NEXT: add s0, s0, a21146; RV32IXQCILI-NEXT: xor a2, s1, s31147; RV32IXQCILI-NEXT: add a1, a1, s51148; RV32IXQCILI-NEXT: xor a3, s0, s41149; RV32IXQCILI-NEXT: or a2, a2, a31150; RV32IXQCILI-NEXT: add s6, s6, a01151; RV32IXQCILI-NEXT: sltu s5, s6, a01152; RV32IXQCILI-NEXT: add s5, s5, a11153; RV32IXQCILI-NEXT: bnez a2, .LBB20_51154; RV32IXQCILI-NEXT: .LBB20_6: # %for.cond.cleanup1155; RV32IXQCILI-NEXT: mv a0, s61156; RV32IXQCILI-NEXT: mv a1, s51157; RV32IXQCILI-NEXT: lw ra, 44(sp) # 4-byte Folded Reload1158; RV32IXQCILI-NEXT: lw s0, 40(sp) # 4-byte Folded Reload1159; RV32IXQCILI-NEXT: lw s1, 36(sp) # 4-byte Folded Reload1160; RV32IXQCILI-NEXT: lw s2, 32(sp) # 4-byte Folded Reload1161; RV32IXQCILI-NEXT: lw s3, 28(sp) # 4-byte Folded Reload1162; RV32IXQCILI-NEXT: lw s4, 24(sp) # 4-byte Folded Reload1163; RV32IXQCILI-NEXT: lw s5, 20(sp) # 4-byte Folded Reload1164; RV32IXQCILI-NEXT: lw s6, 16(sp) # 4-byte Folded Reload1165; RV32IXQCILI-NEXT: lw s7, 12(sp) # 4-byte Folded Reload1166; RV32IXQCILI-NEXT: addi sp, sp, 481167; RV32IXQCILI-NEXT: ret1168;1169; RV32I-MEDIUM-LABEL: fold_addi_from_different_bb:1170; RV32I-MEDIUM: # %bb.0: # %entry1171; RV32I-MEDIUM-NEXT: addi sp, sp, -481172; RV32I-MEDIUM-NEXT: sw ra, 44(sp) # 4-byte Folded Spill1173; RV32I-MEDIUM-NEXT: sw s0, 40(sp) # 4-byte Folded Spill1174; RV32I-MEDIUM-NEXT: sw s1, 36(sp) # 4-byte Folded Spill1175; RV32I-MEDIUM-NEXT: sw s2, 32(sp) # 4-byte Folded Spill1176; RV32I-MEDIUM-NEXT: sw s3, 28(sp) # 4-byte Folded Spill1177; RV32I-MEDIUM-NEXT: sw s4, 24(sp) # 4-byte Folded Spill1178; RV32I-MEDIUM-NEXT: sw s5, 20(sp) # 4-byte Folded Spill1179; RV32I-MEDIUM-NEXT: sw s6, 16(sp) # 4-byte Folded Spill1180; RV32I-MEDIUM-NEXT: sw s7, 12(sp) # 4-byte Folded Spill1181; RV32I-MEDIUM-NEXT: mv s0, a41182; RV32I-MEDIUM-NEXT: mv s1, a31183; RV32I-MEDIUM-NEXT: mv s2, a21184; RV32I-MEDIUM-NEXT: beqz a3, .LBB20_31185; RV32I-MEDIUM-NEXT: # %bb.1: # %entry1186; RV32I-MEDIUM-NEXT: srli a1, s1, 311187; RV32I-MEDIUM-NEXT: beqz a1, .LBB20_41188; RV32I-MEDIUM-NEXT: .LBB20_2:1189; RV32I-MEDIUM-NEXT: li s3, 01190; RV32I-MEDIUM-NEXT: li s4, 01191; RV32I-MEDIUM-NEXT: j .LBB20_61192; RV32I-MEDIUM-NEXT: .LBB20_3:1193; RV32I-MEDIUM-NEXT: seqz a1, s21194; RV32I-MEDIUM-NEXT: bnez a1, .LBB20_21195; RV32I-MEDIUM-NEXT: .LBB20_4: # %for.body.lr.ph1196; RV32I-MEDIUM-NEXT: li s5, 01197; RV32I-MEDIUM-NEXT: li s6, 01198; RV32I-MEDIUM-NEXT: li s3, 01199; RV32I-MEDIUM-NEXT: li s4, 01200; RV32I-MEDIUM-NEXT: slli a0, a0, 41201; RV32I-MEDIUM-NEXT: add s7, s0, a01202; RV32I-MEDIUM-NEXT: .LBB20_5: # %for.body1203; RV32I-MEDIUM-NEXT: # =>This Inner Loop Header: Depth=11204; RV32I-MEDIUM-NEXT: mv a0, s01205; RV32I-MEDIUM-NEXT: call f1206; RV32I-MEDIUM-NEXT: lw a0, 8(s7)1207; RV32I-MEDIUM-NEXT: lw a1, 12(s7)1208; RV32I-MEDIUM-NEXT: addi s5, s5, 11209; RV32I-MEDIUM-NEXT: seqz a2, s51210; RV32I-MEDIUM-NEXT: add s6, s6, a21211; RV32I-MEDIUM-NEXT: xor a2, s5, s21212; RV32I-MEDIUM-NEXT: add a1, a1, s41213; RV32I-MEDIUM-NEXT: xor a3, s6, s11214; RV32I-MEDIUM-NEXT: or a2, a2, a31215; RV32I-MEDIUM-NEXT: add s3, a0, s31216; RV32I-MEDIUM-NEXT: sltu s4, s3, a01217; RV32I-MEDIUM-NEXT: add s4, a1, s41218; RV32I-MEDIUM-NEXT: bnez a2, .LBB20_51219; RV32I-MEDIUM-NEXT: .LBB20_6: # %for.cond.cleanup1220; RV32I-MEDIUM-NEXT: mv a0, s31221; RV32I-MEDIUM-NEXT: mv a1, s41222; RV32I-MEDIUM-NEXT: lw ra, 44(sp) # 4-byte Folded Reload1223; RV32I-MEDIUM-NEXT: lw s0, 40(sp) # 4-byte Folded Reload1224; RV32I-MEDIUM-NEXT: lw s1, 36(sp) # 4-byte Folded Reload1225; RV32I-MEDIUM-NEXT: lw s2, 32(sp) # 4-byte Folded Reload1226; RV32I-MEDIUM-NEXT: lw s3, 28(sp) # 4-byte Folded Reload1227; RV32I-MEDIUM-NEXT: lw s4, 24(sp) # 4-byte Folded Reload1228; RV32I-MEDIUM-NEXT: lw s5, 20(sp) # 4-byte Folded Reload1229; RV32I-MEDIUM-NEXT: lw s6, 16(sp) # 4-byte Folded Reload1230; RV32I-MEDIUM-NEXT: lw s7, 12(sp) # 4-byte Folded Reload1231; RV32I-MEDIUM-NEXT: addi sp, sp, 481232; RV32I-MEDIUM-NEXT: ret1233;1234; RV64I-LABEL: fold_addi_from_different_bb:1235; RV64I: # %bb.0: # %entry1236; RV64I-NEXT: addi sp, sp, -481237; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1238; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1239; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1240; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill1241; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill1242; RV64I-NEXT: blez a1, .LBB20_31243; RV64I-NEXT: # %bb.1: # %for.body.lr.ph1244; RV64I-NEXT: mv s0, a21245; RV64I-NEXT: mv s1, a11246; RV64I-NEXT: li s2, 01247; RV64I-NEXT: slli a0, a0, 41248; RV64I-NEXT: add s3, a2, a01249; RV64I-NEXT: .LBB20_2: # %for.body1250; RV64I-NEXT: # =>This Inner Loop Header: Depth=11251; RV64I-NEXT: mv a0, s01252; RV64I-NEXT: call f1253; RV64I-NEXT: ld a0, 8(s3)1254; RV64I-NEXT: addi s1, s1, -11255; RV64I-NEXT: add s2, a0, s21256; RV64I-NEXT: bnez s1, .LBB20_21257; RV64I-NEXT: j .LBB20_41258; RV64I-NEXT: .LBB20_3:1259; RV64I-NEXT: li s2, 01260; RV64I-NEXT: .LBB20_4: # %for.cond.cleanup1261; RV64I-NEXT: mv a0, s21262; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1263; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1264; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1265; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload1266; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload1267; RV64I-NEXT: addi sp, sp, 481268; RV64I-NEXT: ret1269;1270; RV64I-MEDIUM-LABEL: fold_addi_from_different_bb:1271; RV64I-MEDIUM: # %bb.0: # %entry1272; RV64I-MEDIUM-NEXT: addi sp, sp, -481273; RV64I-MEDIUM-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1274; RV64I-MEDIUM-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1275; RV64I-MEDIUM-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1276; RV64I-MEDIUM-NEXT: sd s2, 16(sp) # 8-byte Folded Spill1277; RV64I-MEDIUM-NEXT: sd s3, 8(sp) # 8-byte Folded Spill1278; RV64I-MEDIUM-NEXT: blez a1, .LBB20_31279; RV64I-MEDIUM-NEXT: # %bb.1: # %for.body.lr.ph1280; RV64I-MEDIUM-NEXT: mv s0, a21281; RV64I-MEDIUM-NEXT: mv s1, a11282; RV64I-MEDIUM-NEXT: li s2, 01283; RV64I-MEDIUM-NEXT: slli a0, a0, 41284; RV64I-MEDIUM-NEXT: add s3, a2, a01285; RV64I-MEDIUM-NEXT: .LBB20_2: # %for.body1286; RV64I-MEDIUM-NEXT: # =>This Inner Loop Header: Depth=11287; RV64I-MEDIUM-NEXT: mv a0, s01288; RV64I-MEDIUM-NEXT: call f1289; RV64I-MEDIUM-NEXT: ld a0, 8(s3)1290; RV64I-MEDIUM-NEXT: addi s1, s1, -11291; RV64I-MEDIUM-NEXT: add s2, a0, s21292; RV64I-MEDIUM-NEXT: bnez s1, .LBB20_21293; RV64I-MEDIUM-NEXT: j .LBB20_41294; RV64I-MEDIUM-NEXT: .LBB20_3:1295; RV64I-MEDIUM-NEXT: li s2, 01296; RV64I-MEDIUM-NEXT: .LBB20_4: # %for.cond.cleanup1297; RV64I-MEDIUM-NEXT: mv a0, s21298; RV64I-MEDIUM-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1299; RV64I-MEDIUM-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1300; RV64I-MEDIUM-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1301; RV64I-MEDIUM-NEXT: ld s2, 16(sp) # 8-byte Folded Reload1302; RV64I-MEDIUM-NEXT: ld s3, 8(sp) # 8-byte Folded Reload1303; RV64I-MEDIUM-NEXT: addi sp, sp, 481304; RV64I-MEDIUM-NEXT: ret1305;1306; RV64I-LARGE-LABEL: fold_addi_from_different_bb:1307; RV64I-LARGE: # %bb.0: # %entry1308; RV64I-LARGE-NEXT: addi sp, sp, -481309; RV64I-LARGE-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1310; RV64I-LARGE-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1311; RV64I-LARGE-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1312; RV64I-LARGE-NEXT: sd s2, 16(sp) # 8-byte Folded Spill1313; RV64I-LARGE-NEXT: sd s3, 8(sp) # 8-byte Folded Spill1314; RV64I-LARGE-NEXT: sd s4, 0(sp) # 8-byte Folded Spill1315; RV64I-LARGE-NEXT: blez a1, .LBB20_31316; RV64I-LARGE-NEXT: # %bb.1: # %for.body.lr.ph1317; RV64I-LARGE-NEXT: mv s0, a21318; RV64I-LARGE-NEXT: mv s1, a11319; RV64I-LARGE-NEXT: li s2, 01320; RV64I-LARGE-NEXT: .Lpcrel_hi14:1321; RV64I-LARGE-NEXT: auipc a1, %pcrel_hi(.LCPI20_0)1322; RV64I-LARGE-NEXT: ld s3, %pcrel_lo(.Lpcrel_hi14)(a1)1323; RV64I-LARGE-NEXT: slli a0, a0, 41324; RV64I-LARGE-NEXT: add s4, a2, a01325; RV64I-LARGE-NEXT: .LBB20_2: # %for.body1326; RV64I-LARGE-NEXT: # =>This Inner Loop Header: Depth=11327; RV64I-LARGE-NEXT: mv a0, s01328; RV64I-LARGE-NEXT: jalr s31329; RV64I-LARGE-NEXT: ld a0, 8(s4)1330; RV64I-LARGE-NEXT: addi s1, s1, -11331; RV64I-LARGE-NEXT: add s2, a0, s21332; RV64I-LARGE-NEXT: bnez s1, .LBB20_21333; RV64I-LARGE-NEXT: j .LBB20_41334; RV64I-LARGE-NEXT: .LBB20_3:1335; RV64I-LARGE-NEXT: li s2, 01336; RV64I-LARGE-NEXT: .LBB20_4: # %for.cond.cleanup1337; RV64I-LARGE-NEXT: mv a0, s21338; RV64I-LARGE-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1339; RV64I-LARGE-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1340; RV64I-LARGE-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1341; RV64I-LARGE-NEXT: ld s2, 16(sp) # 8-byte Folded Reload1342; RV64I-LARGE-NEXT: ld s3, 8(sp) # 8-byte Folded Reload1343; RV64I-LARGE-NEXT: ld s4, 0(sp) # 8-byte Folded Reload1344; RV64I-LARGE-NEXT: addi sp, sp, 481345; RV64I-LARGE-NEXT: ret1346entry:1347 %cmp4 = icmp sgt i64 %n, 01348 br i1 %cmp4, label %for.body.lr.ph, label %for.cond.cleanup1349 1350for.body.lr.ph: ; preds = %entry1351 %y = getelementptr inbounds %struct.S, ptr %a, i64 %k, i32 11352 br label %for.body1353 1354for.cond.cleanup: ; preds = %for.body, %entry1355 %s.0.lcssa = phi i64 [ 0, %entry ], [ %add, %for.body ]1356 ret i64 %s.0.lcssa1357 1358for.body: ; preds = %for.body.lr.ph, %for.body1359 %i.06 = phi i64 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]1360 %s.05 = phi i64 [ 0, %for.body.lr.ph ], [ %add, %for.body ]1361 call void @f(ptr %a)1362 %0 = load i64, ptr %y, align 81363 %add = add nsw i64 %0, %s.051364 %inc = add nuw nsw i64 %i.06, 11365 %exitcond.not = icmp eq i64 %inc, %n1366 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body1367}1368 1369declare void @f(ptr)1370 1371@g = external dso_local global [100 x [100 x i8]]1372 1373; This test used to crash due to calling getVRegDef on X0.1374define i32 @crash() {1375; RV32I-LABEL: crash:1376; RV32I: # %bb.0: # %entry1377; RV32I-NEXT: lui a0, %hi(g+401)1378; RV32I-NEXT: lbu a0, %lo(g+401)(a0)1379; RV32I-NEXT: seqz a0, a01380; RV32I-NEXT: sw a0, 0(zero)1381; RV32I-NEXT: li a0, 01382; RV32I-NEXT: ret1383;1384; RV32IXQCILI-LABEL: crash:1385; RV32IXQCILI: # %bb.0: # %entry1386; RV32IXQCILI-NEXT: li a0, 11387; RV32IXQCILI-NEXT: qc.e.li a1, g1388; RV32IXQCILI-NEXT: add a0, a0, a11389; RV32IXQCILI-NEXT: lbu a0, 400(a0)1390; RV32IXQCILI-NEXT: seqz a0, a01391; RV32IXQCILI-NEXT: sw a0, 0(zero)1392; RV32IXQCILI-NEXT: li a0, 01393; RV32IXQCILI-NEXT: ret1394;1395; RV32I-MEDIUM-LABEL: crash:1396; RV32I-MEDIUM: # %bb.0: # %entry1397; RV32I-MEDIUM-NEXT: .Lpcrel_hi14:1398; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g+401)1399; RV32I-MEDIUM-NEXT: lbu a0, %pcrel_lo(.Lpcrel_hi14)(a0)1400; RV32I-MEDIUM-NEXT: seqz a0, a01401; RV32I-MEDIUM-NEXT: sw a0, 0(zero)1402; RV32I-MEDIUM-NEXT: li a0, 01403; RV32I-MEDIUM-NEXT: ret1404;1405; RV64I-LABEL: crash:1406; RV64I: # %bb.0: # %entry1407; RV64I-NEXT: lui a0, %hi(g+401)1408; RV64I-NEXT: lbu a0, %lo(g+401)(a0)1409; RV64I-NEXT: seqz a0, a01410; RV64I-NEXT: sw a0, 0(zero)1411; RV64I-NEXT: li a0, 01412; RV64I-NEXT: ret1413;1414; RV64I-MEDIUM-LABEL: crash:1415; RV64I-MEDIUM: # %bb.0: # %entry1416; RV64I-MEDIUM-NEXT: .Lpcrel_hi14:1417; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(g+401)1418; RV64I-MEDIUM-NEXT: lbu a0, %pcrel_lo(.Lpcrel_hi14)(a0)1419; RV64I-MEDIUM-NEXT: seqz a0, a01420; RV64I-MEDIUM-NEXT: sw a0, 0(zero)1421; RV64I-MEDIUM-NEXT: li a0, 01422; RV64I-MEDIUM-NEXT: ret1423;1424; RV64I-LARGE-LABEL: crash:1425; RV64I-LARGE: # %bb.0: # %entry1426; RV64I-LARGE-NEXT: li a0, 11427; RV64I-LARGE-NEXT: .Lpcrel_hi15:1428; RV64I-LARGE-NEXT: auipc a1, %pcrel_hi(.LCPI21_0)1429; RV64I-LARGE-NEXT: ld a1, %pcrel_lo(.Lpcrel_hi15)(a1)1430; RV64I-LARGE-NEXT: add a0, a1, a01431; RV64I-LARGE-NEXT: lbu a0, 400(a0)1432; RV64I-LARGE-NEXT: seqz a0, a01433; RV64I-LARGE-NEXT: sw a0, 0(zero)1434; RV64I-LARGE-NEXT: li a0, 01435; RV64I-LARGE-NEXT: ret1436entry:1437 %idxprom7.peel = sext i32 1 to i641438 br label %for.inc.peel1439 1440for.inc.peel: ; preds = %entry1441 %arrayidx8.3.peel = getelementptr [100 x [100 x i8]], ptr @g, i64 0, i64 4, i64 %idxprom7.peel1442 %0 = load i8, ptr %arrayidx8.3.peel, align 11443 %tobool.not.3.peel = icmp eq i8 %0, 01444 %spec.select = select i1 %tobool.not.3.peel, i32 1, i32 01445 store i32 %spec.select, ptr null, align 41446 ret i32 01447}1448 1449@ki_end = external dso_local global [0 x i8], align 11450 1451define i1 @pr134525() nounwind {1452; RV32I-LABEL: pr134525:1453; RV32I: # %bb.0: # %entry1454; RV32I-NEXT: lui a0, %hi(ki_end)1455; RV32I-NEXT: addi a0, a0, %lo(ki_end)1456; RV32I-NEXT: lui a1, 5237761457; RV32I-NEXT: lui a2, 321458; RV32I-NEXT: add a1, a0, a11459; RV32I-NEXT: addi a2, a2, 11460; RV32I-NEXT: sltu a2, a1, a21461; RV32I-NEXT: sltu a0, a1, a01462; RV32I-NEXT: not a0, a01463; RV32I-NEXT: and a0, a0, a21464; RV32I-NEXT: ret1465;1466; RV32IXQCILI-LABEL: pr134525:1467; RV32IXQCILI: # %bb.0: # %entry1468; RV32IXQCILI-NEXT: qc.e.li a0, ki_end1469; RV32IXQCILI-NEXT: lui a1, 5237761470; RV32IXQCILI-NEXT: qc.li a2, 1310731471; RV32IXQCILI-NEXT: add a1, a1, a01472; RV32IXQCILI-NEXT: sltu a2, a1, a21473; RV32IXQCILI-NEXT: sltu a0, a1, a01474; RV32IXQCILI-NEXT: not a0, a01475; RV32IXQCILI-NEXT: and a0, a0, a21476; RV32IXQCILI-NEXT: ret1477;1478; RV32I-MEDIUM-LABEL: pr134525:1479; RV32I-MEDIUM: # %bb.0: # %entry1480; RV32I-MEDIUM-NEXT: .Lpcrel_hi15:1481; RV32I-MEDIUM-NEXT: auipc a0, %pcrel_hi(ki_end)1482; RV32I-MEDIUM-NEXT: lui a1, 5237761483; RV32I-MEDIUM-NEXT: lui a2, 321484; RV32I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi15)1485; RV32I-MEDIUM-NEXT: addi a2, a2, 11486; RV32I-MEDIUM-NEXT: add a1, a0, a11487; RV32I-MEDIUM-NEXT: sltu a2, a1, a21488; RV32I-MEDIUM-NEXT: sltu a0, a1, a01489; RV32I-MEDIUM-NEXT: not a0, a01490; RV32I-MEDIUM-NEXT: and a0, a0, a21491; RV32I-MEDIUM-NEXT: ret1492;1493; RV64I-LABEL: pr134525:1494; RV64I: # %bb.0: # %entry1495; RV64I-NEXT: lui a0, %hi(ki_end+2145386496)1496; RV64I-NEXT: addi a0, a0, %lo(ki_end+2145386496)1497; RV64I-NEXT: lui a1, 321498; RV64I-NEXT: addi a1, a1, 11499; RV64I-NEXT: sltu a0, a0, a11500; RV64I-NEXT: ret1501;1502; RV64I-MEDIUM-LABEL: pr134525:1503; RV64I-MEDIUM: # %bb.0: # %entry1504; RV64I-MEDIUM-NEXT: .Lpcrel_hi15:1505; RV64I-MEDIUM-NEXT: auipc a0, %pcrel_hi(ki_end)1506; RV64I-MEDIUM-NEXT: lui a1, 5237761507; RV64I-MEDIUM-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi15)1508; RV64I-MEDIUM-NEXT: add a0, a0, a11509; RV64I-MEDIUM-NEXT: lui a1, 321510; RV64I-MEDIUM-NEXT: addi a1, a1, 11511; RV64I-MEDIUM-NEXT: sltu a0, a0, a11512; RV64I-MEDIUM-NEXT: ret1513;1514; RV64I-LARGE-LABEL: pr134525:1515; RV64I-LARGE: # %bb.0: # %entry1516; RV64I-LARGE-NEXT: .Lpcrel_hi16:1517; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI22_0)1518; RV64I-LARGE-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi16)(a0)1519; RV64I-LARGE-NEXT: lui a1, 5237761520; RV64I-LARGE-NEXT: add a0, a0, a11521; RV64I-LARGE-NEXT: lui a1, 321522; RV64I-LARGE-NEXT: addi a1, a1, 11523; RV64I-LARGE-NEXT: sltu a0, a0, a11524; RV64I-LARGE-NEXT: ret1525entry:1526 %cmp = icmp ult i64 sub (i64 ptrtoint (ptr @ki_end to i64), i64 -2145386496), 1310731527 ret i1 %cmp1528}1529