brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.2 KiB · deaffc8 Raw
292 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -mtriple=riscv64-unknown-elf -passes='separate-const-offset-from-gep,early-cse' \3; RUN:       -S | FileCheck %s4 5; Several tests for separate-const-offset-from-gep. The transformation6; heavily relies on TargetTransformInfo, so we put these tests under7; target-specific folders.8 9; Simple case when GEPs should be optimized.10define i64 @test1(ptr %array, i64 %i, i64 %j)  {11; CHECK-LABEL: @test1(12; CHECK-NEXT:  entry:13; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[I:%.*]], 514; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i64, ptr [[ARRAY:%.*]], i64 [[I]]15; CHECK-NEXT:    [[GEP4:%.*]] = getelementptr i8, ptr [[TMP0]], i64 4016; CHECK-NEXT:    store i64 [[J:%.*]], ptr [[GEP4]], align 817; CHECK-NEXT:    [[GEP26:%.*]] = getelementptr i8, ptr [[TMP0]], i64 4818; CHECK-NEXT:    store i64 [[J]], ptr [[GEP26]], align 819; CHECK-NEXT:    [[GEP38:%.*]] = getelementptr i8, ptr [[TMP0]], i64 28020; CHECK-NEXT:    store i64 [[ADD]], ptr [[GEP38]], align 821; CHECK-NEXT:    ret i64 undef22;23entry:24  %add = add nsw i64 %i, 525  %gep = getelementptr inbounds i64, ptr %array, i64 %add26  store i64 %j, ptr %gep27  %add2 = add nsw i64 %i, 628  %gep2 = getelementptr inbounds i64, ptr %array, i64 %add229  store i64 %j, ptr %gep230  %add3 = add nsw i64 %i, 3531  %gep3 = getelementptr inbounds i64, ptr %array, i64 %add332  store i64 %add, ptr %gep333  ret i64 undef34}35 36; Optimize GEPs when there sext instructions are needed to cast index value to expected type.37define i32 @test2(ptr %array, i32 %i, i32 %j) {38; CHECK-LABEL: @test2(39; CHECK-NEXT:  entry:40; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[I:%.*]], 541; CHECK-NEXT:    [[TMP0:%.*]] = sext i32 [[I]] to i6442; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[ARRAY:%.*]], i64 [[TMP0]]43; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i8, ptr [[TMP1]], i64 2044; CHECK-NEXT:    store i32 [[J:%.*]], ptr [[GEP2]], align 445; CHECK-NEXT:    [[GEP54:%.*]] = getelementptr i8, ptr [[TMP1]], i64 2446; CHECK-NEXT:    store i32 [[J]], ptr [[GEP54]], align 447; CHECK-NEXT:    [[GEP86:%.*]] = getelementptr i8, ptr [[TMP1]], i64 14048; CHECK-NEXT:    store i32 [[ADD]], ptr [[GEP86]], align 449; CHECK-NEXT:    ret i32 undef50;51entry:52  %add = add nsw i32 %i, 553  %sext = sext i32 %add to i6454  %gep = getelementptr inbounds i32, ptr %array, i64 %sext55  store i32 %j, ptr %gep56  %add3 = add nsw i32 %i, 657  %sext4 = sext i32 %add3 to i6458  %gep5 = getelementptr inbounds i32, ptr %array, i64 %sext459  store i32 %j, ptr %gep560  %add6 = add nsw i32 %i, 3561  %sext7 = sext i32 %add6 to i6462  %gep8 = getelementptr inbounds i32, ptr %array, i64 %sext763  store i32 %add, ptr %gep864  ret i32 undef65}66 67; No need to modify because all values are also used in other expressions.68; Modification doesn't decrease register pressure.69define i32 @test3(ptr %array, i32 %i) {70; CHECK-LABEL: @test3(71; CHECK-NEXT:  entry:72; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[I:%.*]], 573; CHECK-NEXT:    [[TMP0:%.*]] = sext i32 [[I]] to i6474; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[ARRAY:%.*]], i64 [[TMP0]]75; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i8, ptr [[TMP1]], i64 2076; CHECK-NEXT:    store i32 [[ADD]], ptr [[GEP2]], align 477; CHECK-NEXT:    [[ADD3:%.*]] = add nsw i32 [[I]], 678; CHECK-NEXT:    [[GEP54:%.*]] = getelementptr i8, ptr [[TMP1]], i64 2479; CHECK-NEXT:    store i32 [[ADD3]], ptr [[GEP54]], align 480; CHECK-NEXT:    [[ADD6:%.*]] = add nsw i32 [[I]], 3581; CHECK-NEXT:    [[GEP86:%.*]] = getelementptr i8, ptr [[TMP1]], i64 14082; CHECK-NEXT:    store i32 [[ADD6]], ptr [[GEP86]], align 483; CHECK-NEXT:    ret i32 undef84;85entry:86  %add = add nsw i32 %i, 587  %sext = sext i32 %add to i6488  %gep = getelementptr inbounds i32, ptr %array, i64 %sext89  store i32 %add, ptr %gep90  %add3 = add nsw i32 %i, 691  %sext4 = sext i32 %add3 to i6492  %gep5 = getelementptr inbounds i32, ptr %array, i64 %sext493  store i32 %add3, ptr %gep594  %add6 = add nsw i32 %i, 3595  %sext7 = sext i32 %add6 to i6496  %gep8 = getelementptr inbounds i32, ptr %array, i64 %sext797  store i32 %add6, ptr %gep898  ret i32 undef99}100 101; Optimized GEPs for multidimensional array with same base102define i32 @test4(ptr %array2, i32 %i) {103; CHECK-LABEL: @test4(104; CHECK-NEXT:  entry:105; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[I:%.*]], 5106; CHECK-NEXT:    [[TMP0:%.*]] = sext i32 [[I]] to i64107; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr [50 x i32], ptr [[ARRAY2:%.*]], i64 [[TMP0]], i64 [[TMP0]]108; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr i8, ptr [[TMP1]], i64 1020109; CHECK-NEXT:    store i32 [[I]], ptr [[GEP3]], align 4110; CHECK-NEXT:    [[GEP56:%.*]] = getelementptr i8, ptr [[TMP1]], i64 1024111; CHECK-NEXT:    store i32 [[ADD]], ptr [[GEP56]], align 4112; CHECK-NEXT:    [[GEP89:%.*]] = getelementptr i8, ptr [[TMP1]], i64 1140113; CHECK-NEXT:    store i32 [[I]], ptr [[GEP89]], align 4114; CHECK-NEXT:    ret i32 undef115;116entry:117  %add = add nsw i32 %i, 5118  %sext = sext i32 %add to i64119  %gep = getelementptr inbounds [50 x i32], ptr %array2, i64 %sext, i64 %sext120  store i32 %i, ptr %gep121  %add3 = add nsw i32 %i, 6122  %sext4 = sext i32 %add3 to i64123  %gep5 = getelementptr inbounds [50 x i32], ptr %array2, i64 %sext, i64 %sext4124  store i32 %add, ptr %gep5125  %add6 = add nsw i32 %i, 35126  %sext7 = sext i32 %add6 to i64127  %gep8 = getelementptr inbounds [50 x i32], ptr %array2, i64 %sext, i64 %sext7128  store i32 %i, ptr %gep8129  ret i32 undef130}131 132; Don't optimize GEPs for multidimensional array with same base because RISC-V doesn't support the addressing mode133define i32 @test5(ptr %array2, i32 %i, i64 %j) {134; CHECK-LABEL: @test5(135; CHECK-NEXT:  entry:136; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[I:%.*]], 5137; CHECK-NEXT:    [[TMP0:%.*]] = sext i32 [[I]] to i64138; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr [50 x i32], ptr [[ARRAY2:%.*]], i64 [[TMP0]], i64 [[TMP0]]139; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr i8, ptr [[TMP1]], i64 1020140; CHECK-NEXT:    store i32 [[ADD]], ptr [[GEP3]], align 4141; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr [50 x i32], ptr [[ARRAY2]], i64 [[TMP0]], i64 [[J:%.*]]142; CHECK-NEXT:    [[GEP55:%.*]] = getelementptr i8, ptr [[TMP2]], i64 1200143; CHECK-NEXT:    store i32 [[I]], ptr [[GEP55]], align 4144; CHECK-NEXT:    [[ADD6:%.*]] = add nsw i32 [[I]], 35145; CHECK-NEXT:    [[SEXT7:%.*]] = sext i32 [[ADD6]] to i64146; CHECK-NEXT:    [[GEP8:%.*]] = getelementptr inbounds [50 x i32], ptr [[ARRAY2]], i64 [[SEXT7]], i64 [[J]]147; CHECK-NEXT:    store i32 [[I]], ptr [[GEP8]], align 4148; CHECK-NEXT:    ret i32 undef149;150entry:151  %add = add nsw i32 %i, 5152  %sext = sext i32 %add to i64153  %gep = getelementptr inbounds [50 x i32], ptr %array2, i64 %sext, i64 %sext154  store i32 %add, ptr %gep155  %add3 = add nsw i32 %i, 6156  %sext4 = sext i32 %add3 to i64157  %gep5 = getelementptr inbounds [50 x i32], ptr %array2, i64 %sext4, i64 %j158  store i32 %i, ptr %gep5159  %add6 = add nsw i32 %i, 35160  %sext7 = sext i32 %add6 to i64161  %gep8 = getelementptr inbounds [50 x i32], ptr %array2, i64 %sext7, i64 %j162  store i32 %i, ptr %gep8163  ret i32 undef164}165 166; No need to optimize GEPs, because there is critical amount with non-constant offsets.167define i64 @test6(ptr %array, i64 %i, i64 %j) {168; CHECK-LABEL: @test6(169; CHECK-NEXT:  entry:170; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[I:%.*]], 5171; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i64, ptr [[ARRAY:%.*]], i64 [[J:%.*]]172; CHECK-NEXT:    store i64 [[ADD]], ptr [[GEP]], align 8173; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr i64, ptr [[ARRAY]], i64 [[I]]174; CHECK-NEXT:    [[GEP52:%.*]] = getelementptr i8, ptr [[TMP0]], i64 48175; CHECK-NEXT:    store i64 [[I]], ptr [[GEP52]], align 8176; CHECK-NEXT:    store i64 [[I]], ptr [[TMP0]], align 8177; CHECK-NEXT:    ret i64 undef178;179entry:180  %add = add nsw i64 %i, 5181  %gep = getelementptr inbounds i64, ptr %array, i64 %j182  store i64 %add, ptr %gep183  %add3 = add nsw i64 %i, 6184  %gep5 = getelementptr inbounds i64, ptr %array, i64 %add3185  store i64 %i, ptr %gep5186  %add6 = add nsw i64 %i, 35187  %gep8 = getelementptr inbounds i64, ptr %array, i64 %i188  store i64 %i, ptr %gep8189  ret i64 undef190}191 192; No need to optimize GEPs, because the base variable is different.193define i32 @test7(ptr %array, i32 %i, i32 %j, i32 %k) {194; CHECK-LABEL: @test7(195; CHECK-NEXT:  entry:196; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[I:%.*]], 5197; CHECK-NEXT:    [[TMP0:%.*]] = sext i32 [[I]] to i64198; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[ARRAY:%.*]], i64 [[TMP0]]199; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i8, ptr [[TMP1]], i64 20200; CHECK-NEXT:    store i32 [[ADD]], ptr [[GEP2]], align 4201; CHECK-NEXT:    [[TMP2:%.*]] = sext i32 [[K:%.*]] to i64202; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr i32, ptr [[ARRAY]], i64 [[TMP2]]203; CHECK-NEXT:    [[GEP54:%.*]] = getelementptr i8, ptr [[TMP3]], i64 24204; CHECK-NEXT:    store i32 [[I]], ptr [[GEP54]], align 4205; CHECK-NEXT:    [[TMP4:%.*]] = sext i32 [[J:%.*]] to i64206; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr i32, ptr [[ARRAY]], i64 [[TMP4]]207; CHECK-NEXT:    [[GEP86:%.*]] = getelementptr i8, ptr [[TMP5]], i64 140208; CHECK-NEXT:    store i32 [[I]], ptr [[GEP86]], align 4209; CHECK-NEXT:    ret i32 undef210;211entry:212  %add = add nsw i32 %i, 5213  %sext = sext i32 %add to i64214  %gep = getelementptr inbounds i32, ptr %array, i64 %sext215  store i32 %add, ptr %gep216  %add3 = add nsw i32 %k, 6217  %sext4 = sext i32 %add3 to i64218  %gep5 = getelementptr inbounds i32, ptr %array, i64 %sext4219  store i32 %i, ptr %gep5220  %add6 = add nsw i32 %j, 35221  %sext7 = sext i32 %add6 to i64222  %gep8 = getelementptr inbounds i32, ptr %array, i64 %sext7223  store i32 %i, ptr %gep8224  ret i32 undef225}226 227; No need to optimize GEPs, because the base of GEP instructions is different.228define i32 @test8(ptr %array, ptr %array2, ptr %array3, i32 %i) {229; CHECK-LABEL: @test8(230; CHECK-NEXT:  entry:231; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[I:%.*]], 5232; CHECK-NEXT:    [[TMP0:%.*]] = sext i32 [[I]] to i64233; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[ARRAY:%.*]], i64 [[TMP0]]234; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i8, ptr [[TMP1]], i64 20235; CHECK-NEXT:    store i32 [[ADD]], ptr [[GEP2]], align 4236; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i32, ptr [[ARRAY2:%.*]], i64 [[TMP0]]237; CHECK-NEXT:    [[GEP54:%.*]] = getelementptr i8, ptr [[TMP2]], i64 24238; CHECK-NEXT:    store i32 [[I]], ptr [[GEP54]], align 4239; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr i32, ptr [[ARRAY3:%.*]], i64 [[TMP0]]240; CHECK-NEXT:    [[GEP86:%.*]] = getelementptr i8, ptr [[TMP3]], i64 140241; CHECK-NEXT:    store i32 [[I]], ptr [[GEP86]], align 4242; CHECK-NEXT:    ret i32 undef243;244entry:245  %add = add nsw i32 %i, 5246  %sext = sext i32 %add to i64247  %gep = getelementptr inbounds i32, ptr %array, i64 %sext248  store i32 %add, ptr %gep249  %add3 = add nsw i32 %i, 6250  %sext4 = sext i32 %add3 to i64251  %gep5 = getelementptr inbounds i32, ptr %array2, i64 %sext4252  store i32 %i, ptr %gep5253  %add6 = add nsw i32 %i, 35254  %sext7 = sext i32 %add6 to i64255  %gep8 = getelementptr inbounds i32, ptr %array3, i64 %sext7256  store i32 %i, ptr %gep8257  ret i32 undef258}259 260; No need to optimize GEPs of multidimensional array, because the base of GEP instructions is different.261define i32 @test9(ptr %array, i32 %i) {262; CHECK-LABEL: @test9(263; CHECK-NEXT:  entry:264; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[I:%.*]], 5265; CHECK-NEXT:    [[TMP0:%.*]] = sext i32 [[I]] to i64266; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr [50 x i32], ptr [[ARRAY:%.*]], i64 0, i64 [[TMP0]]267; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i8, ptr [[TMP1]], i64 20268; CHECK-NEXT:    store i32 [[ADD]], ptr [[GEP2]], align 4269; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr [50 x i32], ptr [[ARRAY]], i64 [[TMP0]], i64 [[TMP0]]270; CHECK-NEXT:    [[GEP54:%.*]] = getelementptr i8, ptr [[TMP2]], i64 24271; CHECK-NEXT:    store i32 [[I]], ptr [[GEP54]], align 4272; CHECK-NEXT:    [[GEP87:%.*]] = getelementptr i8, ptr [[TMP2]], i64 1340273; CHECK-NEXT:    store i32 [[I]], ptr [[GEP87]], align 4274; CHECK-NEXT:    ret i32 undef275;276entry:277  %add = add nsw i32 %i, 5278  %sext = sext i32 %add to i64279  %gep = getelementptr inbounds [50 x i32], ptr %array, i64 0, i64 %sext280  store i32 %add, ptr %gep281  %add3 = add nsw i32 %i, 6282  %sext4 = sext i32 %add3 to i64283  %int = sext i32 %i to i64284  %gep5 = getelementptr inbounds [50 x i32], ptr %array, i64 %int, i64 %sext4285  store i32 %i, ptr %gep5286  %add6 = add nsw i32 %i, 35287  %sext7 = sext i32 %add6 to i64288  %gep8 = getelementptr inbounds [50 x i32], ptr %array, i64 %sext4, i64 %sext7289  store i32 %i, ptr %gep8290  ret i32 undef291}292