[PATCH] Revert non-test parts of r188507
Matt Arsenault
Matthew.Arsenault at amd.com
Mon Aug 19 11:52:07 PDT 2013
Add right version of tests
Hi eli.friedman,
http://llvm-reviews.chandlerc.com/D1440
CHANGE SINCE LAST DIFF
http://llvm-reviews.chandlerc.com/D1440?vs=3571&id=3576#toc
Files:
lib/Transforms/InstCombine/InstCombineCompares.cpp
test/Transforms/InstCombine/load-cmp.ll
Index: lib/Transforms/InstCombine/InstCombineCompares.cpp
===================================================================
--- lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -226,7 +226,8 @@
Instruction *InstCombiner::
FoldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP, GlobalVariable *GV,
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;
Constant *Init = GV->getInitializer();
@@ -390,6 +391,13 @@
// order the state machines in complexity of the generated code.
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
// comparisons.
if (SecondTrueElement != Overdefined) {
Index: test/Transforms/InstCombine/load-cmp.ll
===================================================================
--- test/Transforms/InstCombine/load-cmp.ll
+++ test/Transforms/InstCombine/load-cmp.ll
@@ -39,7 +39,21 @@
; NODL-NEXT: %P = getelementptr [10 x i16]* @G16, i32 0, i32 %X
; 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) {
@@ -249,6 +263,19 @@
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) {
; NODL-LABEL: @test10_struct_arr(
; NODL-NEXT: %r = icmp ne i32 %x, 1
@@ -263,6 +290,18 @@
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) {
; NODL-LABEL: @test10_struct_arr_i16(
; NODL-NEXT: %r = icmp ne i16 %x, 1
@@ -292,3 +331,28 @@
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
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1440.2.patch
Type: text/x-patch
Size: 4159 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130819/4a1cef4b/attachment.bin>
More information about the llvm-commits
mailing list