| ; 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 |
| } |
| |