mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
Revert non-test parts of r188507
Re-add the inboundsless tests I didn't add originally llvm-svn: 188710
This commit is contained in:
parent
9fab6e549f
commit
22098dc46b
@ -226,7 +226,8 @@ static void ComputeUnsignedMinMaxValuesFromKnownBits(const APInt &KnownZero,
|
|||||||
Instruction *InstCombiner::
|
Instruction *InstCombiner::
|
||||||
FoldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP, GlobalVariable *GV,
|
FoldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP, GlobalVariable *GV,
|
||||||
CmpInst &ICI, ConstantInt *AndCst) {
|
CmpInst &ICI, ConstantInt *AndCst) {
|
||||||
if (!GEP->isInBounds())
|
// We need TD information to know the pointer size unless this is inbounds.
|
||||||
|
if (!GEP->isInBounds() && TD == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
Constant *Init = GV->getInitializer();
|
Constant *Init = GV->getInitializer();
|
||||||
@ -390,6 +391,13 @@ FoldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP, GlobalVariable *GV,
|
|||||||
// order the state machines in complexity of the generated code.
|
// order the state machines in complexity of the generated code.
|
||||||
Value *Idx = GEP->getOperand(2);
|
Value *Idx = GEP->getOperand(2);
|
||||||
|
|
||||||
|
// If the index is larger than the pointer size of the target, truncate the
|
||||||
|
// index down like the GEP would do implicitly. We don't have to do this for
|
||||||
|
// an inbounds GEP because the index can't be out of range.
|
||||||
|
if (!GEP->isInBounds() &&
|
||||||
|
Idx->getType()->getPrimitiveSizeInBits() > TD->getPointerSizeInBits())
|
||||||
|
Idx = Builder->CreateTrunc(Idx, TD->getIntPtrType(Idx->getContext()));
|
||||||
|
|
||||||
// If the comparison is only true for one or two elements, emit direct
|
// If the comparison is only true for one or two elements, emit direct
|
||||||
// comparisons.
|
// comparisons.
|
||||||
if (SecondTrueElement != Overdefined) {
|
if (SecondTrueElement != Overdefined) {
|
||||||
|
@ -39,7 +39,21 @@ define i1 @test1_noinbounds(i32 %X) {
|
|||||||
; NODL-NEXT: %P = getelementptr [10 x i16]* @G16, i32 0, i32 %X
|
; NODL-NEXT: %P = getelementptr [10 x i16]* @G16, i32 0, i32 %X
|
||||||
|
|
||||||
; P32-LABEL: @test1_noinbounds(
|
; P32-LABEL: @test1_noinbounds(
|
||||||
; P32-NEXT: %P = getelementptr [10 x i16]* @G16, i32 0, i32 %X
|
; P32-NEXT: %R = icmp eq i32 %X, 9
|
||||||
|
; P32-NEXT: ret i1 %R
|
||||||
|
}
|
||||||
|
|
||||||
|
define i1 @test1_noinbounds_i64(i64 %X) {
|
||||||
|
%P = getelementptr [10 x i16]* @G16, i64 0, i64 %X
|
||||||
|
%Q = load i16* %P
|
||||||
|
%R = icmp eq i16 %Q, 0
|
||||||
|
ret i1 %R
|
||||||
|
; NODL-LABEL: @test1_noinbounds_i64(
|
||||||
|
; NODL-NEXT: %P = getelementptr [10 x i16]* @G16, i64 0, i64 %X
|
||||||
|
|
||||||
|
; P32-LABEL: @test1_noinbounds_i64(
|
||||||
|
; P32: %R = icmp eq i32 %1, 9
|
||||||
|
; P32-NEXT: ret i1 %R
|
||||||
}
|
}
|
||||||
|
|
||||||
define i1 @test2(i32 %X) {
|
define i1 @test2(i32 %X) {
|
||||||
@ -249,6 +263,19 @@ define i1 @test10_struct_i64(i64 %x){
|
|||||||
ret i1 %r
|
ret i1 %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define i1 @test10_struct_noinbounds_i16(i16 %x) {
|
||||||
|
; NODL-LABEL: @test10_struct_noinbounds_i16(
|
||||||
|
; NODL: getelementptr %Foo* @GS, i16 %x, i32 0
|
||||||
|
|
||||||
|
; P32-LABEL: @test10_struct_noinbounds_i16(
|
||||||
|
; P32: %1 = sext i16 %x to i32
|
||||||
|
; P32: getelementptr %Foo* @GS, i32 %1, i32 0
|
||||||
|
%p = getelementptr %Foo* @GS, i16 %x, i32 0
|
||||||
|
%q = load i32* %p
|
||||||
|
%r = icmp eq i32 %q, 0
|
||||||
|
ret i1 %r
|
||||||
|
}
|
||||||
|
|
||||||
define i1 @test10_struct_arr(i32 %x) {
|
define i1 @test10_struct_arr(i32 %x) {
|
||||||
; NODL-LABEL: @test10_struct_arr(
|
; NODL-LABEL: @test10_struct_arr(
|
||||||
; NODL-NEXT: %r = icmp ne i32 %x, 1
|
; NODL-NEXT: %r = icmp ne i32 %x, 1
|
||||||
@ -263,6 +290,18 @@ define i1 @test10_struct_arr(i32 %x) {
|
|||||||
ret i1 %r
|
ret i1 %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define i1 @test10_struct_arr_noinbounds(i32 %x) {
|
||||||
|
; NODL-LABEL: @test10_struct_arr_noinbounds(
|
||||||
|
; NODL-NEXT %p = getelementptr [4 x %Foo]* @GStructArr, i32 0, i32 %x, i32 2
|
||||||
|
|
||||||
|
; P32-LABEL: @test10_struct_arr_noinbounds(
|
||||||
|
; P32-NEXT %p = getelementptr [4 x %Foo]* @GStructArr, i32 0, i32 %x, i32 2
|
||||||
|
%p = getelementptr [4 x %Foo]* @GStructArr, i32 0, i32 %x, i32 2
|
||||||
|
%q = load i32* %p
|
||||||
|
%r = icmp eq i32 %q, 9
|
||||||
|
ret i1 %r
|
||||||
|
}
|
||||||
|
|
||||||
define i1 @test10_struct_arr_i16(i16 %x) {
|
define i1 @test10_struct_arr_i16(i16 %x) {
|
||||||
; NODL-LABEL: @test10_struct_arr_i16(
|
; NODL-LABEL: @test10_struct_arr_i16(
|
||||||
; NODL-NEXT: %r = icmp ne i16 %x, 1
|
; NODL-NEXT: %r = icmp ne i16 %x, 1
|
||||||
@ -292,3 +331,28 @@ define i1 @test10_struct_arr_i64(i64 %x) {
|
|||||||
ret i1 %r
|
ret i1 %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define i1 @test10_struct_arr_noinbounds_i16(i16 %x) {
|
||||||
|
; NODL-LABEL: @test10_struct_arr_noinbounds_i16(
|
||||||
|
; NODL-NEXT: %p = getelementptr [4 x %Foo]* @GStructArr, i32 0, i16 %x, i32 2
|
||||||
|
|
||||||
|
; P32-LABEL: @test10_struct_arr_noinbounds_i16(
|
||||||
|
; P32-NEXT: %r = icmp ne i16 %x, 1
|
||||||
|
%p = getelementptr [4 x %Foo]* @GStructArr, i32 0, i16 %x, i32 2
|
||||||
|
%q = load i32* %p
|
||||||
|
%r = icmp eq i32 %q, 9
|
||||||
|
ret i1 %r
|
||||||
|
}
|
||||||
|
|
||||||
|
define i1 @test10_struct_arr_noinbounds_i64(i64 %x) {
|
||||||
|
; FIXME: Should be no trunc?
|
||||||
|
; NODL-LABEL: @test10_struct_arr_noinbounds_i64(
|
||||||
|
; NODL-NEXT: %p = getelementptr [4 x %Foo]* @GStructArr, i32 0, i64 %x, i32 2
|
||||||
|
|
||||||
|
; P32-LABEL: @test10_struct_arr_noinbounds_i64(
|
||||||
|
; P32: %r = icmp ne i32 %1, 1
|
||||||
|
; P32-NEXT: ret i1 %r
|
||||||
|
%p = getelementptr [4 x %Foo]* @GStructArr, i32 0, i64 %x, i32 2
|
||||||
|
%q = load i32* %p
|
||||||
|
%r = icmp eq i32 %q, 9
|
||||||
|
ret i1 %r
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user