[llvm-commits] [llvm] r173293 - /llvm/trunk/lib/Analysis/ConstantFolding.cpp
Benjamin Kramer
benny.kra at gmail.com
Tue Feb 5 11:05:10 PST 2013
On 29.01.2013, at 10:36, Patrik Hägglund H <patrik.h.hagglund at ericsson.com> wrote:
> FYI: This change generates an assert for the following IR code (extract from our internal frontend). I have not looked at how to fix it yet.
>
> target datalayout = "p:16:16"
>
> @a = global [2 x i32] zeroinitializer
>
> define i32 @main() {
> ret i32 sub (i32 ptrtoint (i32* getelementptr inbounds ([2 x i32]* @a, i16 0, i16 1) to i32), i32 ptrtoint ([2 x i32]* @a to i32))
> }
>
> On x86_64:
>
> Release+Asserts/bin/opt -S -O1 bar.ll
> opt: /dev/shm/uabpath/master/lib/IR/Constants.cpp:498: static llvm::Constant *llvm::ConstantInt::get(llvm::Type *, const llvm::APInt &): Assertion `C->getType() == Ty->getScalarType() && "ConstantInt type doesn't match the type implied by its value!"' failed.
> 0 opt 0x0000000000fd5ca5 llvm::sys::PrintStackTrace(_IO_FILE*) + 37
> 1 opt 0x0000000000fd6193
> 2 libpthread.so.0 0x00007fad3dbcc6a0
> 3 libc.so.6 0x00007fad3cd0c945 gsignal + 53
> 4 libc.so.6 0x00007fad3cd0df21 abort + 385
> 5 libc.so.6 0x00007fad3cd05810 __assert_fail + 240
> 6 opt 0x0000000000ee8392
> 7 opt 0x0000000000d51003 llvm::ConstantFoldInstOperands(unsigned int, llvm::Type*, llvm::ArrayRef<llvm::Constant*>, llvm::DataLayout const*, llvm::TargetLibraryInfo const*) + 931
> 8 opt 0x0000000000d5081b llvm::ConstantFoldConstantExpression(llvm::ConstantExpr const*, llvm::DataLayout const*, llvm::TargetLibraryInfo const*) + 299
> 9 opt 0x0000000000d50483 llvm::ConstantFoldInstruction(llvm::Instruction*, llvm::DataLayout const*, llvm::TargetLibraryInfo const*) + 323
> 10 opt 0x0000000000d89188 llvm::SimplifyInstruction(llvm::Instruction*, llvm::DataLayout const*, llvm::TargetLibraryInfo const*, llvm::DominatorTree const*) + 200
> 11 opt 0x0000000000b7a7b4
> 12 opt 0x0000000000f798fc llvm::FPPassManager::runOnFunction(llvm::Function&) + 364
> 13 opt 0x0000000000f7912b llvm::FunctionPassManagerImpl::run(llvm::Function&) + 235
> 14 opt 0x0000000000f78fdd llvm::FunctionPassManager::run(llvm::Function&) + 93
> 15 opt 0x00000000005290f8 main + 7368
> 16 libc.so.6 0x00007fad3ccf8bc6 __libc_start_main + 230
> 17 opt 0x0000000000524039
> Stack dump:
> 0. Program arguments: Release+Asserts/bin/opt -S -O1 ../../dev/build-gcc462/bar.ll
> 1. Running pass 'Early CSE' on function '@main'
> Abort
Sorry, I must've missed your mail in the noise. Fixed in r174424.
- Ben
>
> -----Original Message-----
> From: llvm-commits-bounces at cs.uiuc.edu [mailto:llvm-commits-bounces at cs.uiuc.edu] On Behalf Of Benjamin Kramer
> Sent: den 23 januari 2013 22:21
> To: llvm-commits at cs.uiuc.edu
> Subject: [llvm-commits] [llvm] r173293 - /llvm/trunk/lib/Analysis/ConstantFolding.cpp
>
> Author: d0k
> Date: Wed Jan 23 15:21:24 2013
> New Revision: 173293
>
> URL: http://llvm.org/viewvc/llvm-project?rev=173293&view=rev
> Log:
> ConstantFolding: Tweak r173289, it should evaluate in the intptr type, not the index type.
>
> Modified:
> llvm/trunk/lib/Analysis/ConstantFolding.cpp
>
> Modified: llvm/trunk/lib/Analysis/ConstantFolding.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ConstantFolding.cpp?rev=173293&r1=173292&r2=173293&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ConstantFolding.cpp (original)
> +++ llvm/trunk/lib/Analysis/ConstantFolding.cpp Wed Jan 23 15:21:24 2013
> @@ -218,10 +218,10 @@
> /// from a global, return the global and the constant. Because of /// constantexprs, this function is recursive.
> static bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV,
> - int64_t &Offset, const DataLayout &TD) {
> + APInt &Offset, const DataLayout
> + &TD) {
> // Trivial case, constant is the global.
> if ((GV = dyn_cast<GlobalValue>(C))) {
> - Offset = 0;
> + Offset.clearAllBits();
> return true;
> }
>
> @@ -254,22 +254,17 @@
> if (!CI) return false; // Index isn't a simple constant?
> if (CI->isZero()) continue; // Not adding anything.
>
> - // Evaluate offsets in the index type.
> - APInt APOffset(CI->getBitWidth(), Offset);
> -
> if (StructType *ST = dyn_cast<StructType>(*GTI)) {
> // N = N + Offset
> - APOffset +=
> - APInt(CI->getBitWidth(),
> - TD.getStructLayout(ST)->getElementOffset(CI->getZExtValue()));
> + Offset +=
> + APInt(Offset.getBitWidth(),
> +
> + TD.getStructLayout(ST)->getElementOffset(CI->getZExtValue()));
> } else {
> SequentialType *SQT = cast<SequentialType>(*GTI);
> - APOffset +=
> - APInt(CI->getBitWidth(),
> - TD.getTypeAllocSize(SQT->getElementType())*CI->getSExtValue());
> + Offset += APInt(Offset.getBitWidth(),
> + TD.getTypeAllocSize(SQT->getElementType()) *
> + CI->getSExtValue());
> }
> -
> - Offset = APOffset.getSExtValue();
> }
> return true;
> }
> @@ -432,7 +427,7 @@
> if (BytesLoaded > 32 || BytesLoaded == 0) return 0;
>
> GlobalValue *GVal;
> - int64_t Offset;
> + APInt Offset(TD.getPointerSizeInBits(), 0);
> if (!IsConstantOffsetFromGlobal(C, GVal, Offset, TD))
> return 0;
>
> @@ -443,14 +438,15 @@
>
> // If we're loading off the beginning of the global, some bytes may be valid,
> // but we don't try to handle this.
> - if (Offset < 0) return 0;
> + if (Offset.isNegative()) return 0;
>
> // If we're not accessing anything in this constant, the result is undefined.
> - if (uint64_t(Offset) >= TD.getTypeAllocSize(GV->getInitializer()->getType()))
> + if (Offset.getZExtValue() >=
> + TD.getTypeAllocSize(GV->getInitializer()->getType()))
> return UndefValue::get(IntType);
>
> unsigned char RawBytes[32] = {0};
> - if (!ReadDataFromGlobal(GV->getInitializer(), Offset, RawBytes,
> + if (!ReadDataFromGlobal(GV->getInitializer(), Offset.getZExtValue(),
> + RawBytes,
> BytesLoaded, TD))
> return 0;
>
> @@ -574,7 +570,8 @@
> // constant. This happens frequently when iterating over a global array.
> if (Opc == Instruction::Sub && TD) {
> GlobalValue *GV1, *GV2;
> - int64_t Offs1, Offs2;
> + APInt Offs1(TD->getPointerSizeInBits(), 0),
> + Offs2(TD->getPointerSizeInBits(), 0);
>
> if (IsConstantOffsetFromGlobal(Op0, GV1, Offs1, *TD))
> if (IsConstantOffsetFromGlobal(Op1, GV2, Offs2, *TD) &&
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list