[PatternMatch] allow vector matches with m_FNeg
authorSanjay Patel <spatel@rotateright.com>
Tue, 20 Feb 2018 23:29:05 +0000 (23:29 +0000)
committerSanjay Patel <spatel@rotateright.com>
Tue, 20 Feb 2018 23:29:05 +0000 (23:29 +0000)
llvm-svn: 325642

llvm/include/llvm/IR/PatternMatch.h
llvm/test/Transforms/InstCombine/cos-intrinsic.ll
llvm/test/Transforms/InstCombine/fdiv.ll

index 99c6ff2..e7e3303 100644 (file)
@@ -1101,7 +1101,7 @@ template <typename LHS_t> struct fneg_match {
 
 private:
   bool matchIfFNeg(Value *LHS, Value *RHS) {
-    if (const auto *C = dyn_cast<ConstantFP>(LHS))
+    if (const auto *C = dyn_cast<Constant>(LHS))
       return C->isNegativeZeroValue() && L.match(RHS);
     return false;
   }
index 7bd6283..d962a84 100644 (file)
@@ -38,12 +38,9 @@ define float @fneg_f32(float %x) {
   ret float %cos
 }
 
-; FIXME: m_FNeg() doesn't handle vectors
-
 define <2 x float> @fneg_v2f32(<2 x float> %x) {
 ; CHECK-LABEL: @fneg_v2f32(
-; CHECK-NEXT:    [[X_FNEG:%.*]] = fsub <2 x float> <float -0.000000e+00, float -0.000000e+00>, [[X:%.*]]
-; CHECK-NEXT:    [[COS:%.*]] = call <2 x float> @llvm.cos.v2f32(<2 x float> [[X_FNEG]])
+; CHECK-NEXT:    [[COS:%.*]] = call <2 x float> @llvm.cos.v2f32(<2 x float> [[X:%.*]])
 ; CHECK-NEXT:    ret <2 x float> [[COS]]
 ;
   %x.fneg = fsub <2 x float> <float -0.0, float -0.0>, %x
@@ -74,9 +71,7 @@ define float @fabs_fneg_f32(float %x) {
 
 define <2 x float> @fabs_fneg_v2f32(<2 x float> %x) {
 ; CHECK-LABEL: @fabs_fneg_v2f32(
-; CHECK-NEXT:    [[X_FABS:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.*]])
-; CHECK-NEXT:    [[X_FABS_FNEG:%.*]] = fsub <2 x float> <float -0.000000e+00, float -0.000000e+00>, [[X_FABS]]
-; CHECK-NEXT:    [[COS:%.*]] = call <2 x float> @llvm.cos.v2f32(<2 x float> [[X_FABS_FNEG]])
+; CHECK-NEXT:    [[COS:%.*]] = call <2 x float> @llvm.cos.v2f32(<2 x float> [[X:%.*]])
 ; CHECK-NEXT:    ret <2 x float> [[COS]]
 ;
   %x.fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %x)
index c02b2b4..02eb046 100644 (file)
@@ -204,9 +204,7 @@ define float @fneg_fneg_fast(float %x, float %y) {
 
 define <2 x float> @fneg_fneg_vec(<2 x float> %x, <2 x float> %y) {
 ; CHECK-LABEL: @fneg_fneg_vec(
-; CHECK-NEXT:    [[XNEG:%.*]] = fsub <2 x float> <float -0.000000e+00, float -0.000000e+00>, [[X:%.*]]
-; CHECK-NEXT:    [[YNEG:%.*]] = fsub <2 x float> <float -0.000000e+00, float -0.000000e+00>, [[Y:%.*]]
-; CHECK-NEXT:    [[DIV:%.*]] = fdiv <2 x float> [[XNEG]], [[YNEG]]
+; CHECK-NEXT:    [[DIV:%.*]] = fdiv <2 x float> [[X:%.*]], [[Y:%.*]]
 ; CHECK-NEXT:    ret <2 x float> [[DIV]]
 ;
   %xneg = fsub <2 x float> <float -0.0, float -0.0>, %x