@@ -116,3 +116,47 @@ define void @test_sincos_v2f64(<2 x double> %x, ptr noalias %out_sin, ptr noalia
116
116
store <2 x double > %result.1 , ptr %out_cos , align 8
117
117
ret void
118
118
}
119
+
120
+ declare void @foo (ptr , ptr )
121
+
122
+ define void @can_fold_with_call_in_chain (float %x , ptr noalias %a , ptr noalias %b ) {
123
+ ; CHECK-LABEL: can_fold_with_call_in_chain:
124
+ ; CHECK: # %bb.0: # %entry
125
+ ; CHECK-NEXT: pushl %edi
126
+ ; CHECK-NEXT: .cfi_def_cfa_offset 8
127
+ ; CHECK-NEXT: pushl %esi
128
+ ; CHECK-NEXT: .cfi_def_cfa_offset 12
129
+ ; CHECK-NEXT: subl $20, %esp
130
+ ; CHECK-NEXT: .cfi_def_cfa_offset 32
131
+ ; CHECK-NEXT: .cfi_offset %esi, -12
132
+ ; CHECK-NEXT: .cfi_offset %edi, -8
133
+ ; CHECK-NEXT: flds 32(%esp)
134
+ ; CHECK-NEXT: fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
135
+ ; CHECK-NEXT: movl 36(%esp), %edi
136
+ ; CHECK-NEXT: movl 40(%esp), %esi
137
+ ; CHECK-NEXT: movl %esi, 4(%esp)
138
+ ; CHECK-NEXT: movl %edi, (%esp)
139
+ ; CHECK-NEXT: calll foo@PLT
140
+ ; CHECK-NEXT: leal 16(%esp), %eax
141
+ ; CHECK-NEXT: movl %eax, 8(%esp)
142
+ ; CHECK-NEXT: movl %edi, 4(%esp)
143
+ ; CHECK-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
144
+ ; CHECK-NEXT: fstps (%esp)
145
+ ; CHECK-NEXT: calll sincosf
146
+ ; CHECK-NEXT: flds 16(%esp)
147
+ ; CHECK-NEXT: fstps (%esi)
148
+ ; CHECK-NEXT: addl $20, %esp
149
+ ; CHECK-NEXT: .cfi_def_cfa_offset 12
150
+ ; CHECK-NEXT: popl %esi
151
+ ; CHECK-NEXT: .cfi_def_cfa_offset 8
152
+ ; CHECK-NEXT: popl %edi
153
+ ; CHECK-NEXT: .cfi_def_cfa_offset 4
154
+ ; CHECK-NEXT: retl
155
+ entry:
156
+ %sin = tail call float @llvm.sin.f32 (float %x )
157
+ %cos = tail call float @llvm.cos.f32 (float %x )
158
+ call void @foo (ptr %a , ptr %b )
159
+ store float %sin , ptr %a , align 4
160
+ store float %cos , ptr %b , align 4
161
+ ret void
162
+ }
0 commit comments