diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2009-02-21 20:50:42 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2009-02-21 20:50:42 +0000 |
commit | 2ec0dbf9616e91952c90ad1c7f7404d9d1ee053c (patch) | |
tree | 3fbadd8df185a94fe0acde1a751dd495d18b124f | |
parent | 92acef0e9409d782e5ec829c4acd56242ad83586 (diff) |
Don't sign extend the char when expanding char -> int during
load(bitcast(char[4] to i32*)) evaluation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@65246 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/InstructionCombining.cpp | 4 | ||||
-rw-r--r-- | test/Transforms/InstCombine/2009-02-21-LoadCST.ll | 12 |
2 files changed, 14 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 9f72910cb7..cfd1bac7ba 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -11028,12 +11028,12 @@ static Instruction *InstCombineLoadCast(InstCombiner &IC, LoadInst &LI, APInt SingleChar(numBits, 0); if (TD->isLittleEndian()) { for (signed i = len-1; i >= 0; i--) { - SingleChar = (uint64_t) Str[i]; + SingleChar = (uint64_t) Str[i] & UCHAR_MAX; StrVal = (StrVal << 8) | SingleChar; } } else { for (unsigned i = 0; i < len; i++) { - SingleChar = (uint64_t) Str[i]; + SingleChar = (uint64_t) Str[i] & UCHAR_MAX; StrVal = (StrVal << 8) | SingleChar; } // Append NULL at the end. diff --git a/test/Transforms/InstCombine/2009-02-21-LoadCST.ll b/test/Transforms/InstCombine/2009-02-21-LoadCST.ll new file mode 100644 index 0000000000..2c126df1f1 --- /dev/null +++ b/test/Transforms/InstCombine/2009-02-21-LoadCST.ll @@ -0,0 +1,12 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ret i32 3679669} +; PR3595 + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32" +target triple = "i386-pc-linux-gnu" + +@.str1 = internal constant [4 x i8] c"\B5%8\00" + +define i32 @test() { + %rhsv = load i32* bitcast ([4 x i8]* @.str1 to i32*), align 1 + ret i32 %rhsv +} |