summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorFiona Glaser <escha@apple.com>2015-04-21 00:05:41 +0000
committerFiona Glaser <escha@apple.com>2015-04-21 00:05:41 +0000
commit0d41db11a2dcfc8f4410fb45aaa74d5ec1d10311 (patch)
tree73038e5ecc20b1034fb92a1809a4d8b24f028b88 /llvm
parent80f958dbf430dfe828a525d560d97eb14f5cf7ca (diff)
downloadbcm5719-llvm-0d41db11a2dcfc8f4410fb45aaa74d5ec1d10311.tar.gz
bcm5719-llvm-0d41db11a2dcfc8f4410fb45aaa74d5ec1d10311.zip
InstCombine: fold (sitofp (zext x)) to (uitofp x)
This is okay because the zext guarantees the high bit is zero, and so the value is unsigned. llvm-svn: 235364
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/IR/Instructions.cpp5
-rw-r--r--llvm/test/Transforms/InstCombine/cast.ll9
2 files changed, 13 insertions, 1 deletions
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp
index 1c831ccd289..b2898429239 100644
--- a/llvm/lib/IR/Instructions.cpp
+++ b/llvm/lib/IR/Instructions.cpp
@@ -2118,7 +2118,7 @@ unsigned CastInst::isEliminableCastPair(
// N X X U S F F N X N 2 V V |
// C T T I I P P C T T P T T -+
{ 1, 0, 0,99,99, 0, 0,99,99,99, 0, 3, 0}, // Trunc -+
- { 8, 1, 9,99,99, 2, 0,99,99,99, 2, 3, 0}, // ZExt |
+ { 8, 1, 9,99,99, 2,17,99,99,99, 2, 3, 0}, // ZExt |
{ 8, 0, 1,99,99, 0, 2,99,99,99, 0, 3, 0}, // SExt |
{ 0, 0, 0,99,99, 0, 0,99,99,99, 0, 3, 0}, // FPToUI |
{ 0, 0, 0,99,99, 0, 0,99,99,99, 0, 3, 0}, // FPToSI |
@@ -2285,6 +2285,9 @@ unsigned CastInst::isEliminableCastPair(
"Illegal bitcast, ptrtoint sequence!");
// Allowed, use second cast's opcode
return secondOp;
+ case 17:
+ // (sitofp (zext x)) -> (uitofp x)
+ return Instruction::UIToFP;
case 99:
// Cast combination can't happen (error in input). This is for all cases
// where the MidTy is not the same for the two cast instructions.
diff --git a/llvm/test/Transforms/InstCombine/cast.ll b/llvm/test/Transforms/InstCombine/cast.ll
index c96140e2197..d4356d9364b 100644
--- a/llvm/test/Transforms/InstCombine/cast.ll
+++ b/llvm/test/Transforms/InstCombine/cast.ll
@@ -1104,3 +1104,12 @@ define i32 @PR21388(i32* %v) {
; CHECK-NEXT: %[[sext:.*]] = sext i1 %[[icmp]] to i32
; CHECK-NEXT: ret i32 %[[sext]]
}
+
+define float @sitofp_zext(i16 %a) {
+; CHECK-LABEL: @sitofp_zext(
+; CHECK-NEXT: %[[sitofp:.*]] = uitofp i16 %a to float
+; CHECK-NEXT: ret float %[[sitofp]]
+ %zext = zext i16 %a to i32
+ %sitofp = sitofp i32 %zext to float
+ ret float %sitofp
+}
OpenPOWER on IntegriCloud