| ; RUN: opt < %s -passes=loop-interchange --pass-remarks-missed=loop-interchange -disable-output 2>&1 | FileCheck %s |
| ; RUN: opt < %s -passes=loop-interchange --pass-remarks-missed=loop-interchange -loop-interchange-max-meminstr-count=75 |
| ; -disable-output 2>&1 | FileCheck --check-prefix=CHECK-INSTR-COUNT %s |
| target triple = "aarch64-unknown-linux-gnu" |
| |
| @A = dso_local local_unnamed_addr global [2048 x [2048 x i32]] zeroinitializer, align 4 |
| @B = dso_local local_unnamed_addr global [2048 x [2048 x i32]] zeroinitializer, align 4 |
| @C = dso_local local_unnamed_addr global [2048 x [2048 x i32]] zeroinitializer, align 4 |
| |
| ; CHECK: Number of loads/stores exceeded, the supported maximum |
| ; can be increased with option -loop-interchange-maxmeminstr-count. |
| ; CHECK-INSTR-COUNT-NOT: Number of loads/stores exceeded, the supported maximum |
| ; can be increased with option -loop-interchange-maxmeminstr-count. |
| define dso_local noundef i32 @many_load_stores() { |
| br label %1 |
| |
| 1: ; preds = %9, %0 |
| %2 = phi i32 [ 0, %0 ], [ %10, %9 ] |
| %3 = icmp slt i32 %2, 2048 |
| br i1 %3, label %5, label %4 |
| |
| 4: ; preds = %1 |
| ret i32 0 |
| |
| 5: ; preds = %1 |
| br label %6 |
| |
| 6: ; preds = %11, %5 |
| %7 = phi i32 [ 0, %5 ], [ %208, %11 ] |
| %8 = icmp slt i32 %7, 85 |
| br i1 %8, label %11, label %9 |
| |
| 9: ; preds = %6 |
| %10 = add nsw i32 %2, 1 |
| br label %1 |
| |
| 11: ; preds = %6 |
| %12 = sext i32 %2 to i64 |
| %13 = getelementptr inbounds [2048 x [2048 x i32]], [2048 x [2048 x i32]]* @B, i64 0, i64 %12 |
| %14 = sext i32 %7 to i64 |
| %15 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %14 |
| %16 = load i32, i32* %15, align 4 |
| %17 = getelementptr inbounds [2048 x [2048 x i32]], [2048 x [2048 x i32]]* @C, i64 0, i64 %12 |
| %18 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %14 |
| %19 = load i32, i32* %18, align 4 |
| %20 = add nsw i32 %16, %19 |
| %21 = getelementptr inbounds [2048 x [2048 x i32]], [2048 x [2048 x i32]]* @A, i64 0, i64 %12 |
| %22 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %14 |
| store i32 %20, i32* %22, align 4 |
| %23 = add nsw i32 %7, 1 |
| %24 = sext i32 %23 to i64 |
| %25 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %24 |
| %26 = load i32, i32* %25, align 4 |
| %27 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %24 |
| %28 = load i32, i32* %27, align 4 |
| %29 = add nsw i32 %26, %28 |
| %30 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %24 |
| store i32 %29, i32* %30, align 4 |
| %31 = add nsw i32 %23, 1 |
| %32 = sext i32 %31 to i64 |
| %33 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %32 |
| %34 = load i32, i32* %33, align 4 |
| %35 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %32 |
| %36 = load i32, i32* %35, align 4 |
| %37 = add nsw i32 %34, %36 |
| %38 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %32 |
| store i32 %37, i32* %38, align 4 |
| %39 = add nsw i32 %31, 1 |
| %40 = sext i32 %39 to i64 |
| %41 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %40 |
| %42 = load i32, i32* %41, align 4 |
| %43 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %40 |
| %44 = load i32, i32* %43, align 4 |
| %45 = add nsw i32 %42, %44 |
| %46 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %40 |
| store i32 %45, i32* %46, align 4 |
| %47 = add nsw i32 %39, 1 |
| %48 = sext i32 %47 to i64 |
| %49 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %48 |
| %50 = load i32, i32* %49, align 4 |
| %51 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %48 |
| %52 = load i32, i32* %51, align 4 |
| %53 = add nsw i32 %50, %52 |
| %54 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %48 |
| store i32 %53, i32* %54, align 4 |
| %55 = add nsw i32 %47, 1 |
| %56 = sext i32 %55 to i64 |
| %57 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %56 |
| %58 = load i32, i32* %57, align 4 |
| %59 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %56 |
| %60 = load i32, i32* %59, align 4 |
| %61 = add nsw i32 %58, %60 |
| %62 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %56 |
| store i32 %61, i32* %62, align 4 |
| %63 = add nsw i32 %55, 1 |
| %64 = sext i32 %63 to i64 |
| %65 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %64 |
| %66 = load i32, i32* %65, align 4 |
| %67 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %64 |
| %68 = load i32, i32* %67, align 4 |
| %69 = add nsw i32 %66, %68 |
| %70 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %64 |
| store i32 %69, i32* %70, align 4 |
| %71 = add nsw i32 %63, 1 |
| %72 = sext i32 %71 to i64 |
| %73 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %72 |
| %74 = load i32, i32* %73, align 4 |
| %75 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %72 |
| %76 = load i32, i32* %75, align 4 |
| %77 = add nsw i32 %74, %76 |
| %78 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %72 |
| store i32 %77, i32* %78, align 4 |
| %79 = add nsw i32 %71, 1 |
| %80 = sext i32 %79 to i64 |
| %81 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %80 |
| %82 = load i32, i32* %81, align 4 |
| %83 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %80 |
| %84 = load i32, i32* %83, align 4 |
| %85 = add nsw i32 %82, %84 |
| %86 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %80 |
| store i32 %85, i32* %86, align 4 |
| %87 = add nsw i32 %79, 1 |
| %88 = sext i32 %87 to i64 |
| %89 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %88 |
| %90 = load i32, i32* %89, align 4 |
| %91 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %88 |
| %92 = load i32, i32* %91, align 4 |
| %93 = add nsw i32 %90, %92 |
| %94 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %88 |
| store i32 %93, i32* %94, align 4 |
| %95 = add nsw i32 %87, 1 |
| %96 = sext i32 %95 to i64 |
| %97 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %96 |
| %98 = load i32, i32* %97, align 4 |
| %99 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %96 |
| %100 = load i32, i32* %99, align 4 |
| %101 = add nsw i32 %98, %100 |
| %102 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %96 |
| store i32 %101, i32* %102, align 4 |
| %103 = add nsw i32 %95, 1 |
| %104 = sext i32 %103 to i64 |
| %105 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %104 |
| %106 = load i32, i32* %105, align 4 |
| %107 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %104 |
| %108 = load i32, i32* %107, align 4 |
| %109 = add nsw i32 %106, %108 |
| %110 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %104 |
| store i32 %109, i32* %110, align 4 |
| %111 = add nsw i32 %103, 1 |
| %112 = sext i32 %111 to i64 |
| %113 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %112 |
| %114 = load i32, i32* %113, align 4 |
| %115 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %112 |
| %116 = load i32, i32* %115, align 4 |
| %117 = add nsw i32 %114, %116 |
| %118 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %112 |
| store i32 %117, i32* %118, align 4 |
| %119 = add nsw i32 %111, 1 |
| %120 = sext i32 %119 to i64 |
| %121 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %120 |
| %122 = load i32, i32* %121, align 4 |
| %123 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %120 |
| %124 = load i32, i32* %123, align 4 |
| %125 = add nsw i32 %122, %124 |
| %126 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %120 |
| store i32 %125, i32* %126, align 4 |
| %127 = add nsw i32 %119, 1 |
| %128 = sext i32 %127 to i64 |
| %129 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %128 |
| %130 = load i32, i32* %129, align 4 |
| %131 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %128 |
| %132 = load i32, i32* %131, align 4 |
| %133 = add nsw i32 %130, %132 |
| %134 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %128 |
| store i32 %133, i32* %134, align 4 |
| %135 = add nsw i32 %127, 1 |
| %136 = sext i32 %135 to i64 |
| %137 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %136 |
| %138 = load i32, i32* %137, align 4 |
| %139 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %136 |
| %140 = load i32, i32* %139, align 4 |
| %141 = add nsw i32 %138, %140 |
| %142 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %136 |
| store i32 %141, i32* %142, align 4 |
| %143 = add nsw i32 %135, 1 |
| %144 = sext i32 %143 to i64 |
| %145 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %144 |
| %146 = load i32, i32* %145, align 4 |
| %147 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %144 |
| %148 = load i32, i32* %147, align 4 |
| %149 = add nsw i32 %146, %148 |
| %150 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %144 |
| store i32 %149, i32* %150, align 4 |
| %151 = add nsw i32 %143, 1 |
| %152 = sext i32 %151 to i64 |
| %153 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %152 |
| %154 = load i32, i32* %153, align 4 |
| %155 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %152 |
| %156 = load i32, i32* %155, align 4 |
| %157 = add nsw i32 %154, %156 |
| %158 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %152 |
| store i32 %157, i32* %158, align 4 |
| %159 = add nsw i32 %151, 1 |
| %160 = sext i32 %159 to i64 |
| %161 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %160 |
| %162 = load i32, i32* %161, align 4 |
| %163 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %160 |
| %164 = load i32, i32* %163, align 4 |
| %165 = add nsw i32 %162, %164 |
| %166 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %160 |
| store i32 %165, i32* %166, align 4 |
| %167 = add nsw i32 %159, 1 |
| %168 = sext i32 %167 to i64 |
| %169 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %168 |
| %170 = load i32, i32* %169, align 4 |
| %171 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %168 |
| %172 = load i32, i32* %171, align 4 |
| %173 = add nsw i32 %170, %172 |
| %174 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %168 |
| store i32 %173, i32* %174, align 4 |
| %175 = add nsw i32 %167, 1 |
| %176 = sext i32 %175 to i64 |
| %177 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %176 |
| %178 = load i32, i32* %177, align 4 |
| %179 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %176 |
| %180 = load i32, i32* %179, align 4 |
| %181 = add nsw i32 %178, %180 |
| %182 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %176 |
| store i32 %181, i32* %182, align 4 |
| %183 = add nsw i32 %175, 1 |
| %184 = sext i32 %183 to i64 |
| %185 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %184 |
| %186 = load i32, i32* %185, align 4 |
| %187 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %184 |
| %188 = load i32, i32* %187, align 4 |
| %189 = add nsw i32 %186, %188 |
| %190 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %184 |
| store i32 %189, i32* %190, align 4 |
| %191 = add nsw i32 %183, 1 |
| %192 = sext i32 %191 to i64 |
| %193 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %192 |
| %194 = load i32, i32* %193, align 4 |
| %195 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %192 |
| %196 = load i32, i32* %195, align 4 |
| %197 = add nsw i32 %194, %196 |
| %198 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %192 |
| store i32 %197, i32* %198, align 4 |
| %199 = add nsw i32 %191, 1 |
| %200 = sext i32 %199 to i64 |
| %201 = getelementptr inbounds [2048 x i32], [2048 x i32]* %13, i64 0, i64 %200 |
| %202 = load i32, i32* %201, align 4 |
| %203 = getelementptr inbounds [2048 x i32], [2048 x i32]* %17, i64 0, i64 %200 |
| %204 = load i32, i32* %203, align 4 |
| %205 = add nsw i32 %202, %204 |
| %206 = getelementptr inbounds [2048 x i32], [2048 x i32]* %21, i64 0, i64 %200 |
| store i32 %205, i32* %206, align 4 |
| %207 = add nsw i32 %199, 1 |
| %208 = add nsw i32 %207, 24 |
| br label %6 |
| } |