[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / LoopUnrollAndJam / innerloop.ll
blobc3a4ebd6dede5fed2a7cb30911d2bea5c88e3ff3
1 ; RUN: opt -loop-unroll-and-jam -allow-unroll-and-jam -verify-loop-info < %s -S | FileCheck %s
2 ; RUN: opt -passes='loop(loop-unroll-and-jam),verify<loops>' -allow-unroll-and-jam < %s -S | FileCheck %s
4 ; Check that the newly created loops to not fail to be added to LI
5 ; This test deliberately disables UnJ on the middle loop, performing it instead on the
6 ; outer of 3 nested loops. The (new) inner loops need to be added to LI.
8 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
10 define i32 @test() {
11 ; CHECK-LABEL: test
12 ; CHECK:       for.cond17.preheader:
13 ; CHECK:    br label %for.cond20.preheader
14 ; CHECK:       for.cond20.preheader:
15 ; CHECK:    br label %for.cond23.preheader
16 ; CHECK:       for.cond23.preheader:
17 ; CHECK:    br label %for.body25
18 ; CHECK:       for.body25:
19 ; CHECK:    br i1 [[CMP24:%.*]], label %for.body25, label %for.inc45
20 ; CHECK:       for.inc45:
21 ; CHECK:    br label %for.body25.1
22 ; CHECK:       for.inc48:
23 ; CHECK:    br i1 [[CMP18_3:%.*]], label %for.cond20.preheader, label %for.end50
24 ; CHECK:       for.end50:
25 ; CHECK:    ret i32 0
26 ; CHECK:       for.body25.1:
27 ; CHECK:    br i1 [[CMP24_1:%.*]], label %for.body25.1, label %for.inc45.1
28 ; CHECK:       for.inc45.1:
29 ; CHECK:    br label %for.body25.2
30 ; CHECK:       for.body25.2:
31 ; CHECK:    br i1 [[CMP24_2:%.*]], label %for.body25.2, label %for.inc45.2
32 ; CHECK:       for.inc45.2:
33 ; CHECK:    br label %for.body25.3
34 ; CHECK:       for.body25.3:
35 ; CHECK:    br i1 [[CMP24_3:%.*]], label %for.body25.3, label %for.inc45.3
36 ; CHECK:       for.inc45.3:
37 ; CHECK:    br i1 [[CMP21_3:%.*]], label %for.cond23.preheader, label %for.inc48
39 entry:
40   %A = alloca [8 x [8 x i32]], align 16
41   %B = alloca [8 x [8 x i32]], align 16
42   %C = alloca [8 x [8 x i32]], align 16
43   br label %for.cond17.preheader
45 for.cond17.preheader:                             ; preds = %for.inc14
46   br label %for.cond20.preheader
48 for.cond20.preheader:                             ; preds = %for.cond17.preheader, %for.inc48
49   %i.13 = phi i32 [ 0, %for.cond17.preheader ], [ %inc49, %for.inc48 ]
50   br label %for.cond23.preheader
52 for.cond23.preheader:                             ; preds = %for.cond20.preheader, %for.inc45
53   %j.12 = phi i32 [ 0, %for.cond20.preheader ], [ %inc46, %for.inc45 ]
54   br label %for.body25
56 for.body25:                                       ; preds = %for.cond23.preheader, %for.body25
57   %k.01 = phi i32 [ 0, %for.cond23.preheader ], [ %inc43, %for.body25 ]
58   %idxprom26 = zext i32 %i.13 to i64
59   %idxprom28 = zext i32 %j.12 to i64
60   %arrayidx29 = getelementptr inbounds [8 x [8 x i32]], [8 x [8 x i32]]* %C, i64 0, i64 %idxprom26, i64 %idxprom28
61   %0 = load i32, i32* %arrayidx29, align 4
62   %idxprom30 = zext i32 %i.13 to i64
63   %idxprom32 = zext i32 %k.01 to i64
64   %arrayidx33 = getelementptr inbounds [8 x [8 x i32]], [8 x [8 x i32]]* %A, i64 0, i64 %idxprom30, i64 %idxprom32
65   %1 = load i32, i32* %arrayidx33, align 4
66   %idxprom34 = zext i32 %k.01 to i64
67   %idxprom36 = zext i32 %j.12 to i64
68   %arrayidx37 = getelementptr inbounds [8 x [8 x i32]], [8 x [8 x i32]]* %B, i64 0, i64 %idxprom34, i64 %idxprom36
69   %2 = load i32, i32* %arrayidx37, align 4
70   %mul = mul nsw i32 %1, %2
71   %add = add nsw i32 %0, %mul
72   %idxprom38 = zext i32 %i.13 to i64
73   %idxprom40 = zext i32 %j.12 to i64
74   %arrayidx41 = getelementptr inbounds [8 x [8 x i32]], [8 x [8 x i32]]* %C, i64 0, i64 %idxprom38, i64 %idxprom40
75   store i32 %add, i32* %arrayidx41, align 4
76   %inc43 = add nuw nsw i32 %k.01, 1
77   %cmp24 = icmp ult i32 %k.01, 7
78   br i1 %cmp24, label %for.body25, label %for.inc45
80 for.inc45:                                        ; preds = %for.body25
81   %inc46 = add nuw nsw i32 %j.12, 1
82   %cmp21 = icmp ult i32 %j.12, 7
83   br i1 %cmp21, label %for.cond23.preheader, label %for.inc48, !llvm.loop !7
85 for.inc48:                                        ; preds = %for.inc45
86   %inc49 = add nuw nsw i32 %i.13, 1
87   %cmp18 = icmp ult i32 %i.13, 7
88   br i1 %cmp18, label %for.cond20.preheader, label %for.end50, !llvm.loop !5
90 for.end50:                                        ; preds = %for.inc48
91   ret i32 0
94 !5 = distinct !{!5, !6}
95 !6 = !{!"llvm.loop.unroll_and_jam.count", i32 4}
96 !7 = distinct !{!7, !8}
97 !8 = !{!"llvm.loop.unroll_and_jam.disable"}