File: fma_legacy.ll

package info (click to toggle)
llvm-toolchain-21 1%3A21.1.6-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,245,028 kB
  • sloc: cpp: 7,619,726; ansic: 1,434,018; asm: 1,058,748; python: 252,740; f90: 94,671; objc: 70,685; lisp: 42,813; pascal: 18,401; sh: 8,601; ml: 5,111; perl: 4,720; makefile: 3,675; awk: 3,523; javascript: 2,409; xml: 892; fortran: 770
file content (134 lines) | stat: -rw-r--r-- 4,931 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -mtriple=amdgcn-amd-amdhsa -passes=instcombine -S | FileCheck %s

; Simplify to +0.0 + z.
define float @test_zero(float %x, float %z) {
; CHECK-LABEL: @test_zero(
; CHECK-NEXT:    [[CALL:%.*]] = fadd float [[Z:%.*]], 0.000000e+00
; CHECK-NEXT:    ret float [[CALL]]
;
  %call = call float @llvm.amdgcn.fma.legacy(float %x, float 0.0, float %z)
  ret float %call
}

; Simplify to +0.0 + z, preserving fmf.
define float @test_zero_fmf(float %x, float %z) {
; CHECK-LABEL: @test_zero_fmf(
; CHECK-NEXT:    [[CALL:%.*]] = fadd contract float [[Z:%.*]], 0.000000e+00
; CHECK-NEXT:    ret float [[CALL]]
;
  %call = call contract float @llvm.amdgcn.fma.legacy(float %x, float 0.0, float %z)
  ret float %call
}

; Simplify to z.
define float @test_zero_nsz(float %x, float %z) {
; CHECK-LABEL: @test_zero_nsz(
; CHECK-NEXT:    ret float [[Z:%.*]]
;
  %call = call nsz float @llvm.amdgcn.fma.legacy(float %x, float 0.0, float %z)
  ret float %call
}

; Simplify to +0.0 + z.
define float @test_negzero(float %y, float %z) {
; CHECK-LABEL: @test_negzero(
; CHECK-NEXT:    [[CALL:%.*]] = fadd float [[Z:%.*]], 0.000000e+00
; CHECK-NEXT:    ret float [[CALL]]
;
  %call = call float @llvm.amdgcn.fma.legacy(float -0.0, float %y, float %z)
  ret float %call
}

; Simplify to z.
define float @test_negzero_nsz(float %y, float %z) {
; CHECK-LABEL: @test_negzero_nsz(
; CHECK-NEXT:    ret float [[Z:%.*]]
;
  %call = call nsz float @llvm.amdgcn.fma.legacy(float -0.0, float %y, float %z)
  ret float %call
}

; Combine to fma because the constant is finite and non-zero.
define float @test_const(float %x, float %z) {
; CHECK-LABEL: @test_const(
; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.fma.f32(float [[X:%.*]], float 9.950000e+01, float [[Z:%.*]])
; CHECK-NEXT:    ret float [[CALL]]
;
  %call = call float @llvm.amdgcn.fma.legacy(float %x, float 99.5, float %z)
  ret float %call
}

; Combine to fma because the constant is finite and non-zero, preserving fmf.
define float @test_const_fmf(float %x, float %z) {
; CHECK-LABEL: @test_const_fmf(
; CHECK-NEXT:    [[CALL:%.*]] = call contract float @llvm.fma.f32(float [[X:%.*]], float 9.950000e+01, float [[Z:%.*]])
; CHECK-NEXT:    ret float [[CALL]]
;
  %call = call contract float @llvm.amdgcn.fma.legacy(float %x, float 99.5, float %z)
  ret float %call
}

; Combine to fma because neither argument can be infinity or NaN.
define float @test_finite(i32 %x, i32 %y, float %z) {
; CHECK-LABEL: @test_finite(
; CHECK-NEXT:    [[XF:%.*]] = sitofp i32 [[X:%.*]] to float
; CHECK-NEXT:    [[YF:%.*]] = sitofp i32 [[Y:%.*]] to float
; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.fma.f32(float [[XF]], float [[YF]], float [[Z:%.*]])
; CHECK-NEXT:    ret float [[CALL]]
;
  %xf = sitofp i32 %x to float
  %yf = sitofp i32 %y to float
  %call = call float @llvm.amdgcn.fma.legacy(float %xf, float %yf, float %z)
  ret float %call
}

; Combine to fma because neither argument can be infinity or NaN based on assumptions
define float @test_finite_assumed(float %x, float %y, float %z) {
; CHECK-LABEL: @test_finite_assumed(
; CHECK-NEXT:    [[FABS_X:%.*]] = call float @llvm.fabs.f32(float [[X:%.*]])
; CHECK-NEXT:    [[IS_FINITE_X:%.*]] = fcmp one float [[FABS_X]], 0x7FF0000000000000
; CHECK-NEXT:    [[FABS_Y:%.*]] = call float @llvm.fabs.f32(float [[Y:%.*]])
; CHECK-NEXT:    [[IS_FINITE_Y:%.*]] = fcmp one float [[FABS_Y]], 0x7FF0000000000000
; CHECK-NEXT:    call void @llvm.assume(i1 [[IS_FINITE_X]])
; CHECK-NEXT:    call void @llvm.assume(i1 [[IS_FINITE_Y]])
; CHECK-NEXT:    [[CALL:%.*]] = call float @llvm.fma.f32(float [[X]], float [[Y]], float [[Z:%.*]])
; CHECK-NEXT:    ret float [[CALL]]
;
  %fabs.x = call float @llvm.fabs.f32(float %x)
  %is.finite.x = fcmp one float %fabs.x, 0x7FF0000000000000
  %fabs.y = call float @llvm.fabs.f32(float %y)
  %is.finite.y = fcmp one float %fabs.y, 0x7FF0000000000000
  call void @llvm.assume(i1 %is.finite.x)
  call void @llvm.assume(i1 %is.finite.y)
  %call = call float @llvm.amdgcn.fma.legacy(float %x, float %y, float %z)
  ret float %call
}

define float @test_poison_x_y(float %x, float %y) {
; CHECK-LABEL: @test_poison_x_y(
; CHECK-NEXT:    ret float poison
;
  %call = call float @llvm.amdgcn.fma.legacy(float poison, float %x, float %y)
  ret float %call
}

define float @test_x_poison_y(float %x, float %y) {
; CHECK-LABEL: @test_x_poison_y(
; CHECK-NEXT:    ret float poison
;
  %call = call float @llvm.amdgcn.fma.legacy(float %x, float poison, float %y)
  ret float %call
}

define float @test_x_y_poison_y(float %x, float %y) {
; CHECK-LABEL: @test_x_y_poison_y(
; CHECK-NEXT:    ret float poison
;
  %call = call float @llvm.amdgcn.fma.legacy(float %x, float %y, float poison)
  ret float %call
}

declare float @llvm.amdgcn.fma.legacy(float, float, float)
declare float @llvm.fabs.f32(float)
declare void @llvm.assume(i1 noundef)