242 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; REQUIRES: aarch64-registered-target3 4; RUN: opt < %s -passes=licm -S | FileCheck %s5 6target triple = "aarch64"7 8define ptr @test1(i32 %j, ptr readonly %P, ptr readnone %Q) {9; CHECK-LABEL: @test1(10; CHECK-NEXT: entry:11; CHECK-NEXT: [[CMP0:%.*]] = icmp slt i32 0, [[J:%.*]]12; CHECK-NEXT: br i1 [[CMP0]], label [[FOR_BODY_LR_PH:%.*]], label [[RETURN:%.*]]13; CHECK: for.body.lr.ph:14; CHECK-NEXT: br label [[FOR_BODY:%.*]]15; CHECK: for.body:16; CHECK-NEXT: [[P_ADDR:%.*]] = phi ptr [ [[P:%.*]], [[FOR_BODY_LR_PH]] ], [ [[ARRAYIDX0:%.*]], [[IF_END:%.*]] ]17; CHECK-NEXT: [[I0:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[I_ADD:%.*]], [[IF_END]] ]18; CHECK-NEXT: [[I0_EXT:%.*]] = sext i32 [[I0]] to i6419; CHECK-NEXT: [[ARRAYIDX0]] = getelementptr inbounds ptr, ptr [[P_ADDR]], i64 [[I0_EXT]]20; CHECK-NEXT: [[L0:%.*]] = load ptr, ptr [[ARRAYIDX0]], align 821; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt ptr [[L0]], [[Q:%.*]]22; CHECK-NEXT: br i1 [[CMP1]], label [[LOOPEXIT0:%.*]], label [[IF_END]]23; CHECK: if.end:24; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds ptr, ptr [[ARRAYIDX0]], i64 125; CHECK-NEXT: [[L1:%.*]] = load ptr, ptr [[ARRAYIDX1]], align 826; CHECK-NEXT: [[CMP4:%.*]] = icmp ugt ptr [[L1]], [[Q]]27; CHECK-NEXT: [[I_ADD]] = add nsw i32 [[I0]], 228; CHECK-NEXT: br i1 [[CMP4]], label [[LOOPEXIT1:%.*]], label [[FOR_BODY]]29; CHECK: loopexit0:30; CHECK-NEXT: [[P1:%.*]] = phi ptr [ [[ARRAYIDX0]], [[FOR_BODY]] ]31; CHECK-NEXT: br label [[RETURN]]32; CHECK: loopexit1:33; CHECK-NEXT: [[ARRAYIDX0_LCSSA:%.*]] = phi ptr [ [[ARRAYIDX0]], [[IF_END]] ]34; CHECK-NEXT: [[ARRAYIDX1_LE:%.*]] = getelementptr inbounds ptr, ptr [[ARRAYIDX0_LCSSA]], i64 135; CHECK-NEXT: br label [[RETURN]]36; CHECK: return:37; CHECK-NEXT: [[RETVAL_0:%.*]] = phi ptr [ [[P1]], [[LOOPEXIT0]] ], [ [[ARRAYIDX1_LE]], [[LOOPEXIT1]] ], [ null, [[ENTRY:%.*]] ]38; CHECK-NEXT: ret ptr [[RETVAL_0]]39;40entry:41 %cmp0 = icmp slt i32 0, %j42 br i1 %cmp0, label %for.body.lr.ph, label %return43 44for.body.lr.ph:45 br label %for.body46 47for.body:48 %P.addr = phi ptr [ %P, %for.body.lr.ph ], [ %arrayidx0, %if.end ]49 %i0 = phi i32 [ 0, %for.body.lr.ph ], [ %i.add, %if.end]50 51 %i0.ext = sext i32 %i0 to i6452 %arrayidx0 = getelementptr inbounds ptr, ptr %P.addr, i64 %i0.ext53 %l0 = load ptr, ptr %arrayidx0, align 854 %cmp1 = icmp ugt ptr %l0, %Q55 br i1 %cmp1, label %loopexit0, label %if.end56 57if.end: ; preds = %for.body58 %arrayidx1 = getelementptr inbounds ptr, ptr %arrayidx0, i64 159 %l1 = load ptr, ptr %arrayidx1, align 860 %cmp4 = icmp ugt ptr %l1, %Q61 %i.add = add nsw i32 %i0, 262 br i1 %cmp4, label %loopexit1, label %for.body63 64loopexit0:65 %p1 = phi ptr [%arrayidx0, %for.body]66 br label %return67 68loopexit1:69 %p2 = phi ptr [%arrayidx1, %if.end]70 br label %return71 72return:73 %retval.0 = phi ptr [ %p1, %loopexit0 ], [%p2, %loopexit1], [ null, %entry ]74 ret ptr %retval.075}76 77define ptr @test2(i32 %j, ptr readonly %P, ptr readnone %Q) {78; CHECK-LABEL: @test2(79; CHECK-NEXT: entry:80; CHECK-NEXT: br label [[FOR_BODY:%.*]]81; CHECK: for.cond:82; CHECK-NEXT: [[I_ADDR_0:%.*]] = phi i32 [ [[ADD_REASS:%.*]], [[IF_END:%.*]] ]83; CHECK-NEXT: [[P_ADDR_0:%.*]] = phi ptr [ [[ADD_PTR:%.*]], [[IF_END]] ]84; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[I_ADDR_0]], [[J:%.*]]85; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[LOOPEXIT0:%.*]]86; CHECK: for.body:87; CHECK-NEXT: [[P_ADDR:%.*]] = phi ptr [ [[P:%.*]], [[ENTRY:%.*]] ], [ [[P_ADDR_0]], [[FOR_COND:%.*]] ]88; CHECK-NEXT: [[I_ADDR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[I_ADDR_0]], [[FOR_COND]] ]89; CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[I_ADDR]] to i6490; CHECK-NEXT: [[ADD_PTR]] = getelementptr inbounds ptr, ptr [[P_ADDR]], i64 [[IDX_EXT]]91; CHECK-NEXT: [[L0:%.*]] = load ptr, ptr [[ADD_PTR]], align 892; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt ptr [[L0]], [[Q:%.*]]93; CHECK-NEXT: br i1 [[CMP1]], label [[LOOPEXIT1:%.*]], label [[IF_END]]94; CHECK: if.end:95; CHECK-NEXT: [[ADD_I:%.*]] = add i32 [[I_ADDR]], 196; CHECK-NEXT: [[IDX2_EXT:%.*]] = sext i32 [[ADD_I]] to i6497; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds ptr, ptr [[ADD_PTR]], i64 [[IDX2_EXT]]98; CHECK-NEXT: [[L1:%.*]] = load ptr, ptr [[ARRAYIDX2]], align 899; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt ptr [[L1]], [[Q]]100; CHECK-NEXT: [[ADD_REASS]] = add nsw i32 [[ADD_I]], 1101; CHECK-NEXT: br i1 [[CMP2]], label [[LOOPEXIT2:%.*]], label [[FOR_COND]]102; CHECK: loopexit0:103; CHECK-NEXT: [[P0:%.*]] = phi ptr [ null, [[FOR_COND]] ]104; CHECK-NEXT: br label [[RETURN:%.*]]105; CHECK: loopexit1:106; CHECK-NEXT: [[P1:%.*]] = phi ptr [ [[ADD_PTR]], [[FOR_BODY]] ]107; CHECK-NEXT: br label [[RETURN]]108; CHECK: loopexit2:109; CHECK-NEXT: [[IDX2_EXT_LCSSA:%.*]] = phi i64 [ [[IDX2_EXT]], [[IF_END]] ]110; CHECK-NEXT: [[ADD_PTR_LCSSA:%.*]] = phi ptr [ [[ADD_PTR]], [[IF_END]] ]111; CHECK-NEXT: [[ARRAYIDX2_LE:%.*]] = getelementptr inbounds ptr, ptr [[ADD_PTR_LCSSA]], i64 [[IDX2_EXT_LCSSA]]112; CHECK-NEXT: br label [[RETURN]]113; CHECK: return:114; CHECK-NEXT: [[RETVAL_0:%.*]] = phi ptr [ [[P1]], [[LOOPEXIT1]] ], [ [[ARRAYIDX2_LE]], [[LOOPEXIT2]] ], [ [[P0]], [[LOOPEXIT0]] ]115; CHECK-NEXT: ret ptr [[RETVAL_0]]116;117entry:118 br label %for.body119 120for.cond:121 %i.addr.0 = phi i32 [ %add, %if.end ]122 %P.addr.0 = phi ptr [ %add.ptr, %if.end ]123 %cmp = icmp slt i32 %i.addr.0, %j124 br i1 %cmp, label %for.body, label %loopexit0125 126for.body:127 %P.addr = phi ptr [ %P, %entry ], [ %P.addr.0, %for.cond ]128 %i.addr = phi i32 [ 0, %entry ], [ %i.addr.0, %for.cond ]129 130 %idx.ext = sext i32 %i.addr to i64131 %add.ptr = getelementptr inbounds ptr, ptr %P.addr, i64 %idx.ext132 %l0 = load ptr, ptr %add.ptr, align 8133 134 %cmp1 = icmp ugt ptr %l0, %Q135 br i1 %cmp1, label %loopexit1, label %if.end136 137if.end:138 %add.i = add i32 %i.addr, 1139 %idx2.ext = sext i32 %add.i to i64140 %arrayidx2 = getelementptr inbounds ptr, ptr %add.ptr, i64 %idx2.ext141 %l1 = load ptr, ptr %arrayidx2, align 8142 %cmp2 = icmp ugt ptr %l1, %Q143 %add = add nsw i32 %add.i, 1144 br i1 %cmp2, label %loopexit2, label %for.cond145 146loopexit0:147 %p0 = phi ptr [ null, %for.cond ]148 br label %return149 150loopexit1:151 %p1 = phi ptr [ %add.ptr, %for.body ]152 br label %return153 154loopexit2:155 %p2 = phi ptr [ %arrayidx2, %if.end ]156 br label %return157 158return:159 %retval.0 = phi ptr [ %p1, %loopexit1 ], [ %p2, %loopexit2 ], [ %p0, %loopexit0 ]160 ret ptr %retval.0161}162 163 164define ptr @test3(i64 %j, ptr readonly %P, ptr readnone %Q) {165; CHECK-LABEL: @test3(166; CHECK-NEXT: entry:167; CHECK-NEXT: [[CMP0:%.*]] = icmp slt i64 0, [[J:%.*]]168; CHECK-NEXT: br i1 [[CMP0]], label [[FOR_BODY_LR_PH:%.*]], label [[RETURN:%.*]]169; CHECK: for.body.lr.ph:170; CHECK-NEXT: br label [[FOR_BODY:%.*]]171; CHECK: for.body:172; CHECK-NEXT: [[P_ADDR:%.*]] = phi ptr [ [[P:%.*]], [[FOR_BODY_LR_PH]] ], [ [[ARRAYIDX0:%.*]], [[IF_END:%.*]] ]173; CHECK-NEXT: [[I0:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[I_ADD:%.*]], [[IF_END]] ]174; CHECK-NEXT: [[I0_EXT:%.*]] = sext i32 [[I0]] to i64175; CHECK-NEXT: [[ARRAYIDX0]] = getelementptr inbounds ptr, ptr [[P_ADDR]], i64 [[I0_EXT]]176; CHECK-NEXT: [[L0:%.*]] = load ptr, ptr [[ARRAYIDX0]], align 8177; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt ptr [[L0]], [[Q:%.*]]178; CHECK-NEXT: br i1 [[CMP1]], label [[LOOPEXIT0:%.*]], label [[IF_END]]179; CHECK: if.end:180; CHECK-NEXT: [[ADD:%.*]] = add i64 [[I0_EXT]], 1181; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[ADD]] to i32182; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds ptr, ptr [[P_ADDR]], i32 [[TRUNC]]183; CHECK-NEXT: [[L1:%.*]] = load ptr, ptr [[ARRAYIDX1]], align 8184; CHECK-NEXT: [[CMP4:%.*]] = icmp ugt ptr [[L1]], [[Q]]185; CHECK-NEXT: [[I_ADD]] = add nsw i32 [[I0]], 2186; CHECK-NEXT: br i1 [[CMP4]], label [[LOOPEXIT1:%.*]], label [[FOR_BODY]]187; CHECK: loopexit0:188; CHECK-NEXT: [[P1:%.*]] = phi ptr [ [[ARRAYIDX0]], [[FOR_BODY]] ]189; CHECK-NEXT: br label [[RETURN]]190; CHECK: loopexit1:191; CHECK-NEXT: [[TRUNC_LCSSA1:%.*]] = phi i32 [ [[TRUNC]], [[IF_END]] ]192; CHECK-NEXT: [[P_ADDR_LCSSA:%.*]] = phi ptr [ [[P_ADDR]], [[IF_END]] ]193; CHECK-NEXT: [[TRUNC_LCSSA:%.*]] = phi i32 [ [[TRUNC]], [[IF_END]] ]194; CHECK-NEXT: [[ARRAYIDX1_LE:%.*]] = getelementptr inbounds ptr, ptr [[P_ADDR_LCSSA]], i32 [[TRUNC_LCSSA1]]195; CHECK-NEXT: call void @dummy(i32 [[TRUNC_LCSSA]])196; CHECK-NEXT: br label [[RETURN]]197; CHECK: return:198; CHECK-NEXT: [[RETVAL_0:%.*]] = phi ptr [ [[P1]], [[LOOPEXIT0]] ], [ [[ARRAYIDX1_LE]], [[LOOPEXIT1]] ], [ null, [[ENTRY:%.*]] ]199; CHECK-NEXT: ret ptr [[RETVAL_0]]200;201entry:202 %cmp0 = icmp slt i64 0, %j203 br i1 %cmp0, label %for.body.lr.ph, label %return204 205for.body.lr.ph:206 br label %for.body207 208for.body:209 %P.addr = phi ptr [ %P, %for.body.lr.ph ], [ %arrayidx0, %if.end ]210 %i0 = phi i32 [ 0, %for.body.lr.ph ], [ %i.add, %if.end]211 212 %i0.ext = sext i32 %i0 to i64213 %arrayidx0 = getelementptr inbounds ptr, ptr %P.addr, i64 %i0.ext214 %l0 = load ptr, ptr %arrayidx0, align 8215 %cmp1 = icmp ugt ptr %l0, %Q216 br i1 %cmp1, label %loopexit0, label %if.end217 218if.end: ; preds = %for.body219 %add = add i64 %i0.ext, 1220 %trunc = trunc i64 %add to i32221 %arrayidx1 = getelementptr inbounds ptr, ptr %P.addr, i32 %trunc222 %l1 = load ptr, ptr %arrayidx1, align 8223 %cmp4 = icmp ugt ptr %l1, %Q224 %i.add = add nsw i32 %i0, 2225 br i1 %cmp4, label %loopexit1, label %for.body226 227loopexit0:228 %p1 = phi ptr [%arrayidx0, %for.body]229 br label %return230 231loopexit1:232 %p2 = phi ptr [%arrayidx1, %if.end]233 call void @dummy(i32 %trunc)234 br label %return235 236return:237 %retval.0 = phi ptr [ %p1, %loopexit0 ], [%p2, %loopexit1], [ null, %entry ]238 ret ptr %retval.0239}240 241declare void @dummy(i32)242