Reapply [FastISel][X86] Use XOR to materialize the "0" value (r215594).
[oota-llvm.git] / lib / Transforms / InstCombine / InstCombineSelect.cpp
index e8ce350886da711660f0067bca6b6bf41e028a0e..06c9e290c6ea811edb29c294372b202d5a67cce9 100644 (file)
@@ -733,8 +733,15 @@ Instruction *InstCombiner::FoldSPFofSPF(Instruction *Inner,
     return ReplaceInstUsesWith(Outer, Inner);
   }
 
-  // TODO: ABS(NABS(X)) -> ABS(X)
-  // TODO: NABS(ABS(X)) -> NABS(X)
+  // ABS(NABS(X)) -> ABS(X)
+  // NABS(ABS(X)) -> NABS(X)
+  if ((SPF1 == SPF_ABS && SPF2 == SPF_NABS) ||
+      (SPF1 == SPF_NABS && SPF2 == SPF_ABS)) {
+    SelectInst *SI = cast<SelectInst>(Inner);
+    Value *NewSI = Builder->CreateSelect(
+        SI->getCondition(), SI->getFalseValue(), SI->getTrueValue());
+    return ReplaceInstUsesWith(Outer, NewSI);
+  }
   return nullptr;
 }