@@ -80,6 +80,103 @@ exit:
80
80
ret i64 %iv
81
81
}
82
82
83
+ ; Do not compute exhaustive trip count based on FP constant folding if the
84
+ ; involved operation has nsz or one of the algebraic FMF flags (reassoc, arcp,
85
+ ; contract) set. The examples in the following are dummies and don't illustrate
86
+ ; real cases where FMF transforms could cause issues.
87
+
88
+ define i64 @test_fp_nsz () {
89
+ ; CHECK-LABEL: 'test_fp_nsz'
90
+ ; CHECK-NEXT: Determining loop execution counts for: @test_fp_nsz
91
+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
92
+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
93
+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
94
+ ;
95
+ entry:
96
+ br label %loop
97
+
98
+ loop:
99
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
100
+ %fv = phi double [ 1 .000000e+00 , %entry ], [ %fv.next , %loop ]
101
+ call void @use (double %fv )
102
+ %fv.next = fadd nsz double %fv , 1 .0
103
+ %iv.next = add i64 %iv , 1
104
+ %fcmp = fcmp une double %fv , 100 .0
105
+ br i1 %fcmp , label %loop , label %exit
106
+
107
+ exit:
108
+ ret i64 %iv
109
+ }
110
+
111
+ define i64 @test_fp_reassoc () {
112
+ ; CHECK-LABEL: 'test_fp_reassoc'
113
+ ; CHECK-NEXT: Determining loop execution counts for: @test_fp_reassoc
114
+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
115
+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
116
+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
117
+ ;
118
+ entry:
119
+ br label %loop
120
+
121
+ loop:
122
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
123
+ %fv = phi double [ 1 .000000e+00 , %entry ], [ %fv.next , %loop ]
124
+ call void @use (double %fv )
125
+ %fv.next = fadd reassoc double %fv , 1 .0
126
+ %iv.next = add i64 %iv , 1
127
+ %fcmp = fcmp une double %fv , 100 .0
128
+ br i1 %fcmp , label %loop , label %exit
129
+
130
+ exit:
131
+ ret i64 %iv
132
+ }
133
+
134
+ define i64 @test_fp_arcp () {
135
+ ; CHECK-LABEL: 'test_fp_arcp'
136
+ ; CHECK-NEXT: Determining loop execution counts for: @test_fp_arcp
137
+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
138
+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
139
+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
140
+ ;
141
+ entry:
142
+ br label %loop
143
+
144
+ loop:
145
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
146
+ %fv = phi double [ 1 .000000e+00 , %entry ], [ %fv.next , %loop ]
147
+ call void @use (double %fv )
148
+ %fv.next = fadd arcp double %fv , 1 .0
149
+ %iv.next = add i64 %iv , 1
150
+ %fcmp = fcmp une double %fv , 100 .0
151
+ br i1 %fcmp , label %loop , label %exit
152
+
153
+ exit:
154
+ ret i64 %iv
155
+ }
156
+
157
+ define i64 @test_fp_contract () {
158
+ ; CHECK-LABEL: 'test_fp_contract'
159
+ ; CHECK-NEXT: Determining loop execution counts for: @test_fp_contract
160
+ ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.
161
+ ; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
162
+ ; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
163
+ ;
164
+ entry:
165
+ br label %loop
166
+
167
+ loop:
168
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
169
+ %fv = phi double [ 1 .000000e+00 , %entry ], [ %fv.next , %loop ]
170
+ call void @use (double %fv )
171
+ %fv.next = fadd contract double %fv , 1 .0
172
+ %iv.next = add i64 %iv , 1
173
+ %fcmp = fcmp une double %fv , 100 .0
174
+ br i1 %fcmp , label %loop , label %exit
175
+
176
+ exit:
177
+ ret i64 %iv
178
+ }
179
+
83
180
declare void @dummy ()
84
181
declare void @use (double %i )
85
182
declare double @llvm.sin.f64 (double )
0 commit comments