@@ -73,4 +73,54 @@ define i64 @vscale_exact_range() vscale_range(2) {
73
73
ret i64 %vscale
74
74
}
75
75
76
+ define void @vscale_step_ne_tripcount (i64 %N ) vscale_range(2 , 1024 ) {
77
+ ; CHECK-LABEL: 'vscale_step_ne_tripcount'
78
+ ; CHECK-NEXT: Classifying expressions for: @vscale_step_ne_tripcount
79
+ ; CHECK-NEXT: %0 = sub i64 -1, %N
80
+ ; CHECK-NEXT: --> (-1 + (-1 * %N)) U: full-set S: full-set
81
+ ; CHECK-NEXT: %1 = call i64 @llvm.vscale.i64()
82
+ ; CHECK-NEXT: --> vscale U: [2,1025) S: [2,1025)
83
+ ; CHECK-NEXT: %2 = mul i64 %1, 4
84
+ ; CHECK-NEXT: --> (4 * vscale)<nuw><nsw> U: [8,4097) S: [8,4097)
85
+ ; CHECK-NEXT: %4 = sub i64 %2, 1
86
+ ; CHECK-NEXT: --> (-1 + (4 * vscale)<nuw><nsw>)<nsw> U: [7,4096) S: [7,4096)
87
+ ; CHECK-NEXT: %n.rnd.up = add i64 %N, %4
88
+ ; CHECK-NEXT: --> (-1 + (4 * vscale)<nuw><nsw> + %N) U: full-set S: full-set
89
+ ; CHECK-NEXT: %n.mod.vf = urem i64 %n.rnd.up, %2
90
+ ; CHECK-NEXT: --> (-1 + (vscale * (4 + (-4 * ((-1 + (4 * vscale)<nuw><nsw> + %N) /u (4 * vscale)<nuw><nsw>))<nsw>)<nsw>) + %N) U: full-set S: full-set
91
+ ; CHECK-NEXT: %n.vec = sub i64 %n.rnd.up, %n.mod.vf
92
+ ; CHECK-NEXT: --> (4 * vscale * ((-1 + (4 * vscale)<nuw><nsw> + %N) /u (4 * vscale)<nuw><nsw>)) U: [0,-3) S: [-9223372036854775808,9223372036854775805)
93
+ ; CHECK-NEXT: %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
94
+ ; CHECK-NEXT: --> {0,+,(4 * vscale)<nuw><nsw>}<nuw><%vector.body> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: <<Unknown>> LoopDispositions: { %vector.body: Computable }
95
+ ; CHECK-NEXT: %index.next = add nuw i64 %index, %2
96
+ ; CHECK-NEXT: --> {(4 * vscale)<nuw><nsw>,+,(4 * vscale)<nuw><nsw>}<nuw><%vector.body> U: [8,-3) S: [-9223372036854775808,9223372036854775805) Exits: <<Unknown>> LoopDispositions: { %vector.body: Computable }
97
+ ; CHECK-NEXT: Determining loop execution counts for: @vscale_step_ne_tripcount
98
+ ; CHECK-NEXT: Loop %vector.body: Unpredictable backedge-taken count.
99
+ ; CHECK-NEXT: Loop %vector.body: Unpredictable constant max backedge-taken count.
100
+ ; CHECK-NEXT: Loop %vector.body: Unpredictable symbolic max backedge-taken count.
101
+ ;
102
+ entry:
103
+ %0 = sub i64 -1 , %N
104
+ %1 = call i64 @llvm.vscale.i64 ()
105
+ %2 = mul i64 %1 , 4
106
+ %3 = icmp ult i64 %0 , %2
107
+ br i1 %3 , label %loop.exit , label %vector.ph
108
+
109
+ vector.ph: ; preds = %entry
110
+ %8 = sub i64 %2 , 1
111
+ %n.rnd.up = add i64 %N , %8
112
+ %n.mod.vf = urem i64 %n.rnd.up , %2
113
+ %n.vec = sub i64 %n.rnd.up , %n.mod.vf
114
+ br label %vector.body
115
+
116
+ vector.body: ; preds = %vector.body, %vector.ph
117
+ %index = phi i64 [ 0 , %vector.ph ], [ %index.next , %vector.body ]
118
+ %index.next = add nuw i64 %index , %2
119
+ %22 = icmp eq i64 %index.next , %n.vec
120
+ br i1 %22 , label %loop.exit , label %vector.body
121
+
122
+ loop.exit:
123
+ ret void
124
+ }
125
+
76
126
declare i64 @llvm.vscale.i64 ()
0 commit comments