Skip to content

Commit 42902d2

Browse files
committed
[InstCombine] Add tests for x / sqrt(y / z) with fast-math
1 parent 8e707f8 commit 42902d2

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3+
4+
declare double @llvm.sqrt.f64(double)
5+
6+
define double @sqrt_div_fast(double %x, double %y, double %z) {
7+
; CHECK-LABEL: @sqrt_div_fast(
8+
; CHECK-NEXT: entry:
9+
; CHECK-NEXT: [[DIV:%.*]] = fdiv fast double [[Y:%.*]], [[Z:%.*]]
10+
; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[DIV]])
11+
; CHECK-NEXT: [[DIV1:%.*]] = fdiv fast double [[X:%.*]], [[SQRT]]
12+
; CHECK-NEXT: ret double [[DIV1]]
13+
;
14+
entry:
15+
%div = fdiv fast double %y, %z
16+
%sqrt = call fast double @llvm.sqrt.f64(double %div)
17+
%div1 = fdiv fast double %x, %sqrt
18+
ret double %div1
19+
}
20+
21+
define double @sqrt_div(double %x, double %y, double %z) {
22+
; CHECK-LABEL: @sqrt_div(
23+
; CHECK-NEXT: entry:
24+
; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[Y:%.*]], [[Z:%.*]]
25+
; CHECK-NEXT: [[SQRT:%.*]] = call double @llvm.sqrt.f64(double [[DIV]])
26+
; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[X:%.*]], [[SQRT]]
27+
; CHECK-NEXT: ret double [[DIV1]]
28+
;
29+
entry:
30+
%div = fdiv double %y, %z
31+
%sqrt = call double @llvm.sqrt.f64(double %div)
32+
%div1 = fdiv double %x, %sqrt
33+
ret double %div1
34+
}
35+
36+
define double @sqrt_div_reassoc_arcp(double %x, double %y, double %z) {
37+
; CHECK-LABEL: @sqrt_div_reassoc_arcp(
38+
; CHECK-NEXT: entry:
39+
; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]]
40+
; CHECK-NEXT: [[SQRT:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[DIV]])
41+
; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc arcp double [[X:%.*]], [[SQRT]]
42+
; CHECK-NEXT: ret double [[DIV1]]
43+
;
44+
entry:
45+
%div = fdiv reassoc arcp double %y, %z
46+
%sqrt = call reassoc arcp double @llvm.sqrt.f64(double %div)
47+
%div1 = fdiv reassoc arcp double %x, %sqrt
48+
ret double %div1
49+
}
50+
51+
declare void @use(double)
52+
define double @sqrt_div_fast_multiple_uses_1(double %x, double %y, double %z) {
53+
; CHECK-LABEL: @sqrt_div_fast_multiple_uses_1(
54+
; CHECK-NEXT: entry:
55+
; CHECK-NEXT: [[DIV:%.*]] = fdiv fast double [[Y:%.*]], [[Z:%.*]]
56+
; CHECK-NEXT: call void @use(double [[DIV]])
57+
; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[DIV]])
58+
; CHECK-NEXT: [[DIV1:%.*]] = fdiv fast double [[X:%.*]], [[SQRT]]
59+
; CHECK-NEXT: ret double [[DIV1]]
60+
;
61+
entry:
62+
%div = fdiv fast double %y, %z
63+
call void @use(double %div)
64+
%sqrt = call fast double @llvm.sqrt.f64(double %div)
65+
%div1 = fdiv fast double %x, %sqrt
66+
ret double %div1
67+
}
68+
69+
define double @sqrt_div_fast_multiple_uses_2(double %x, double %y, double %z) {
70+
; CHECK-LABEL: @sqrt_div_fast_multiple_uses_2(
71+
; CHECK-NEXT: entry:
72+
; CHECK-NEXT: [[DIV:%.*]] = fdiv fast double [[Y:%.*]], [[Z:%.*]]
73+
; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[DIV]])
74+
; CHECK-NEXT: call void @use(double [[SQRT]])
75+
; CHECK-NEXT: [[DIV1:%.*]] = fdiv fast double [[X:%.*]], [[SQRT]]
76+
; CHECK-NEXT: ret double [[DIV1]]
77+
;
78+
entry:
79+
%div = fdiv fast double %y, %z
80+
%sqrt = call fast double @llvm.sqrt.f64(double %div)
81+
call void @use(double %sqrt)
82+
%div1 = fdiv fast double %x, %sqrt
83+
ret double %div1
84+
}
85+

0 commit comments

Comments
 (0)