summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2011-01-29 20:35:06 +0000
committerNick Lewycky <nicholas@mxc.ca>2011-01-29 20:35:06 +0000
commit97a2895e73a0288d9edc896ce3f09674c6f4c61f (patch)
treeb1bb14affe2bfbcb257d42229612629542ed9ddd
parent265aa7c070bdb019c880aca348381cc27189ea03 (diff)
downloadbcm5719-llvm-97a2895e73a0288d9edc896ce3f09674c6f4c61f.tar.gz
bcm5719-llvm-97a2895e73a0288d9edc896ce3f09674c6f4c61f.zip
Add the select optimization recently added to instcombine to constant folding.
This is the one where one of the branches of the select is another select on the same condition. llvm-svn: 124547
-rw-r--r--llvm/lib/VMCore/ConstantFold.cpp12
-rw-r--r--llvm/test/Transforms/ConstProp/constant-expr.ll9
2 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/VMCore/ConstantFold.cpp b/llvm/lib/VMCore/ConstantFold.cpp
index 3fea1910ffe..c3be1197d3c 100644
--- a/llvm/lib/VMCore/ConstantFold.cpp
+++ b/llvm/lib/VMCore/ConstantFold.cpp
@@ -693,6 +693,18 @@ Constant *llvm::ConstantFoldSelectInstruction(Constant *Cond,
if (isa<UndefValue>(V2)) return V1;
if (isa<UndefValue>(Cond)) return V1;
if (V1 == V2) return V1;
+
+ if (ConstantExpr *TrueVal = dyn_cast<ConstantExpr>(V1)) {
+ if (TrueVal->getOpcode() == Instruction::Select)
+ if (TrueVal->getOperand(0) == Cond)
+ return ConstantExpr::getSelect(Cond, TrueVal->getOperand(1), V2);
+ }
+ if (ConstantExpr *FalseVal = dyn_cast<ConstantExpr>(V2)) {
+ if (FalseVal->getOpcode() == Instruction::Select)
+ if (FalseVal->getOperand(0) == Cond)
+ return ConstantExpr::getSelect(Cond, V1, FalseVal->getOperand(2));
+ }
+
return 0;
}
diff --git a/llvm/test/Transforms/ConstProp/constant-expr.ll b/llvm/test/Transforms/ConstProp/constant-expr.ll
index 33ed1a53c3e..1088fa6959a 100644
--- a/llvm/test/Transforms/ConstProp/constant-expr.ll
+++ b/llvm/test/Transforms/ConstProp/constant-expr.ll
@@ -100,3 +100,12 @@
; CHECK: pr9011_14 = constant i128 0
@pr9011_15 = constant i128 bitcast (<4 x i32> zeroinitializer to i128)
; CHECK: pr9011_15 = constant i128 0
+
+@select = internal constant
+ i32 select (i1 icmp ult (i32 ptrtoint (i8* @X to i32),
+ i32 ptrtoint (i8* @Y to i32)),
+ i32 select (i1 icmp ult (i32 ptrtoint (i8* @X to i32),
+ i32 ptrtoint (i8* @Y to i32)),
+ i32 10, i32 20),
+ i32 30)
+; CHECK: select = internal constant i32 select {{.*}} i32 10, i32 30
OpenPOWER on IntegriCloud