diff options
| author | Nicola Zaghen <nicola.zaghen@imgtec.com> | 2019-12-13 09:55:45 +0000 |
|---|---|---|
| committer | Nicola Zaghen <nicola.zaghen@imgtec.com> | 2019-12-13 14:30:21 +0000 |
| commit | 97572775d2fe088d8059b3a9423f6d8539fafe33 (patch) | |
| tree | 634e93ae8cbc9e4d7691d65a864bc61dfe689026 /llvm/test | |
| parent | 56adcebfda84009b2825e69f71068685360abed7 (diff) | |
| download | bcm5719-llvm-97572775d2fe088d8059b3a9423f6d8539fafe33.tar.gz bcm5719-llvm-97572775d2fe088d8059b3a9423f6d8539fafe33.zip | |
Reland [DataLayout] Fix occurrences that size and range of pointers are assumed to be the same.
GEP index size can be specified in the DataLayout, introduced in D42123. However, there were still places
in which getIndexSizeInBits was used interchangeably with getPointerSizeInBits. This notably caused issues
with Instcombine's visitPtrToInt; but the unit tests was incorrect, so this remained undiscovered.
This fixes the buildbot failures.
Differential Revision: https://reviews.llvm.org/D68328
Patch by Joseph Faulls!
Diffstat (limited to 'llvm/test')
6 files changed, 153 insertions, 10 deletions
diff --git a/llvm/test/Transforms/InstCombine/builtin-object-size-custom-dl.ll b/llvm/test/Transforms/InstCombine/builtin-object-size-custom-dl.ll new file mode 100644 index 00000000000..eec0f768425 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/builtin-object-size-custom-dl.ll @@ -0,0 +1,32 @@ +; RUN: opt -instcombine -S < %s | FileCheck %s +target datalayout = "e-m:o-p:40:64:64:32-i64:64-f80:128-n8:16:32:64-S128" + +; check that memory builtins can be handled. +define i64 @objsize1_custom_idx(i64 %sz) { +entry: + %ptr = call i8* @malloc(i64 %sz) + %ptr2 = getelementptr inbounds i8, i8* %ptr, i32 2 + %calc_size = call i64 @llvm.objectsize.i64.p0i8(i8* %ptr2, i1 false, i1 true, i1 true) + ret i64 %calc_size +} + +%struct.V = type { [10 x i8], i32, [10 x i8] } + +define i32 @objsize2_custom_idx() #0 { +entry: + %var = alloca %struct.V, align 4 + %0 = bitcast %struct.V* %var to i8* + call void @llvm.lifetime.start.p0i8(i64 28, i8* %0) #3 + %buf1 = getelementptr inbounds %struct.V, %struct.V* %var, i32 0, i32 0 + %arrayidx = getelementptr inbounds [10 x i8], [10 x i8]* %buf1, i64 0, i64 1 + %1 = call i64 @llvm.objectsize.i64.p0i8(i8* %arrayidx, i1 false, i1 false, i1 false) + %conv = trunc i64 %1 to i32 + call void @llvm.lifetime.end.p0i8(i64 28, i8* %0) #3 + ret i32 %conv +; CHECK: ret i32 27 +} + +declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #1 +declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1 +declare i8* @malloc(i64) +declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1, i1) diff --git a/llvm/test/Transforms/InstCombine/gep-custom-dl.ll b/llvm/test/Transforms/InstCombine/gep-custom-dl.ll index bcaadf47d11..fdadc80c60e 100644 --- a/llvm/test/Transforms/InstCombine/gep-custom-dl.ll +++ b/llvm/test/Transforms/InstCombine/gep-custom-dl.ll @@ -164,3 +164,22 @@ define i32 @test10() { %B = ptrtoint double* %A to i32 ret i32 %B } + +@X_as1 = addrspace(1) global [1000 x i8] zeroinitializer, align 16 + +define i16 @constant_fold_custom_dl() { +; CHECK-LABEL: @constant_fold_custom_dl( + ; CHECK: ret i16 ptrtoint + +entry: + %A = bitcast i8 addrspace(1)* getelementptr inbounds ([1000 x i8], [1000 x i8] addrspace(1)* @X_as1, i64 1, i64 0) to i8 addrspace(1)* + %B = bitcast i8 addrspace(1)* getelementptr inbounds ([1000 x i8], [1000 x i8] addrspace(1)* @X_as1, i64 0, i64 0) to i8 addrspace(1)* + + %B2 = ptrtoint i8 addrspace(1)* %B to i16 + %C = sub i16 0, %B2 + %D = getelementptr i8, i8 addrspace(1)* %A, i16 %C + %E = ptrtoint i8 addrspace(1)* %D to i16 + + ret i16 %E +} + diff --git a/llvm/test/Transforms/InstCombine/icmp-custom-dl.ll b/llvm/test/Transforms/InstCombine/icmp-custom-dl.ll index fcfe07e9be2..6b7cb1cdd4b 100644 --- a/llvm/test/Transforms/InstCombine/icmp-custom-dl.ll +++ b/llvm/test/Transforms/InstCombine/icmp-custom-dl.ll @@ -8,8 +8,8 @@ declare i32 @test58_d(i64 ) define i1 @test59(i8* %foo) { ; CHECK-LABEL: @test59( ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i8, i8* [[FOO:%.*]], i32 8 -; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint i8* [[GEP1]] to i32 -; CHECK-NEXT: [[USE:%.*]] = zext i32 [[TMP1]] to i64 +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint i8* [[GEP1]] to i40 +; CHECK-NEXT: [[USE:%.*]] = zext i40 [[TMP1]] to i64 ; CHECK-NEXT: [[CALL:%.*]] = call i32 @test58_d(i64 [[USE]]) ; CHECK-NEXT: ret i1 true ; diff --git a/llvm/test/Transforms/InstCombine/stdio-custom-dl.ll b/llvm/test/Transforms/InstCombine/stdio-custom-dl.ll new file mode 100644 index 00000000000..c4a666db237 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/stdio-custom-dl.ll @@ -0,0 +1,22 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -instcombine -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s + +target datalayout = "e-m:o-p:40:64:64:32-i64:64-f80:128-n8:16:32:64-S128" +%struct._IO_FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct._IO_FILE*, i32, i32, i64, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i8*, i8*, i64, i32, [20 x i8] } +%struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, i32 } +@.str = private unnamed_addr constant [5 x i8] c"file\00", align 1 +@.str.1 = private unnamed_addr constant [2 x i8] c"w\00", align 1 +@.str.2 = private unnamed_addr constant [4 x i8] c"str\00", align 1 + +; Check fwrite is generated with arguments of ptr size, not index size +define internal void @fputs_test_custom_dl() { +; CHECK-LABEL: @fputs_test_custom_dl( +; CHECK-NEXT: [[TMP1:%.*]] = call %struct._IO_FILE* @fopen(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i32 0, i32 0)) +; + %call = call %struct._IO_FILE* @fopen(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0)) + %call1 = call i32 @fputs(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i64 0, i64 0), %struct._IO_FILE* %call) + ret void +} + +declare %struct._IO_FILE* @fopen(i8*, i8*) +declare i32 @fputs(i8* nocapture readonly, %struct._IO_FILE* nocapture) diff --git a/llvm/test/Transforms/PhaseOrdering/scev-custom-dl.ll b/llvm/test/Transforms/PhaseOrdering/scev-custom-dl.ll index ae822dd2e81..f67b121383c 100644 --- a/llvm/test/Transforms/PhaseOrdering/scev-custom-dl.ll +++ b/llvm/test/Transforms/PhaseOrdering/scev-custom-dl.ll @@ -65,3 +65,73 @@ for.inc: ; preds = %for.body for.end: ; preds = %for.cond ret void } + +@array = weak global [101 x i32] zeroinitializer, align 32 ; <[100 x i32]*> [#uses=1] + +; CHECK: Loop %bb: backedge-taken count is 100 + +define void @test_range_ref1a(i32 %x) { +entry: + br label %bb + +bb: ; preds = %bb, %entry + %i.01.0 = phi i32 [ 100, %entry ], [ %tmp4, %bb ] ; <i32> [#uses=2] + %tmp1 = getelementptr [101 x i32], [101 x i32]* @array, i32 0, i32 %i.01.0 ; <i32*> [#uses=1] + store i32 %x, i32* %tmp1 + %tmp4 = add i32 %i.01.0, -1 ; <i32> [#uses=2] + %tmp7 = icmp sgt i32 %tmp4, -1 ; <i1> [#uses=1] + br i1 %tmp7, label %bb, label %return + +return: ; preds = %bb + ret void +} + +define i32 @test_loop_idiom_recogize(i32 %x, i32 %y, i32* %lam, i32* %alp) nounwind { +bb1.thread: + br label %bb1 + +bb1: ; preds = %bb1, %bb1.thread + %indvar = phi i32 [ 0, %bb1.thread ], [ %indvar.next, %bb1 ] ; <i32> [#uses=4] + %i.0.reg2mem.0 = sub i32 255, %indvar ; <i32> [#uses=2] + %0 = getelementptr i32, i32* %alp, i32 %i.0.reg2mem.0 ; <i32*> [#uses=1] + %1 = load i32, i32* %0, align 4 ; <i32> [#uses=1] + %2 = getelementptr i32, i32* %lam, i32 %i.0.reg2mem.0 ; <i32*> [#uses=1] + store i32 %1, i32* %2, align 4 + %3 = sub i32 254, %indvar ; <i32> [#uses=1] + %4 = icmp slt i32 %3, 0 ; <i1> [#uses=1] + %indvar.next = add i32 %indvar, 1 ; <i32> [#uses=1] + br i1 %4, label %bb2, label %bb1 + +bb2: ; preds = %bb1 + %tmp10 = mul i32 %indvar, %x ; <i32> [#uses=1] + %z.0.reg2mem.0 = add i32 %tmp10, %y ; <i32> [#uses=1] + %5 = add i32 %z.0.reg2mem.0, %x ; <i32> [#uses=1] + ret i32 %5 +} + +declare void @use(i1) + +declare void @llvm.experimental.guard(i1, ...) + +; This tests getRangeRef acts as intended with different idx size. +; CHECK: max backedge-taken count is 318 +define void @test_range_ref1(i8 %t) { + entry: + %t.ptr = inttoptr i8 %t to i8* + %p.42 = inttoptr i8 42 to i8* + %cmp1 = icmp slt i8* %t.ptr, %p.42 + call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] + br label %loop + + loop: + %idx = phi i8* [ %t.ptr, %entry ], [ %snext, %loop ] + %snext = getelementptr inbounds i8, i8* %idx, i64 1 + %c = icmp slt i8* %idx, %p.42 + call void @use(i1 %c) + %be = icmp slt i8* %snext, %p.42 + br i1 %be, label %loop, label %exit + + exit: + ret void +} + diff --git a/llvm/test/Transforms/SimplifyCFG/switch_create-custom-dl.ll b/llvm/test/Transforms/SimplifyCFG/switch_create-custom-dl.ll index 083cfe1ee29..dc07eb20568 100644 --- a/llvm/test/Transforms/SimplifyCFG/switch_create-custom-dl.ll +++ b/llvm/test/Transforms/SimplifyCFG/switch_create-custom-dl.ll @@ -33,10 +33,10 @@ F: ; preds = %0 define void @test1_ptr(i32* %V) { ; CHECK-LABEL: @test1_ptr( -; CHECK-NEXT: [[MAGICPTR:%.*]] = ptrtoint i32* [[V:%.*]] to i32 -; CHECK-NEXT: switch i32 [[MAGICPTR]], label [[F:%.*]] [ -; CHECK-NEXT: i32 17, label [[T:%.*]] -; CHECK-NEXT: i32 4, label [[T]] +; CHECK-NEXT: [[MAGICPTR:%.*]] = ptrtoint i32* [[V:%.*]] to i40 +; CHECK-NEXT: switch i40 [[MAGICPTR]], label [[F:%.*]] [ +; CHECK-NEXT: i40 17, label [[T:%.*]] +; CHECK-NEXT: i40 4, label [[T]] ; CHECK-NEXT: ] ; CHECK: T: ; CHECK-NEXT: call void @foo1() @@ -59,10 +59,10 @@ F: ; preds = %0 define void @test1_ptr_as1(i32 addrspace(1)* %V) { ; CHECK-LABEL: @test1_ptr_as1( -; CHECK-NEXT: [[MAGICPTR:%.*]] = ptrtoint i32 addrspace(1)* [[V:%.*]] to i32 -; CHECK-NEXT: switch i32 [[MAGICPTR]], label [[F:%.*]] [ -; CHECK-NEXT: i32 17, label [[T:%.*]] -; CHECK-NEXT: i32 4, label [[T]] +; CHECK-NEXT: [[MAGICPTR:%.*]] = ptrtoint i32 addrspace(1)* [[V:%.*]] to i40 +; CHECK-NEXT: switch i40 [[MAGICPTR]], label [[F:%.*]] [ +; CHECK-NEXT: i40 17, label [[T:%.*]] +; CHECK-NEXT: i40 4, label [[T]] ; CHECK-NEXT: ] ; CHECK: T: ; CHECK-NEXT: call void @foo1() |

