Index: llvm/lib/Analysis/ConstantFolding.cpp =================================================================== --- llvm/lib/Analysis/ConstantFolding.cpp +++ llvm/lib/Analysis/ConstantFolding.cpp @@ -429,18 +429,17 @@ return true; if (auto *CI = dyn_cast(C)) { - if (CI->getBitWidth() > 64 || - (CI->getBitWidth() & 7) != 0) + // TODO: Adjust non-byte-sized integer + if ((CI->getBitWidth() & 7) != 0) return false; - - uint64_t Val = CI->getZExtValue(); + APInt Val = CI->getValue(); unsigned IntBytes = unsigned(CI->getBitWidth()/8); for (unsigned i = 0; i != BytesLeft && ByteOffset != IntBytes; ++i) { - int n = ByteOffset; + unsigned n = ByteOffset; if (!DL.isLittleEndian()) n = IntBytes - n - 1; - CurPtr[i] = (unsigned char)(Val >> (n * 8)); + CurPtr[i] = Val.extractBits(8, n * 8).getZExtValue(); ++ByteOffset; } return true; Index: llvm/test/Transforms/InstCombine/constant-fold.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/InstCombine/constant-fold.ll @@ -0,0 +1,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 +; RUN: opt < %s -passes=instcombine -S | FileCheck %s +@global128 = internal constant i128 1125899906842625 +@global125 = internal constant i125 1125899906842625 +define i128 @load-128bit(){ +; CHECK-LABEL: define i128 @load-128bit() { +; CHECK-NEXT: ret i128 1125899906842625 +; + %1 = load i128, ptr @global128, align 4 + ret i128 %1 +} + +; TODO: Current ReadDataFromGlobal assumes only byte-sized integer +define i125 @load-125bit(){ +; CHECK-LABEL: define i125 @load-125bit() { +; CHECK-NEXT: ret i125 1125899906842625 +; + %1 = load i125, ptr @global125, align 4 + ret i125 %1 +}