1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00

ConstantFolding: Evaluate GEP indices in the index type.

This fixes some edge cases that we would get wrong with uint64_ts.
PR14986.

llvm-svn: 173289
This commit is contained in:
Benjamin Kramer 2013-01-23 20:41:05 +00:00
parent 8f90349114
commit 5ddc9bf246
2 changed files with 33 additions and 5 deletions

View File

@ -254,13 +254,22 @@ static bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV,
if (!CI) return false; // Index isn't a simple constant? if (!CI) return false; // Index isn't a simple constant?
if (CI->isZero()) continue; // Not adding anything. 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)) { if (StructType *ST = dyn_cast<StructType>(*GTI)) {
// N = N + Offset // N = N + Offset
Offset += TD.getStructLayout(ST)->getElementOffset(CI->getZExtValue()); APOffset +=
APInt(CI->getBitWidth(),
TD.getStructLayout(ST)->getElementOffset(CI->getZExtValue()));
} else { } else {
SequentialType *SQT = cast<SequentialType>(*GTI); SequentialType *SQT = cast<SequentialType>(*GTI);
Offset += TD.getTypeAllocSize(SQT->getElementType())*CI->getSExtValue(); APOffset +=
APInt(CI->getBitWidth(),
TD.getTypeAllocSize(SQT->getElementType())*CI->getSExtValue());
} }
Offset = APOffset.getSExtValue();
} }
return true; return true;
} }

View File

@ -1,6 +1,6 @@
; RUN: opt < %s -instcombine -S | FileCheck %s ; RUN: opt < %s -instcombine -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 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:128:128-n8:16:32-S128"
target triple = "x86_64-apple-darwin10.0.0" target triple = "i386-apple-macosx10.0.0"
; Instcombine should be able to do trivial CSE of loads. ; Instcombine should be able to do trivial CSE of loads.
@ -25,3 +25,22 @@ define float @test2() {
; CHECK: @test2 ; CHECK: @test2
; CHECK: ret float 0x3806965600000000 ; CHECK: ret float 0x3806965600000000
} }
@rslts32 = global [36 x i32] zeroinitializer, align 4
@expect32 = internal constant [36 x i32][ i32 1, i32 2, i32 0, i32 100, i32 3,
i32 4, i32 0, i32 -7, i32 4, i32 4, i32 8, i32 8, i32 1, i32 3, i32 8, i32 3,
i32 4, i32 -2, i32 2, i32 8, i32 83, i32 77, i32 8, i32 17, i32 77, i32 88, i32
22, i32 33, i32 44, i32 88, i32 77, i32 4, i32 4, i32 7, i32 -7, i32 -8] ,
align 4
; PR14986
define void @test3() nounwind {
; This is a weird way of computing zero.
%l = load i32* getelementptr ([36 x i32]* @expect32, i32 29826161, i32 28), align 4
store i32 %l, i32* getelementptr ([36 x i32]* @rslts32, i32 29826161, i32 28), align 4
ret void
; CHECK: @test3
; CHECK: store i32 1, i32* getelementptr inbounds ([36 x i32]* @rslts32, i32 0, i32 0)
}