| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt < %s -passes=loop-interchange -cache-line-size=64 -S | FileCheck %s | |
| define void @pr48212(ptr %filter) { | |
| ; CHECK-LABEL: define void @pr48212( | |
| ; CHECK-SAME: ptr [[FILTER:%.*]]) { | |
| ; CHECK-NEXT: [[ENTRY:.*:]] | |
| ; CHECK-NEXT: br label %[[L2:.*]] | |
| ; CHECK: [[L1:.*]]: | |
| ; CHECK-NEXT: br label %[[FOR_BODY:.*]] | |
| ; CHECK: [[FOR_BODY]]: | |
| ; CHECK-NEXT: [[K1_03:%.*]] = phi i32 [ 0, %[[L1]] ], [ [[INC7:%.*]], %[[FOR_INC6:.*]] ] | |
| ; CHECK-NEXT: [[TEMP_12:%.*]] = phi i32 [ [[TEMP_04:%.*]], %[[L1]] ], [ [[ADD:%.*]], %[[FOR_INC6]] ] | |
| ; CHECK-NEXT: br label %[[FOR_BODY3_SPLIT:.*]] | |
| ; CHECK: [[L2]]: | |
| ; CHECK-NEXT: br label %[[FOR_BODY3:.*]] | |
| ; CHECK: [[FOR_BODY3]]: | |
| ; CHECK-NEXT: [[K2_01:%.*]] = phi i32 [ 0, %[[L2]] ], [ [[TMP1:%.*]], %[[FOR_INC_SPLIT:.*]] ] | |
| ; CHECK-NEXT: [[TEMP_04]] = phi i32 [ undef, %[[L2]] ], [ [[TEMP_1_LCSSA:%.*]], %[[FOR_INC_SPLIT]] ] | |
| ; CHECK-NEXT: br label %[[L1]] | |
| ; CHECK: [[FOR_BODY3_SPLIT]]: | |
| ; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[K2_01]] to i64 | |
| ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [5 x i32], ptr [[FILTER]], i64 [[IDXPROM]] | |
| ; CHECK-NEXT: [[IDXPROM4:%.*]] = sext i32 [[K1_03]] to i64 | |
| ; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds [5 x i32], ptr [[ARRAYIDX]], i64 0, i64 [[IDXPROM4]] | |
| ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX5]], align 4 | |
| ; CHECK-NEXT: [[ADD]] = add i32 [[TEMP_12]], [[TMP0]] | |
| ; CHECK-NEXT: br label %[[FOR_INC:.*]] | |
| ; CHECK: [[FOR_INC]]: | |
| ; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[K2_01]], 1 | |
| ; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[INC]], 3 | |
| ; CHECK-NEXT: br label %[[FOR_END:.*]] | |
| ; CHECK: [[FOR_INC_SPLIT]]: | |
| ; CHECK-NEXT: [[TEMP_1_LCSSA]] = phi i32 [ [[ADD]], %[[FOR_INC6]] ] | |
| ; CHECK-NEXT: [[TMP1]] = add nsw i32 [[K2_01]], 1 | |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 3 | |
| ; CHECK-NEXT: br i1 [[TMP2]], label %[[FOR_BODY3]], label %[[FOR_END8:.*]] | |
| ; CHECK: [[FOR_END]]: | |
| ; CHECK-NEXT: br label %[[FOR_INC6]] | |
| ; CHECK: [[FOR_INC6]]: | |
| ; CHECK-NEXT: [[INC7]] = add nsw i32 [[K1_03]], 1 | |
| ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[INC7]], 5 | |
| ; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY]], label %[[FOR_INC_SPLIT]] | |
| ; CHECK: [[FOR_END8]]: | |
| ; CHECK-NEXT: ret void | |
| ; | |
| entry: | |
| br label %L1 | |
| L1: ; preds = %entry | |
| br label %for.body | |
| for.body: ; preds = %L1, %for.inc6 | |
| %temp.04 = phi i32 [ undef, %L1 ], [ %temp.1.lcssa, %for.inc6 ] | |
| %k1.03 = phi i32 [ 0, %L1 ], [ %inc7, %for.inc6 ] | |
| br label %L2 | |
| L2: ; preds = %for.body | |
| br label %for.body3 | |
| for.body3: ; preds = %L2, %for.inc | |
| %temp.12 = phi i32 [ %temp.04, %L2 ], [ %add, %for.inc ] | |
| %k2.01 = phi i32 [ 0, %L2 ], [ %inc, %for.inc ] | |
| %idxprom = sext i32 %k2.01 to i64 | |
| %arrayidx = getelementptr inbounds [5 x i32], ptr %filter, i64 %idxprom | |
| %idxprom4 = sext i32 %k1.03 to i64 | |
| %arrayidx5 = getelementptr inbounds [5 x i32], ptr %arrayidx, i64 0, i64 %idxprom4 | |
| %0 = load i32, ptr %arrayidx5 | |
| %add = add nsw i32 %temp.12, %0 | |
| br label %for.inc | |
| for.inc: ; preds = %for.body3 | |
| %inc = add nsw i32 %k2.01, 1 | |
| %cmp2 = icmp slt i32 %inc, 3 | |
| br i1 %cmp2, label %for.body3, label %for.end | |
| for.end: ; preds = %for.inc | |
| %temp.1.lcssa = phi i32 [ %add, %for.inc ] | |
| br label %for.inc6 | |
| for.inc6: ; preds = %for.end | |
| %inc7 = add nsw i32 %k1.03, 1 | |
| %cmp = icmp slt i32 %inc7, 5 | |
| br i1 %cmp, label %for.body, label %for.end8 | |
| for.end8: ; preds = %for.inc6 | |
| ret void | |
| } | |