| Florian Hahn | c6296fe | 2018-02-14 13:13:15 +0000 | [diff] [blame^] | 1 | ; RUN: opt < %s -basicaa -loop-interchange -verify-dom-info -S | FileCheck %s | 
| Florian Hahn | 6c7f025 | 2017-07-18 09:47:06 +0000 | [diff] [blame] | 2 | ;; We test the complete .ll for adjustment in outer loop header/latch and inner loop header/latch. | 
|  | 3 |  | 
|  | 4 | target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" | 
|  | 5 | target triple = "x86_64-unknown-linux-gnu" | 
|  | 6 |  | 
|  | 7 | @A = common global [100 x [100 x i32]] zeroinitializer | 
|  | 8 | @B = common global [100 x i32] zeroinitializer | 
|  | 9 |  | 
|  | 10 | ;; Loops should not be interchanged in this case as it is not legal due to dependency. | 
|  | 11 | ;;  for(int j=0;j<99;j++) | 
|  | 12 | ;;   for(int i=0;i<99;i++) | 
|  | 13 | ;;       A[j][i+1] = A[j+1][i]+k; | 
|  | 14 |  | 
|  | 15 | define void @interchange_04(i32 %k){ | 
|  | 16 | entry: | 
|  | 17 | br label %for.cond1.preheader | 
|  | 18 |  | 
|  | 19 | for.cond1.preheader: | 
|  | 20 | %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for.inc12 ] | 
|  | 21 | %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1 | 
|  | 22 | br label %for.body3 | 
|  | 23 |  | 
|  | 24 | for.body3: | 
|  | 25 | %indvars.iv = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next, %for.body3 ] | 
|  | 26 | %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv.next24, i64 %indvars.iv | 
|  | 27 | %0 = load i32, i32* %arrayidx5 | 
|  | 28 | %add6 = add nsw i32 %0, %k | 
|  | 29 | %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 | 
|  | 30 | %arrayidx11 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv23, i64 %indvars.iv.next | 
|  | 31 | store i32 %add6, i32* %arrayidx11 | 
|  | 32 | %exitcond = icmp eq i64 %indvars.iv.next, 99 | 
|  | 33 | br i1 %exitcond, label %for.inc12, label %for.body3 | 
|  | 34 |  | 
|  | 35 | for.inc12: | 
|  | 36 | %exitcond25 = icmp eq i64 %indvars.iv.next24, 99 | 
|  | 37 | br i1 %exitcond25, label %for.end14, label %for.cond1.preheader | 
|  | 38 |  | 
|  | 39 | for.end14: | 
|  | 40 | ret void | 
|  | 41 | } | 
|  | 42 |  | 
|  | 43 | ; CHECK-LABEL: @interchange_04 | 
|  | 44 | ; CHECK: entry: | 
|  | 45 | ; CHECK:   br label %for.cond1.preheader | 
|  | 46 | ; CHECK: for.cond1.preheader:                              ; preds = %for.inc12, %entry | 
|  | 47 | ; CHECK:   %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for.inc12 ] | 
|  | 48 | ; CHECK:   %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1 | 
|  | 49 | ; CHECK:   br label %for.body3 | 
|  | 50 | ; CHECK: for.body3:                                        ; preds = %for.body3, %for.cond1.preheader | 
|  | 51 | ; CHECK:   %indvars.iv = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next, %for.body3 ] | 
|  | 52 | ; CHECK:   %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv.next24, i64 %indvars.iv | 
|  | 53 | ; CHECK:   %0 = load i32, i32* %arrayidx5 | 
|  | 54 | ; CHECK:   %add6 = add nsw i32 %0, %k | 
|  | 55 | ; CHECK:   %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 | 
|  | 56 | ; CHECK:   %arrayidx11 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv23, i64 %indvars.iv.next | 
|  | 57 | ; CHECK:   store i32 %add6, i32* %arrayidx11 | 
|  | 58 | ; CHECK:   %exitcond = icmp eq i64 %indvars.iv.next, 99 | 
|  | 59 | ; CHECK:   br i1 %exitcond, label %for.inc12, label %for.body3 | 
|  | 60 | ; CHECK: for.inc12:                                        ; preds = %for.body3 | 
|  | 61 | ; CHECK:   %exitcond25 = icmp eq i64 %indvars.iv.next24, 99 | 
|  | 62 | ; CHECK:   br i1 %exitcond25, label %for.end14, label %for.cond1.preheader | 
|  | 63 | ; CHECK: for.end14:                                        ; preds = %for.inc12 | 
|  | 64 | ; CHECK:   ret void |