@@ -97,3 +97,30 @@ define void @add_aggregate_store(<2 x float> %a0, <2 x float> %a1, <2 x float> %
9797 store float %add10 , ptr %r3 , align 4
9898 ret void
9999}
100+
101+ ; PR58139
102+ define <2 x double > @_mm_complexmult_pd_naive (<2 x double > %a , <2 x double > %b ) {
103+ ; CHECK-LABEL: @_mm_complexmult_pd_naive(
104+ ; CHECK-NEXT: [[B1:%.*]] = extractelement <2 x double> [[B:%.*]], i64 1
105+ ; CHECK-NEXT: [[TMP1:%.*]] = fneg double [[B1]]
106+ ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <2 x double> [[A:%.*]], <2 x double> poison, <2 x i32> <i32 1, i32 1>
107+ ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <2 x double> [[B]], <2 x double> poison, <2 x i32> <i32 poison, i32 0>
108+ ; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x double> [[TMP3]], double [[TMP1]], i64 0
109+ ; CHECK-NEXT: [[TMP5:%.*]] = fmul <2 x double> [[TMP2]], [[TMP4]]
110+ ; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <2 x double> [[A]], <2 x double> poison, <2 x i32> zeroinitializer
111+ ; CHECK-NEXT: [[TMP7:%.*]] = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP6]], <2 x double> [[B]], <2 x double> [[TMP5]])
112+ ; CHECK-NEXT: ret <2 x double> [[TMP7]]
113+ ;
114+ %a0 = extractelement <2 x double > %a , i32 0
115+ %a1 = extractelement <2 x double > %a , i32 1
116+ %b0 = extractelement <2 x double > %b , i32 0
117+ %b1 = extractelement <2 x double > %b , i32 1
118+ %mul10 = fmul double %a1 , %b0
119+ %mul11 = fmul double %a1 , %b1
120+ %neg11 = fneg double %mul11
121+ %madd0 = call double @llvm.fmuladd.f64 (double %a0 , double %b0 , double %neg11 )
122+ %madd1 = call double @llvm.fmuladd.f64 (double %a0 , double %b1 , double %mul10 )
123+ %res0 = insertelement <2 x double > poison, double %madd0 , i32 0
124+ %res1 = insertelement <2 x double > %res0 , double %madd1 , i32 1
125+ ret <2 x double > %res1
126+ }
0 commit comments