From b5750565de2920ee522aee16ebc3a37a3c62d566 Mon Sep 17 00:00:00 2001 From: Fiona Glaser Date: Tue, 21 Apr 2015 00:05:41 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235364 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/IR/Instructions.cpp | 5 ++++- test/Transforms/InstCombine/cast.ll | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/IR/Instructions.cpp b/lib/IR/Instructions.cpp index 1c831ccd289..b2898429239 100644 --- a/lib/IR/Instructions.cpp +++ b/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/test/Transforms/InstCombine/cast.ll b/test/Transforms/InstCombine/cast.ll index c96140e2197..d4356d9364b 100644 --- a/test/Transforms/InstCombine/cast.ll +++ b/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 +} -- 2.34.1