733 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 | FileCheck %s --check-prefixes=CHECK,RV32I3; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 | FileCheck %s --check-prefixes=CHECK,RV64I4; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zba | FileCheck %s --check-prefixes=ZBA,RV32ZBA5; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zba | FileCheck %s --check-prefixes=ZBA,RV64ZBA6 7define i64 @test_sh3add(ptr %p, iXLen %x, iXLen %y) {8; RV32I-LABEL: test_sh3add:9; RV32I: # %bb.0: # %entry10; RV32I-NEXT: slli a1, a1, 311; RV32I-NEXT: slli a2, a2, 312; RV32I-NEXT: add a1, a1, a013; RV32I-NEXT: add a0, a0, a214; RV32I-NEXT: lw a2, 480(a1)15; RV32I-NEXT: lw a1, 484(a1)16; RV32I-NEXT: lw a3, 404(a0)17; RV32I-NEXT: lw a4, 400(a0)18; RV32I-NEXT: add a1, a3, a119; RV32I-NEXT: add a0, a4, a220; RV32I-NEXT: sltu a2, a0, a421; RV32I-NEXT: add a1, a1, a222; RV32I-NEXT: ret23;24; RV64I-LABEL: test_sh3add:25; RV64I: # %bb.0: # %entry26; RV64I-NEXT: slli a1, a1, 327; RV64I-NEXT: slli a2, a2, 328; RV64I-NEXT: add a1, a1, a029; RV64I-NEXT: add a0, a0, a230; RV64I-NEXT: ld a1, 480(a1)31; RV64I-NEXT: ld a0, 400(a0)32; RV64I-NEXT: add a0, a0, a133; RV64I-NEXT: ret34;35; RV32ZBA-LABEL: test_sh3add:36; RV32ZBA: # %bb.0: # %entry37; RV32ZBA-NEXT: sh3add a1, a1, a038; RV32ZBA-NEXT: sh3add a0, a2, a039; RV32ZBA-NEXT: lw a2, 480(a1)40; RV32ZBA-NEXT: lw a1, 484(a1)41; RV32ZBA-NEXT: lw a3, 404(a0)42; RV32ZBA-NEXT: lw a4, 400(a0)43; RV32ZBA-NEXT: add a1, a3, a144; RV32ZBA-NEXT: add a0, a4, a245; RV32ZBA-NEXT: sltu a2, a0, a446; RV32ZBA-NEXT: add a1, a1, a247; RV32ZBA-NEXT: ret48;49; RV64ZBA-LABEL: test_sh3add:50; RV64ZBA: # %bb.0: # %entry51; RV64ZBA-NEXT: sh3add a1, a1, a052; RV64ZBA-NEXT: sh3add a0, a2, a053; RV64ZBA-NEXT: ld a1, 480(a1)54; RV64ZBA-NEXT: ld a0, 400(a0)55; RV64ZBA-NEXT: add a0, a0, a156; RV64ZBA-NEXT: ret57entry:58 %b = getelementptr inbounds nuw i8, ptr %p, i64 40059 %add = add iXLen %x, 1060 %arrayidx = getelementptr inbounds nuw [100 x i64], ptr %b, i64 0, iXLen %add61 %0 = load i64, ptr %arrayidx, align 862 %arrayidx2 = getelementptr inbounds nuw [100 x i64], ptr %b, i64 0, iXLen %y63 %1 = load i64, ptr %arrayidx2, align 864 %add3 = add nsw i64 %1, %065 ret i64 %add366}67 68define signext i32 @test_sh2add(ptr %p, iXLen %x, iXLen %y) {69; RV32I-LABEL: test_sh2add:70; RV32I: # %bb.0: # %entry71; RV32I-NEXT: slli a1, a1, 272; RV32I-NEXT: slli a2, a2, 273; RV32I-NEXT: add a1, a0, a174; RV32I-NEXT: add a0, a2, a075; RV32I-NEXT: lw a1, 1200(a1)76; RV32I-NEXT: lw a0, 1240(a0)77; RV32I-NEXT: add a0, a0, a178; RV32I-NEXT: ret79;80; RV64I-LABEL: test_sh2add:81; RV64I: # %bb.0: # %entry82; RV64I-NEXT: slli a1, a1, 283; RV64I-NEXT: slli a2, a2, 284; RV64I-NEXT: add a1, a0, a185; RV64I-NEXT: add a0, a2, a086; RV64I-NEXT: lw a1, 1200(a1)87; RV64I-NEXT: lw a0, 1240(a0)88; RV64I-NEXT: addw a0, a0, a189; RV64I-NEXT: ret90;91; RV32ZBA-LABEL: test_sh2add:92; RV32ZBA: # %bb.0: # %entry93; RV32ZBA-NEXT: sh2add a1, a1, a094; RV32ZBA-NEXT: sh2add a0, a2, a095; RV32ZBA-NEXT: lw a1, 1200(a1)96; RV32ZBA-NEXT: lw a0, 1240(a0)97; RV32ZBA-NEXT: add a0, a0, a198; RV32ZBA-NEXT: ret99;100; RV64ZBA-LABEL: test_sh2add:101; RV64ZBA: # %bb.0: # %entry102; RV64ZBA-NEXT: sh2add a1, a1, a0103; RV64ZBA-NEXT: sh2add a0, a2, a0104; RV64ZBA-NEXT: lw a1, 1200(a1)105; RV64ZBA-NEXT: lw a0, 1240(a0)106; RV64ZBA-NEXT: addw a0, a0, a1107; RV64ZBA-NEXT: ret108entry:109 %c = getelementptr inbounds nuw i8, ptr %p, i64 1200110 %arrayidx = getelementptr inbounds nuw [100 x i32], ptr %c, i64 0, iXLen %x111 %0 = load i32, ptr %arrayidx, align 4112 %add = add iXLen %y, 10113 %arrayidx2 = getelementptr inbounds nuw [100 x i32], ptr %c, i64 0, iXLen %add114 %1 = load i32, ptr %arrayidx2, align 4115 %add3 = add nsw i32 %1, %0116 ret i32 %add3117}118 119define signext i16 @test_sh1add(ptr %p, iXLen %x, iXLen %y) {120; RV32I-LABEL: test_sh1add:121; RV32I: # %bb.0: # %entry122; RV32I-NEXT: slli a1, a1, 1123; RV32I-NEXT: slli a2, a2, 1124; RV32I-NEXT: add a1, a0, a1125; RV32I-NEXT: add a0, a2, a0126; RV32I-NEXT: lh a1, 1600(a1)127; RV32I-NEXT: lh a0, 1620(a0)128; RV32I-NEXT: add a0, a0, a1129; RV32I-NEXT: slli a0, a0, 16130; RV32I-NEXT: srai a0, a0, 16131; RV32I-NEXT: ret132;133; RV64I-LABEL: test_sh1add:134; RV64I: # %bb.0: # %entry135; RV64I-NEXT: slli a1, a1, 1136; RV64I-NEXT: slli a2, a2, 1137; RV64I-NEXT: add a1, a0, a1138; RV64I-NEXT: add a0, a2, a0139; RV64I-NEXT: lh a1, 1600(a1)140; RV64I-NEXT: lh a0, 1620(a0)141; RV64I-NEXT: add a0, a0, a1142; RV64I-NEXT: slli a0, a0, 48143; RV64I-NEXT: srai a0, a0, 48144; RV64I-NEXT: ret145;146; RV32ZBA-LABEL: test_sh1add:147; RV32ZBA: # %bb.0: # %entry148; RV32ZBA-NEXT: sh1add a1, a1, a0149; RV32ZBA-NEXT: sh1add a0, a2, a0150; RV32ZBA-NEXT: lh a1, 1600(a1)151; RV32ZBA-NEXT: lh a0, 1620(a0)152; RV32ZBA-NEXT: add a0, a0, a1153; RV32ZBA-NEXT: slli a0, a0, 16154; RV32ZBA-NEXT: srai a0, a0, 16155; RV32ZBA-NEXT: ret156;157; RV64ZBA-LABEL: test_sh1add:158; RV64ZBA: # %bb.0: # %entry159; RV64ZBA-NEXT: sh1add a1, a1, a0160; RV64ZBA-NEXT: sh1add a0, a2, a0161; RV64ZBA-NEXT: lh a1, 1600(a1)162; RV64ZBA-NEXT: lh a0, 1620(a0)163; RV64ZBA-NEXT: add a0, a0, a1164; RV64ZBA-NEXT: slli a0, a0, 48165; RV64ZBA-NEXT: srai a0, a0, 48166; RV64ZBA-NEXT: ret167entry:168 %d = getelementptr inbounds nuw i8, ptr %p, i64 1600169 %arrayidx = getelementptr inbounds nuw [100 x i16], ptr %d, i64 0, iXLen %x170 %0 = load i16, ptr %arrayidx, align 2171 %add = add iXLen %y, 10172 %arrayidx2 = getelementptr inbounds nuw [100 x i16], ptr %d, i64 0, iXLen %add173 %1 = load i16, ptr %arrayidx2, align 2174 %add4 = add i16 %1, %0175 ret i16 %add4176}177 178define zeroext i8 @test_add(ptr %p, iXLen %x, iXLen %y) {179; CHECK-LABEL: test_add:180; CHECK: # %bb.0: # %entry181; CHECK-NEXT: add a1, a0, a1182; CHECK-NEXT: add a0, a2, a0183; CHECK-NEXT: lbu a1, 1800(a1)184; CHECK-NEXT: lbu a0, 1810(a0)185; CHECK-NEXT: add a0, a0, a1186; CHECK-NEXT: zext.b a0, a0187; CHECK-NEXT: ret188;189; ZBA-LABEL: test_add:190; ZBA: # %bb.0: # %entry191; ZBA-NEXT: add a1, a0, a1192; ZBA-NEXT: add a0, a2, a0193; ZBA-NEXT: lbu a1, 1800(a1)194; ZBA-NEXT: lbu a0, 1810(a0)195; ZBA-NEXT: add a0, a0, a1196; ZBA-NEXT: zext.b a0, a0197; ZBA-NEXT: ret198entry:199 %e = getelementptr inbounds nuw i8, ptr %p, i64 1800200 %arrayidx = getelementptr inbounds nuw [1000 x i8], ptr %e, i64 0, iXLen %x201 %0 = load i8, ptr %arrayidx, align 1202 %add = add iXLen %y, 10203 %arrayidx2 = getelementptr inbounds nuw [1000 x i8], ptr %e, i64 0, iXLen %add204 %1 = load i8, ptr %arrayidx2, align 1205 %add4 = add i8 %1, %0206 ret i8 %add4207}208 209define i64 @test_sh3add_uw(ptr %p, i32 signext %x, i32 signext %y) {210; RV32I-LABEL: test_sh3add_uw:211; RV32I: # %bb.0: # %entry212; RV32I-NEXT: slli a1, a1, 3213; RV32I-NEXT: slli a2, a2, 3214; RV32I-NEXT: add a1, a0, a1215; RV32I-NEXT: add a0, a0, a2216; RV32I-NEXT: lw a2, 400(a1)217; RV32I-NEXT: lw a1, 404(a1)218; RV32I-NEXT: lw a3, 404(a0)219; RV32I-NEXT: lw a4, 400(a0)220; RV32I-NEXT: add a1, a3, a1221; RV32I-NEXT: add a0, a4, a2222; RV32I-NEXT: sltu a2, a0, a4223; RV32I-NEXT: add a1, a1, a2224; RV32I-NEXT: ret225;226; RV64I-LABEL: test_sh3add_uw:227; RV64I: # %bb.0: # %entry228; RV64I-NEXT: slli a1, a1, 32229; RV64I-NEXT: slli a2, a2, 32230; RV64I-NEXT: srli a1, a1, 29231; RV64I-NEXT: srli a2, a2, 29232; RV64I-NEXT: add a1, a0, a1233; RV64I-NEXT: add a0, a0, a2234; RV64I-NEXT: ld a1, 400(a1)235; RV64I-NEXT: ld a0, 400(a0)236; RV64I-NEXT: add a0, a0, a1237; RV64I-NEXT: ret238;239; RV32ZBA-LABEL: test_sh3add_uw:240; RV32ZBA: # %bb.0: # %entry241; RV32ZBA-NEXT: sh3add a1, a1, a0242; RV32ZBA-NEXT: sh3add a0, a2, a0243; RV32ZBA-NEXT: lw a2, 400(a1)244; RV32ZBA-NEXT: lw a1, 404(a1)245; RV32ZBA-NEXT: lw a3, 404(a0)246; RV32ZBA-NEXT: lw a4, 400(a0)247; RV32ZBA-NEXT: add a1, a3, a1248; RV32ZBA-NEXT: add a0, a4, a2249; RV32ZBA-NEXT: sltu a2, a0, a4250; RV32ZBA-NEXT: add a1, a1, a2251; RV32ZBA-NEXT: ret252;253; RV64ZBA-LABEL: test_sh3add_uw:254; RV64ZBA: # %bb.0: # %entry255; RV64ZBA-NEXT: sh3add.uw a1, a1, a0256; RV64ZBA-NEXT: sh3add.uw a0, a2, a0257; RV64ZBA-NEXT: ld a1, 400(a1)258; RV64ZBA-NEXT: ld a0, 400(a0)259; RV64ZBA-NEXT: add a0, a0, a1260; RV64ZBA-NEXT: ret261entry:262 %b = getelementptr inbounds nuw i8, ptr %p, i64 400263 %idxprom = zext i32 %x to i64264 %arrayidx = getelementptr inbounds nuw [100 x i64], ptr %b, i64 0, i64 %idxprom265 %0 = load i64, ptr %arrayidx, align 8266 %idxprom2 = zext i32 %y to i64267 %arrayidx3 = getelementptr inbounds nuw [100 x i64], ptr %b, i64 0, i64 %idxprom2268 %1 = load i64, ptr %arrayidx3, align 8269 %add4 = add nsw i64 %1, %0270 ret i64 %add4271}272 273define signext i32 @test_sh2add_uw(ptr %p, i32 signext %x, i32 signext %y) {274; RV32I-LABEL: test_sh2add_uw:275; RV32I: # %bb.0: # %entry276; RV32I-NEXT: slli a1, a1, 2277; RV32I-NEXT: slli a2, a2, 2278; RV32I-NEXT: add a1, a0, a1279; RV32I-NEXT: add a0, a0, a2280; RV32I-NEXT: lw a1, 1200(a1)281; RV32I-NEXT: lw a0, 1200(a0)282; RV32I-NEXT: add a0, a0, a1283; RV32I-NEXT: ret284;285; RV64I-LABEL: test_sh2add_uw:286; RV64I: # %bb.0: # %entry287; RV64I-NEXT: slli a1, a1, 32288; RV64I-NEXT: slli a2, a2, 32289; RV64I-NEXT: srli a1, a1, 30290; RV64I-NEXT: srli a2, a2, 30291; RV64I-NEXT: add a1, a0, a1292; RV64I-NEXT: add a0, a0, a2293; RV64I-NEXT: lw a1, 1200(a1)294; RV64I-NEXT: lw a0, 1200(a0)295; RV64I-NEXT: addw a0, a0, a1296; RV64I-NEXT: ret297;298; RV32ZBA-LABEL: test_sh2add_uw:299; RV32ZBA: # %bb.0: # %entry300; RV32ZBA-NEXT: sh2add a1, a1, a0301; RV32ZBA-NEXT: sh2add a0, a2, a0302; RV32ZBA-NEXT: lw a1, 1200(a1)303; RV32ZBA-NEXT: lw a0, 1200(a0)304; RV32ZBA-NEXT: add a0, a0, a1305; RV32ZBA-NEXT: ret306;307; RV64ZBA-LABEL: test_sh2add_uw:308; RV64ZBA: # %bb.0: # %entry309; RV64ZBA-NEXT: sh2add.uw a1, a1, a0310; RV64ZBA-NEXT: sh2add.uw a0, a2, a0311; RV64ZBA-NEXT: lw a1, 1200(a1)312; RV64ZBA-NEXT: lw a0, 1200(a0)313; RV64ZBA-NEXT: addw a0, a0, a1314; RV64ZBA-NEXT: ret315entry:316 %c = getelementptr inbounds nuw i8, ptr %p, i64 1200317 %idxprom = zext i32 %x to i64318 %arrayidx = getelementptr inbounds nuw [100 x i32], ptr %c, i64 0, i64 %idxprom319 %0 = load i32, ptr %arrayidx, align 4320 %idxprom2 = zext i32 %y to i64321 %arrayidx3 = getelementptr inbounds nuw [100 x i32], ptr %c, i64 0, i64 %idxprom2322 %1 = load i32, ptr %arrayidx3, align 4323 %add4 = add nsw i32 %1, %0324 ret i32 %add4325}326 327define signext i16 @test_sh1add_uw(ptr %p, i32 signext %x, i32 signext %y) {328; RV32I-LABEL: test_sh1add_uw:329; RV32I: # %bb.0: # %entry330; RV32I-NEXT: slli a1, a1, 1331; RV32I-NEXT: slli a2, a2, 1332; RV32I-NEXT: add a1, a0, a1333; RV32I-NEXT: add a0, a2, a0334; RV32I-NEXT: lh a1, 1600(a1)335; RV32I-NEXT: lh a0, 1620(a0)336; RV32I-NEXT: add a0, a0, a1337; RV32I-NEXT: slli a0, a0, 16338; RV32I-NEXT: srai a0, a0, 16339; RV32I-NEXT: ret340;341; RV64I-LABEL: test_sh1add_uw:342; RV64I: # %bb.0: # %entry343; RV64I-NEXT: slli a1, a1, 32344; RV64I-NEXT: addi a2, a2, 10345; RV64I-NEXT: srli a1, a1, 31346; RV64I-NEXT: slli a2, a2, 32347; RV64I-NEXT: add a1, a0, a1348; RV64I-NEXT: srli a2, a2, 31349; RV64I-NEXT: add a0, a0, a2350; RV64I-NEXT: lh a1, 1600(a1)351; RV64I-NEXT: lh a0, 1600(a0)352; RV64I-NEXT: add a0, a0, a1353; RV64I-NEXT: slli a0, a0, 48354; RV64I-NEXT: srai a0, a0, 48355; RV64I-NEXT: ret356;357; RV32ZBA-LABEL: test_sh1add_uw:358; RV32ZBA: # %bb.0: # %entry359; RV32ZBA-NEXT: sh1add a1, a1, a0360; RV32ZBA-NEXT: sh1add a0, a2, a0361; RV32ZBA-NEXT: lh a1, 1600(a1)362; RV32ZBA-NEXT: lh a0, 1620(a0)363; RV32ZBA-NEXT: add a0, a0, a1364; RV32ZBA-NEXT: slli a0, a0, 16365; RV32ZBA-NEXT: srai a0, a0, 16366; RV32ZBA-NEXT: ret367;368; RV64ZBA-LABEL: test_sh1add_uw:369; RV64ZBA: # %bb.0: # %entry370; RV64ZBA-NEXT: sh1add.uw a1, a1, a0371; RV64ZBA-NEXT: addi a2, a2, 10372; RV64ZBA-NEXT: sh1add.uw a0, a2, a0373; RV64ZBA-NEXT: lh a1, 1600(a1)374; RV64ZBA-NEXT: lh a0, 1600(a0)375; RV64ZBA-NEXT: add a0, a0, a1376; RV64ZBA-NEXT: slli a0, a0, 48377; RV64ZBA-NEXT: srai a0, a0, 48378; RV64ZBA-NEXT: ret379entry:380 %d = getelementptr inbounds nuw i8, ptr %p, i64 1600381 %idxprom = zext i32 %x to i64382 %arrayidx = getelementptr inbounds nuw [100 x i16], ptr %d, i64 0, i64 %idxprom383 %0 = load i16, ptr %arrayidx, align 2384 %add = add i32 %y, 10385 %idxprom2 = zext i32 %add to i64386 %arrayidx3 = getelementptr inbounds nuw [100 x i16], ptr %d, i64 0, i64 %idxprom2387 %1 = load i16, ptr %arrayidx3, align 2388 %add5 = add i16 %1, %0389 ret i16 %add5390}391 392define zeroext i8 @test_add_uw(ptr %p, i32 signext %x, i32 signext %y) {393; RV32I-LABEL: test_add_uw:394; RV32I: # %bb.0: # %entry395; RV32I-NEXT: add a1, a0, a1396; RV32I-NEXT: add a0, a0, a2397; RV32I-NEXT: lbu a1, 1800(a1)398; RV32I-NEXT: lbu a0, 1800(a0)399; RV32I-NEXT: add a0, a0, a1400; RV32I-NEXT: zext.b a0, a0401; RV32I-NEXT: ret402;403; RV64I-LABEL: test_add_uw:404; RV64I: # %bb.0: # %entry405; RV64I-NEXT: slli a1, a1, 32406; RV64I-NEXT: slli a2, a2, 32407; RV64I-NEXT: srli a1, a1, 32408; RV64I-NEXT: srli a2, a2, 32409; RV64I-NEXT: add a1, a0, a1410; RV64I-NEXT: add a0, a0, a2411; RV64I-NEXT: lbu a1, 1800(a1)412; RV64I-NEXT: lbu a0, 1800(a0)413; RV64I-NEXT: add a0, a0, a1414; RV64I-NEXT: zext.b a0, a0415; RV64I-NEXT: ret416;417; RV32ZBA-LABEL: test_add_uw:418; RV32ZBA: # %bb.0: # %entry419; RV32ZBA-NEXT: add a1, a0, a1420; RV32ZBA-NEXT: add a0, a0, a2421; RV32ZBA-NEXT: lbu a1, 1800(a1)422; RV32ZBA-NEXT: lbu a0, 1800(a0)423; RV32ZBA-NEXT: add a0, a0, a1424; RV32ZBA-NEXT: zext.b a0, a0425; RV32ZBA-NEXT: ret426;427; RV64ZBA-LABEL: test_add_uw:428; RV64ZBA: # %bb.0: # %entry429; RV64ZBA-NEXT: add.uw a1, a1, a0430; RV64ZBA-NEXT: add.uw a0, a2, a0431; RV64ZBA-NEXT: lbu a1, 1800(a1)432; RV64ZBA-NEXT: lbu a0, 1800(a0)433; RV64ZBA-NEXT: add a0, a0, a1434; RV64ZBA-NEXT: zext.b a0, a0435; RV64ZBA-NEXT: ret436entry:437 %e = getelementptr inbounds nuw i8, ptr %p, i64 1800438 %idxprom = zext i32 %x to i64439 %arrayidx = getelementptr inbounds nuw [1000 x i8], ptr %e, i64 0, i64 %idxprom440 %0 = load i8, ptr %arrayidx, align 1441 %idxprom2 = zext i32 %y to i64442 %arrayidx3 = getelementptr inbounds nuw [1000 x i8], ptr %e, i64 0, i64 %idxprom2443 %1 = load i8, ptr %arrayidx3, align 1444 %add5 = add i8 %1, %0445 ret i8 %add5446}447 448; The addi is part of the index and used with 2 different scales.449define signext i32 @test_scaled_index_addi(ptr %p, iXLen %x) {450; RV32I-LABEL: test_scaled_index_addi:451; RV32I: # %bb.0: # %entry452; RV32I-NEXT: slli a2, a1, 2453; RV32I-NEXT: slli a1, a1, 1454; RV32I-NEXT: add a2, a0, a2455; RV32I-NEXT: add a0, a0, a1456; RV32I-NEXT: lw a1, 1196(a2)457; RV32I-NEXT: lh a0, 1598(a0)458; RV32I-NEXT: add a0, a1, a0459; RV32I-NEXT: ret460;461; RV64I-LABEL: test_scaled_index_addi:462; RV64I: # %bb.0: # %entry463; RV64I-NEXT: slli a2, a1, 2464; RV64I-NEXT: slli a1, a1, 1465; RV64I-NEXT: add a2, a0, a2466; RV64I-NEXT: add a0, a0, a1467; RV64I-NEXT: lw a1, 1196(a2)468; RV64I-NEXT: lh a0, 1598(a0)469; RV64I-NEXT: addw a0, a1, a0470; RV64I-NEXT: ret471;472; RV32ZBA-LABEL: test_scaled_index_addi:473; RV32ZBA: # %bb.0: # %entry474; RV32ZBA-NEXT: sh2add a2, a1, a0475; RV32ZBA-NEXT: sh1add a0, a1, a0476; RV32ZBA-NEXT: lw a1, 1196(a2)477; RV32ZBA-NEXT: lh a0, 1598(a0)478; RV32ZBA-NEXT: add a0, a1, a0479; RV32ZBA-NEXT: ret480;481; RV64ZBA-LABEL: test_scaled_index_addi:482; RV64ZBA: # %bb.0: # %entry483; RV64ZBA-NEXT: sh2add a2, a1, a0484; RV64ZBA-NEXT: sh1add a0, a1, a0485; RV64ZBA-NEXT: lw a1, 1196(a2)486; RV64ZBA-NEXT: lh a0, 1598(a0)487; RV64ZBA-NEXT: addw a0, a1, a0488; RV64ZBA-NEXT: ret489entry:490 %c = getelementptr inbounds nuw i8, ptr %p, i64 1200491 %sub = add iXLen %x, -1492 %arrayidx = getelementptr inbounds nuw [100 x i32], ptr %c, i64 0, iXLen %sub493 %0 = load i32, ptr %arrayidx, align 4494 %d = getelementptr inbounds nuw i8, ptr %p, i64 1600495 %arrayidx2 = getelementptr inbounds nuw [100 x i16], ptr %d, i64 0, iXLen %sub496 %1 = load i16, ptr %arrayidx2, align 2497 %conv = sext i16 %1 to i32498 %add = add nsw i32 %0, %conv499 ret i32 %add500}501 502; Offset is a pair of addis. We can fold one of them.503define signext i32 @test_medium_offset(ptr %p, iXLen %x, iXLen %y) {504; RV32I-LABEL: test_medium_offset:505; RV32I: # %bb.0: # %entry506; RV32I-NEXT: addi a0, a0, 2047507; RV32I-NEXT: slli a1, a1, 2508; RV32I-NEXT: slli a2, a2, 2509; RV32I-NEXT: add a1, a0, a1510; RV32I-NEXT: add a0, a2, a0511; RV32I-NEXT: lw a1, 753(a1)512; RV32I-NEXT: lw a0, 793(a0)513; RV32I-NEXT: add a0, a0, a1514; RV32I-NEXT: ret515;516; RV64I-LABEL: test_medium_offset:517; RV64I: # %bb.0: # %entry518; RV64I-NEXT: addi a0, a0, 2047519; RV64I-NEXT: slli a1, a1, 2520; RV64I-NEXT: slli a2, a2, 2521; RV64I-NEXT: add a1, a0, a1522; RV64I-NEXT: add a0, a2, a0523; RV64I-NEXT: lw a1, 753(a1)524; RV64I-NEXT: lw a0, 793(a0)525; RV64I-NEXT: addw a0, a0, a1526; RV64I-NEXT: ret527;528; RV32ZBA-LABEL: test_medium_offset:529; RV32ZBA: # %bb.0: # %entry530; RV32ZBA-NEXT: addi a0, a0, 2047531; RV32ZBA-NEXT: sh2add a1, a1, a0532; RV32ZBA-NEXT: sh2add a0, a2, a0533; RV32ZBA-NEXT: lw a1, 753(a1)534; RV32ZBA-NEXT: lw a0, 793(a0)535; RV32ZBA-NEXT: add a0, a0, a1536; RV32ZBA-NEXT: ret537;538; RV64ZBA-LABEL: test_medium_offset:539; RV64ZBA: # %bb.0: # %entry540; RV64ZBA-NEXT: addi a0, a0, 2047541; RV64ZBA-NEXT: sh2add a1, a1, a0542; RV64ZBA-NEXT: sh2add a0, a2, a0543; RV64ZBA-NEXT: lw a1, 753(a1)544; RV64ZBA-NEXT: lw a0, 793(a0)545; RV64ZBA-NEXT: addw a0, a0, a1546; RV64ZBA-NEXT: ret547entry:548 %f = getelementptr inbounds nuw i8, ptr %p, i64 2800549 %arrayidx = getelementptr inbounds nuw [1000 x i32], ptr %f, i64 0, iXLen %x550 %0 = load i32, ptr %arrayidx, align 4551 %add = add iXLen %y, 10552 %arrayidx2 = getelementptr inbounds nuw [1000 x i32], ptr %f, i64 0, iXLen %add553 %1 = load i32, ptr %arrayidx2, align 4554 %add3 = add nsw i32 %1, %0555 ret i32 %add3556}557 558; Offset is a lui+addiw. We can't fold this on RV64.559define signext i32 @test_large_offset(ptr %p, iXLen %x, iXLen %y) {560; RV32I-LABEL: test_large_offset:561; RV32I: # %bb.0: # %entry562; RV32I-NEXT: lui a3, 2563; RV32I-NEXT: slli a1, a1, 2564; RV32I-NEXT: slli a2, a2, 2565; RV32I-NEXT: add a0, a0, a3566; RV32I-NEXT: add a1, a0, a1567; RV32I-NEXT: add a0, a2, a0568; RV32I-NEXT: lw a1, -1392(a1)569; RV32I-NEXT: lw a0, -1352(a0)570; RV32I-NEXT: add a0, a0, a1571; RV32I-NEXT: ret572;573; RV64I-LABEL: test_large_offset:574; RV64I: # %bb.0: # %entry575; RV64I-NEXT: lui a3, 2576; RV64I-NEXT: slli a1, a1, 2577; RV64I-NEXT: slli a2, a2, 2578; RV64I-NEXT: add a0, a0, a3579; RV64I-NEXT: add a1, a0, a1580; RV64I-NEXT: add a0, a2, a0581; RV64I-NEXT: lw a1, -1392(a1)582; RV64I-NEXT: lw a0, -1352(a0)583; RV64I-NEXT: addw a0, a0, a1584; RV64I-NEXT: ret585;586; RV32ZBA-LABEL: test_large_offset:587; RV32ZBA: # %bb.0: # %entry588; RV32ZBA-NEXT: li a3, 1700589; RV32ZBA-NEXT: sh2add a0, a3, a0590; RV32ZBA-NEXT: sh2add a1, a1, a0591; RV32ZBA-NEXT: sh2add a0, a2, a0592; RV32ZBA-NEXT: lw a1, 0(a1)593; RV32ZBA-NEXT: lw a0, 40(a0)594; RV32ZBA-NEXT: add a0, a0, a1595; RV32ZBA-NEXT: ret596;597; RV64ZBA-LABEL: test_large_offset:598; RV64ZBA: # %bb.0: # %entry599; RV64ZBA-NEXT: li a3, 1700600; RV64ZBA-NEXT: sh2add a0, a3, a0601; RV64ZBA-NEXT: sh2add a1, a1, a0602; RV64ZBA-NEXT: sh2add a0, a2, a0603; RV64ZBA-NEXT: lw a1, 0(a1)604; RV64ZBA-NEXT: lw a0, 40(a0)605; RV64ZBA-NEXT: addw a0, a0, a1606; RV64ZBA-NEXT: ret607entry:608 %g = getelementptr inbounds nuw i8, ptr %p, i64 6800609 %arrayidx = getelementptr inbounds nuw [200 x i32], ptr %g, i64 0, iXLen %x610 %0 = load i32, ptr %arrayidx, align 4611 %add = add iXLen %y, 10612 %arrayidx2 = getelementptr inbounds nuw [200 x i32], ptr %g, i64 0, iXLen %add613 %1 = load i32, ptr %arrayidx2, align 4614 %add3 = add nsw i32 %1, %0615 ret i32 %add3616}617 618; After folding we can CSE the sh2add619define signext i32 @test_cse(ptr %p, iXLen %x) {620; RV32I-LABEL: test_cse:621; RV32I: # %bb.0: # %entry622; RV32I-NEXT: slli a1, a1, 2623; RV32I-NEXT: add a0, a0, a1624; RV32I-NEXT: lw a1, 1200(a0)625; RV32I-NEXT: addi a0, a0, 2047626; RV32I-NEXT: lw a0, 753(a0)627; RV32I-NEXT: add a0, a0, a1628; RV32I-NEXT: ret629;630; RV64I-LABEL: test_cse:631; RV64I: # %bb.0: # %entry632; RV64I-NEXT: slli a1, a1, 2633; RV64I-NEXT: add a0, a0, a1634; RV64I-NEXT: lw a1, 1200(a0)635; RV64I-NEXT: addi a0, a0, 2047636; RV64I-NEXT: lw a0, 753(a0)637; RV64I-NEXT: addw a0, a0, a1638; RV64I-NEXT: ret639;640; RV32ZBA-LABEL: test_cse:641; RV32ZBA: # %bb.0: # %entry642; RV32ZBA-NEXT: sh2add a0, a1, a0643; RV32ZBA-NEXT: lw a1, 1200(a0)644; RV32ZBA-NEXT: addi a0, a0, 2047645; RV32ZBA-NEXT: lw a0, 753(a0)646; RV32ZBA-NEXT: add a0, a0, a1647; RV32ZBA-NEXT: ret648;649; RV64ZBA-LABEL: test_cse:650; RV64ZBA: # %bb.0: # %entry651; RV64ZBA-NEXT: sh2add a0, a1, a0652; RV64ZBA-NEXT: lw a1, 1200(a0)653; RV64ZBA-NEXT: addi a0, a0, 2047654; RV64ZBA-NEXT: lw a0, 753(a0)655; RV64ZBA-NEXT: addw a0, a0, a1656; RV64ZBA-NEXT: ret657entry:658 %c = getelementptr inbounds nuw i8, ptr %p, i64 1200659 %arrayidx = getelementptr inbounds nuw [100 x i32], ptr %c, i64 0, iXLen %x660 %0 = load i32, ptr %arrayidx, align 4661 %f = getelementptr inbounds nuw i8, ptr %p, i64 2800662 %arrayidx1 = getelementptr inbounds nuw [1000 x i32], ptr %f, i64 0, iXLen %x663 %1 = load i32, ptr %arrayidx1, align 4664 %add = add nsw i32 %1, %0665 ret i32 %add666}667 668define zeroext i8 @test_optsize(ptr %p, iXLen %x, iXLen %y) optsize {669; CHECK-LABEL: test_optsize:670; CHECK: # %bb.0: # %entry671; CHECK-NEXT: addi a0, a0, 1800672; CHECK-NEXT: add a1, a0, a1673; CHECK-NEXT: add a0, a2, a0674; CHECK-NEXT: lbu a1, 0(a1)675; CHECK-NEXT: lbu a0, 10(a0)676; CHECK-NEXT: add a0, a0, a1677; CHECK-NEXT: zext.b a0, a0678; CHECK-NEXT: ret679;680; ZBA-LABEL: test_optsize:681; ZBA: # %bb.0: # %entry682; ZBA-NEXT: addi a0, a0, 1800683; ZBA-NEXT: add a1, a0, a1684; ZBA-NEXT: add a0, a2, a0685; ZBA-NEXT: lbu a1, 0(a1)686; ZBA-NEXT: lbu a0, 10(a0)687; ZBA-NEXT: add a0, a0, a1688; ZBA-NEXT: zext.b a0, a0689; ZBA-NEXT: ret690entry:691 %e = getelementptr inbounds nuw i8, ptr %p, i64 1800692 %arrayidx = getelementptr inbounds nuw [1000 x i8], ptr %e, i64 0, iXLen %x693 %0 = load i8, ptr %arrayidx, align 1694 %add = add iXLen %y, 10695 %arrayidx2 = getelementptr inbounds nuw [1000 x i8], ptr %e, i64 0, iXLen %add696 %1 = load i8, ptr %arrayidx2, align 1697 %add4 = add i8 %1, %0698 ret i8 %add4699}700 701define zeroext i8 @test_minsize(ptr %p, iXLen %x, iXLen %y) minsize {702; CHECK-LABEL: test_minsize:703; CHECK: # %bb.0: # %entry704; CHECK-NEXT: addi a0, a0, 1800705; CHECK-NEXT: add a1, a0, a1706; CHECK-NEXT: add a0, a2, a0707; CHECK-NEXT: lbu a1, 0(a1)708; CHECK-NEXT: lbu a0, 10(a0)709; CHECK-NEXT: add a0, a0, a1710; CHECK-NEXT: zext.b a0, a0711; CHECK-NEXT: ret712;713; ZBA-LABEL: test_minsize:714; ZBA: # %bb.0: # %entry715; ZBA-NEXT: addi a0, a0, 1800716; ZBA-NEXT: add a1, a0, a1717; ZBA-NEXT: add a0, a2, a0718; ZBA-NEXT: lbu a1, 0(a1)719; ZBA-NEXT: lbu a0, 10(a0)720; ZBA-NEXT: add a0, a0, a1721; ZBA-NEXT: zext.b a0, a0722; ZBA-NEXT: ret723entry:724 %e = getelementptr inbounds nuw i8, ptr %p, i64 1800725 %arrayidx = getelementptr inbounds nuw [1000 x i8], ptr %e, i64 0, iXLen %x726 %0 = load i8, ptr %arrayidx, align 1727 %add = add iXLen %y, 10728 %arrayidx2 = getelementptr inbounds nuw [1000 x i8], ptr %e, i64 0, iXLen %add729 %1 = load i8, ptr %arrayidx2, align 1730 %add4 = add i8 %1, %0731 ret i8 %add4732}733