Teach DAG combine that multiplication by 1.0 can always be constant folded.
authorOwen Anderson <resistor@mac.com>
Wed, 2 May 2012 21:32:35 +0000 (21:32 +0000)
committerOwen Anderson <resistor@mac.com>
Wed, 2 May 2012 21:32:35 +0000 (21:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@156023 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/DAGCombiner.cpp
test/CodeGen/ARM/fmuls.ll

index e72c8d5f2d4c8e0e3583a6d5022cfd20e3ef0709..b8f08bf0180ec4c56dd97ce19b0a6c2ccbd71b55 100644 (file)
@@ -5715,6 +5715,9 @@ SDValue DAGCombiner::visitFMUL(SDNode *N) {
   if (DAG.getTarget().Options.UnsafeFPMath &&
       ISD::isBuildVectorAllZeros(N1.getNode()))
     return N1;
+  // fold (fmul A, 1.0) -> A
+  if (N1CFP && N1CFP->isExactlyValue(1.0))
+    return N0;
   // fold (fmul X, 2.0) -> (fadd X, X)
   if (N1CFP && N1CFP->isExactlyValue(+2.0))
     return DAG.getNode(ISD::FADD, N->getDebugLoc(), VT, N0, N0);
index bc118b8cb22666bbce1a5a209eaaeb8543f3a887..3c3182bc6341da6958a34e2dce7af3ab3007718e 100644 (file)
@@ -21,3 +21,12 @@ entry:
 ; CORTEXA8:    vmul.f32        d0, d1, d0
 ; CORTEXA9: test:
 ; CORTEXA9:    vmul.f32        s{{.}}, s{{.}}, s{{.}}
+
+; VFP2: test2
+define float @test2(float %a) nounwind {
+; CHECK-NOT: mul
+; CHECK: mov pc, lr
+  %ret = fmul float %a, 1.0
+  ret float %ret
+}
+