diff options
Diffstat (limited to 'llvm/test/Transforms/InstCombine')
7 files changed, 186 insertions, 2 deletions
diff --git a/llvm/test/Transforms/InstCombine/load-combine-metadata-2.ll b/llvm/test/Transforms/InstCombine/load-combine-metadata-2.ll new file mode 100644 index 00000000000..bec0d7d2c36 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/load-combine-metadata-2.ll @@ -0,0 +1,20 @@ +; RUN: opt -instcombine -S < %s | FileCheck %s + +target datalayout = "e-m:e-p:64:64:64-i64:64-f80:128-n8:16:32:64-S128" + +; CHECK-LABEL: @test_load_load_combine_metadata( +; Check that align metadata is combined +; CHECK: load i32*, i32** %0 +; CHECK-SAME: !align ![[ALIGN:[0-9]+]] +define void @test_load_load_combine_metadata(i32**, i32**, i32**) { + %a = load i32*, i32** %0, !align !0 + %b = load i32*, i32** %0, !align !1 + store i32 0, i32* %a + store i32 0, i32* %b + ret void +} + +; CHECK: ![[ALIGN]] = !{i64 4} + +!0 = !{i64 4} +!1 = !{i64 8}
\ No newline at end of file diff --git a/llvm/test/Transforms/InstCombine/load-combine-metadata-3.ll b/llvm/test/Transforms/InstCombine/load-combine-metadata-3.ll new file mode 100644 index 00000000000..bad4bb24059 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/load-combine-metadata-3.ll @@ -0,0 +1,20 @@ +; RUN: opt -instcombine -S < %s | FileCheck %s + +target datalayout = "e-m:e-p:64:64:64-i64:64-f80:128-n8:16:32:64-S128" + +; CHECK-LABEL: @test_load_load_combine_metadata( +; Check that dereferenceable metadata is combined +; CHECK: load i32*, i32** %0 +; CHECK-SAME: !dereferenceable ![[DEREF:[0-9]+]] +define void @test_load_load_combine_metadata(i32**, i32**, i32**) { + %a = load i32*, i32** %0, !dereferenceable !0 + %b = load i32*, i32** %0, !dereferenceable !1 + store i32 0, i32* %a + store i32 0, i32* %b + ret void +} + +; CHECK: ![[DEREF]] = !{i64 4} + +!0 = !{i64 4} +!1 = !{i64 8}
\ No newline at end of file diff --git a/llvm/test/Transforms/InstCombine/load-combine-metadata-4.ll b/llvm/test/Transforms/InstCombine/load-combine-metadata-4.ll new file mode 100644 index 00000000000..2a1ffcd0605 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/load-combine-metadata-4.ll @@ -0,0 +1,20 @@ +; RUN: opt -instcombine -S < %s | FileCheck %s + +target datalayout = "e-m:e-p:64:64:64-i64:64-f80:128-n8:16:32:64-S128" + +; CHECK-LABEL: @test_load_load_combine_metadata( +; Check that dereferenceable_or_null metadata is combined +; CHECK: load i32*, i32** %0 +; CHECK-SAME: !dereferenceable_or_null ![[DEREF:[0-9]+]] +define void @test_load_load_combine_metadata(i32**, i32**, i32**) { + %a = load i32*, i32** %0, !dereferenceable_or_null !0 + %b = load i32*, i32** %0, !dereferenceable_or_null !1 + store i32 0, i32* %a + store i32 0, i32* %b + ret void +} + +; CHECK: ![[DEREF]] = !{i64 4} + +!0 = !{i64 4} +!1 = !{i64 8} diff --git a/llvm/test/Transforms/InstCombine/loadstore-metadata.ll b/llvm/test/Transforms/InstCombine/loadstore-metadata.ll index a30c0bc852e..f72e36a7ea3 100644 --- a/llvm/test/Transforms/InstCombine/loadstore-metadata.ll +++ b/llvm/test/Transforms/InstCombine/loadstore-metadata.ll @@ -31,7 +31,7 @@ define float @test_load_cast_combine_range(i32* %ptr) { ; CHECK-NOT: !range ; CHECK: ret float entry: - %l = load i32, i32* %ptr, !range !5 + %l = load i32, i32* %ptr, !range !6 %c = bitcast i32 %l to float ret float %c } @@ -57,6 +57,39 @@ entry: ret i32 %c } +define i8* @test_load_cast_combine_align(i32** %ptr) { +; Ensure (cast (load (...))) -> (load (cast (...))) preserves align +; metadata. +; CHECK-LABEL: @test_load_cast_combine_align( +; CHECK: load i8*, i8** %{{.*}}, !align !5 +entry: + %l = load i32*, i32** %ptr, !align !5 + %c = bitcast i32* %l to i8* + ret i8* %c +} + +define i8* @test_load_cast_combine_deref(i32** %ptr) { +; Ensure (cast (load (...))) -> (load (cast (...))) preserves dereferenceable +; metadata. +; CHECK-LABEL: @test_load_cast_combine_deref( +; CHECK: load i8*, i8** %{{.*}}, !dereferenceable !5 +entry: + %l = load i32*, i32** %ptr, !dereferenceable !5 + %c = bitcast i32* %l to i8* + ret i8* %c +} + +define i8* @test_load_cast_combine_deref_or_null(i32** %ptr) { +; Ensure (cast (load (...))) -> (load (cast (...))) preserves +; dereferenceable_or_null metadata. +; CHECK-LABEL: @test_load_cast_combine_deref_or_null( +; CHECK: load i8*, i8** %{{.*}}, !dereferenceable_or_null !5 +entry: + %l = load i32*, i32** %ptr, !dereferenceable_or_null !5 + %c = bitcast i32* %l to i8* + ret i8* %c +} + define void @test_load_cast_combine_loop(float* %src, i32* %dst, i32 %n) { ; Ensure (cast (load (...))) -> (load (cast (...))) preserves loop access ; metadata. @@ -110,4 +143,5 @@ entry: !2 = !{ !2, !1 } !3 = !{ } !4 = !{ i32 1 } -!5 = !{ i32 0, i32 42 } +!5 = !{ i64 8 } +!6 = !{ i32 0, i32 42 } diff --git a/llvm/test/Transforms/InstCombine/phi-load-metadata-2.ll b/llvm/test/Transforms/InstCombine/phi-load-metadata-2.ll new file mode 100644 index 00000000000..cfbf2dea8a7 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/phi-load-metadata-2.ll @@ -0,0 +1,30 @@ +; RUN: opt -instcombine -S < %s | FileCheck %s + +declare void @bar() +declare void @baz() + +; Check that dereferenceable metadata is combined +; CHECK-LABEL: cont: +; CHECK: load i32*, i32** +; CHECK-SAME: !dereferenceable ![[DEREF:[0-9]+]] +define i32* @test_phi_combine_load_metadata(i1 %c, i32** dereferenceable(8) %p1, i32** dereferenceable(8) %p2) { + br i1 %c, label %t, label %f +t: + call void @bar() + %v1 = load i32*, i32** %p1, align 8, !dereferenceable !0 + br label %cont + +f: + call void @baz() + %v2 = load i32*, i32** %p2, align 8, !dereferenceable !1 + br label %cont + +cont: + %res = phi i32* [ %v1, %t ], [ %v2, %f ] + ret i32* %res +} + +; CHECK: ![[DEREF]] = !{i64 8} + +!0 = !{i64 8} +!1 = !{i64 16} diff --git a/llvm/test/Transforms/InstCombine/phi-load-metadata-3.ll b/llvm/test/Transforms/InstCombine/phi-load-metadata-3.ll new file mode 100644 index 00000000000..39049c9c718 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/phi-load-metadata-3.ll @@ -0,0 +1,30 @@ +; RUN: opt -instcombine -S < %s | FileCheck %s + +declare void @bar() +declare void @baz() + +; Check that dereferenceable_or_null metadata is combined +; CHECK-LABEL: cont: +; CHECK: load i32*, i32** +; CHECK-SAME: !dereferenceable_or_null ![[DEREF:[0-9]+]] +define i32* @test_phi_combine_load_metadata(i1 %c, i32** dereferenceable(8) %p1, i32** dereferenceable(8) %p2) { + br i1 %c, label %t, label %f +t: + call void @bar() + %v1 = load i32*, i32** %p1, align 8, !dereferenceable_or_null !0 + br label %cont + +f: + call void @baz() + %v2 = load i32*, i32** %p2, align 8, !dereferenceable_or_null !1 + br label %cont + +cont: + %res = phi i32* [ %v1, %t ], [ %v2, %f ] + ret i32* %res +} + +; CHECK: ![[DEREF]] = !{i64 8} + +!0 = !{i64 8} +!1 = !{i64 16} diff --git a/llvm/test/Transforms/InstCombine/phi-load-metadata.ll b/llvm/test/Transforms/InstCombine/phi-load-metadata.ll new file mode 100644 index 00000000000..004a355ca44 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/phi-load-metadata.ll @@ -0,0 +1,30 @@ +; RUN: opt -instcombine -S < %s | FileCheck %s + +declare void @bar() +declare void @baz() + +; Check that align metadata is combined +; CHECK-LABEL: cont: +; CHECK: load i32*, i32** +; CHECK-SAME: !align ![[ALIGN:[0-9]+]] +define i32* @test_phi_combine_load_metadata(i1 %c, i32** dereferenceable(8) %p1, i32** dereferenceable(8) %p2) { + br i1 %c, label %t, label %f +t: + call void @bar() + %v1 = load i32*, i32** %p1, align 8, !align !0 + br label %cont + +f: + call void @baz() + %v2 = load i32*, i32** %p2, align 8, !align !1 + br label %cont + +cont: + %res = phi i32* [ %v1, %t ], [ %v2, %f ] + ret i32* %res +} + +; CHECK: ![[ALIGN]] = !{i64 8} + +!0 = !{i64 8} +!1 = !{i64 16} |