diff --git a/llvm/test/Analysis/ScalarEvolution/trip-count-implied-offset.ll b/llvm/test/Analysis/ScalarEvolution/trip-count-implied-offset.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Analysis/ScalarEvolution/trip-count-implied-offset.ll @@ -0,0 +1,69 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py +; RUN: opt < %s "-passes=print" -disable-output -S 2>&1 | FileCheck %s + +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" +target triple = "aarch64-unknown-linux-gnu" + +define dso_local void @cal_sparseMV(i32 noundef %nCells, ptr nocapture noundef readonly %x, ptr nocapture noundef writeonly %b, ptr nocapture noundef readonly %values, i32 noundef %max_row_length, ptr nocapture noundef readonly %col_index) local_unnamed_addr { +; CHECK-LABEL: 'cal_sparseMV' +; CHECK: Determining loop execution counts for: @cal_sparseMV +; CHECK: Loop %for.body4: backedge-taken count is ({-1,+,(-1 * %max_row_length)}<%for.cond1.preheader> + ({1,+,%max_row_length}<%for.cond1.preheader> smax {%max_row_length,+,%max_row_length}<%for.cond1.preheader>)) +; CHECK: Loop %for.body4: constant max backedge-taken count is -1 +; CHECK: Loop %for.body4: symbolic max backedge-taken count is ({-1,+,(-1 * %max_row_length)}<%for.cond1.preheader> + ({1,+,%max_row_length}<%for.cond1.preheader> smax {%max_row_length,+,%max_row_length}<%for.cond1.preheader>)) +; CHECK: Loop %for.body4: Predicated backedge-taken count is ({-1,+,(-1 * %max_row_length)}<%for.cond1.preheader> + ({1,+,%max_row_length}<%for.cond1.preheader> smax {%max_row_length,+,%max_row_length}<%for.cond1.preheader>)) +; +entry: + %cmp28 = icmp sgt i32 %nCells, 0 + br i1 %cmp28, label %for.cond1.preheader.preheader, label %for.cond.cleanup + +for.cond1.preheader.preheader: ; preds = %entry + br label %for.cond1.preheader + +for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.cond.cleanup3 + %i.030 = phi i32 [ %inc13, %for.cond.cleanup3 ], [ 0, %for.cond1.preheader.preheader ] + %value_index.029 = phi i32 [ %add, %for.cond.cleanup3 ], [ 0, %for.cond1.preheader.preheader ] + %add = add nsw i32 %value_index.029, %max_row_length + %cmp224 = icmp sgt i32 %max_row_length, 0 + br i1 %cmp224, label %for.body4.preheader, label %for.cond.cleanup3 + +for.body4.preheader: ; preds = %for.cond1.preheader + br label %for.body4 + +for.cond.cleanup.loopexit: ; preds = %for.cond.cleanup3 + br label %for.cond.cleanup + +for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry + ret void + +for.cond.cleanup3.loopexit: ; preds = %for.body4 + %.lcssa = phi double [ %3, %for.body4 ] + br label %for.cond.cleanup3 + +for.cond.cleanup3: ; preds = %for.cond.cleanup3.loopexit, %for.cond1.preheader + %temp_value.0.lcssa = phi double [ 0.000000e+00, %for.cond1.preheader ], [ %.lcssa, %for.cond.cleanup3.loopexit ] + %idxprom10 = zext i32 %i.030 to i64 + %arrayidx11 = getelementptr inbounds double, ptr %b, i64 %idxprom10 + store double %temp_value.0.lcssa, ptr %arrayidx11, align 8 + %inc13 = add nuw nsw i32 %i.030, 1 + %cmp = icmp slt i32 %inc13, %nCells + br i1 %cmp, label %for.cond1.preheader, label %for.cond.cleanup.loopexit + +for.body4: ; preds = %for.body4.preheader, %for.body4 + %j.026 = phi i32 [ %inc, %for.body4 ], [ %value_index.029, %for.body4.preheader ] + %temp_value.025 = phi double [ %3, %for.body4 ], [ 0.000000e+00, %for.body4.preheader ] + %idxprom = sext i32 %j.026 to i64 + %arrayidx = getelementptr inbounds double, ptr %values, i64 %idxprom + %0 = load double, ptr %arrayidx, align 8 + %arrayidx6 = getelementptr inbounds i32, ptr %col_index, i64 %idxprom + %1 = load i32, ptr %arrayidx6, align 4 + %idxprom7 = sext i32 %1 to i64 + %arrayidx8 = getelementptr inbounds double, ptr %x, i64 %idxprom7 + %2 = load double, ptr %arrayidx8, align 8 + %3 = tail call double @llvm.fmuladd.f64(double %0, double %2, double %temp_value.025) + %inc = add nsw i32 %j.026, 1 + %cmp2 = icmp slt i32 %inc, %add + br i1 %cmp2, label %for.body4, label %for.cond.cleanup3.loopexit +} + +declare double @llvm.fmuladd.f64(double, double, double) +