[llvm] r278404 - Move GVNHoist tests into their own directory since it is a separate pass
Daniel Berlin via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 11 13:35:07 PDT 2016
Author: dannyb
Date: Thu Aug 11 15:35:07 2016
New Revision: 278404
URL: http://llvm.org/viewvc/llvm-project?rev=278404&view=rev
Log:
Move GVNHoist tests into their own directory since it is a separate pass
Added:
llvm/trunk/test/Transforms/GVNHoist/
llvm/trunk/test/Transforms/GVNHoist/hoist-call.ll
- copied, changed from r278401, llvm/trunk/test/Transforms/GVN/hoist-call.ll
llvm/trunk/test/Transforms/GVNHoist/hoist-convergent.ll
- copied, changed from r278401, llvm/trunk/test/Transforms/GVN/hoist-convergent.ll
llvm/trunk/test/Transforms/GVNHoist/hoist-md.ll
- copied, changed from r278401, llvm/trunk/test/Transforms/GVN/hoist-md.ll
llvm/trunk/test/Transforms/GVNHoist/hoist-mssa.ll
- copied, changed from r278401, llvm/trunk/test/Transforms/GVN/hoist-mssa.ll
llvm/trunk/test/Transforms/GVNHoist/hoist-pr20242.ll
- copied, changed from r278401, llvm/trunk/test/Transforms/GVN/hoist-pr20242.ll
llvm/trunk/test/Transforms/GVNHoist/hoist-pr22005.ll
- copied, changed from r278401, llvm/trunk/test/Transforms/GVN/hoist-pr22005.ll
llvm/trunk/test/Transforms/GVNHoist/hoist-pr28606.ll
- copied, changed from r278401, llvm/trunk/test/Transforms/GVN/hoist-pr28606.ll
llvm/trunk/test/Transforms/GVNHoist/hoist-pr28933.ll
- copied, changed from r278401, llvm/trunk/test/Transforms/GVN/hoist-pr28933.ll
llvm/trunk/test/Transforms/GVNHoist/hoist-recursive-geps.ll
- copied, changed from r278401, llvm/trunk/test/Transforms/GVN/hoist-recursive-geps.ll
llvm/trunk/test/Transforms/GVNHoist/hoist.ll
- copied, changed from r278401, llvm/trunk/test/Transforms/GVN/hoist.ll
Removed:
llvm/trunk/test/Transforms/GVN/hoist-call.ll
llvm/trunk/test/Transforms/GVN/hoist-convergent.ll
llvm/trunk/test/Transforms/GVN/hoist-md.ll
llvm/trunk/test/Transforms/GVN/hoist-mssa.ll
llvm/trunk/test/Transforms/GVN/hoist-pr20242.ll
llvm/trunk/test/Transforms/GVN/hoist-pr22005.ll
llvm/trunk/test/Transforms/GVN/hoist-pr28606.ll
llvm/trunk/test/Transforms/GVN/hoist-pr28933.ll
llvm/trunk/test/Transforms/GVN/hoist-recursive-geps.ll
llvm/trunk/test/Transforms/GVN/hoist.ll
Removed: llvm/trunk/test/Transforms/GVN/hoist-call.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/hoist-call.ll?rev=278403&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GVN/hoist-call.ll (original)
+++ llvm/trunk/test/Transforms/GVN/hoist-call.ll (removed)
@@ -1,28 +0,0 @@
-; RUN: opt -S -gvn-hoist < %s | FileCheck %s
-
-; Check that the call and fcmp are hoisted.
-; CHECK-LABEL: define void @fun(
-; CHECK: call float
-; CHECK: fcmp oeq
-; CHECK-NOT: call float
-; CHECK-NOT: fcmp oeq
-
-define void @fun(float %__b) minsize {
-entry:
- br label %if.then
-
-if.then: ; preds = %entry
- br i1 undef, label %if.then8, label %lor.lhs.false
-
-lor.lhs.false: ; preds = %if.then
- %0 = call float @llvm.fabs.f32(float %__b) #2
- %cmpinf7 = fcmp oeq float %0, 0x7FF0000000000000
- unreachable
-
-if.then8: ; preds = %if.then
- %1 = call float @llvm.fabs.f32(float %__b) #2
- %cmpinf10 = fcmp oeq float %1, 0x7FF0000000000000
- ret void
-}
-
-declare float @llvm.fabs.f32(float)
Removed: llvm/trunk/test/Transforms/GVN/hoist-convergent.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/hoist-convergent.ll?rev=278403&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GVN/hoist-convergent.ll (original)
+++ llvm/trunk/test/Transforms/GVN/hoist-convergent.ll (removed)
@@ -1,93 +0,0 @@
-; RUN: opt -gvn-hoist -S < %s | FileCheck %s
-
-; Check that convergent calls are not hoisted.
-;
-; CHECK-LABEL: @no_convergent_func_hoisting(
-; CHECK: if.then:
-; CHECK: call float @convergent_func(
-
-; CHECK: if.else:
-; CHECK: call float @convergent_func(
-define float @no_convergent_func_hoisting(float %d, float %min, float %max, float %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- %cmp = fcmp oge float %div, 0.000000e+00
- br i1 %cmp, label %if.then, label %if.else
-
-if.then:
- %sub1 = fsub float %max, %a
- %mul2 = call float @convergent_func(float %sub1, float %div)
- br label %if.end
-
-if.else:
- %sub5 = fsub float %max, %a
- %mul6 = call float @convergent_func(float %sub5, float %div)
- br label %if.end
-
-if.end:
- %tmax.0 = phi float [ %mul2, %if.then ], [ %mul6, %if.else ]
- %add = fadd float %tmax.0, 10.0
- ret float %add
-}
-
-; The call site is convergent but the declaration is not.
-; CHECK-LABEL: @no_convergent_call_hoisting(
-
-; CHECK: if.then:
-; CHECK: call float @func(
-
-; CHECK: if.else:
-; CHECK: call float @func(
-define float @no_convergent_call_hoisting(float %d, float %min, float %max, float %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- %cmp = fcmp oge float %div, 0.000000e+00
- br i1 %cmp, label %if.then, label %if.else
-
-if.then:
- %sub1 = fsub float %max, %a
- %mul2 = call float @func(float %sub1, float %div) #0
- br label %if.end
-
-if.else:
- %sub5 = fsub float %max, %a
- %mul6 = call float @func(float %sub5, float %div) #0
- br label %if.end
-
-if.end:
- %tmax.0 = phi float [ %mul2, %if.then ], [ %mul6, %if.else ]
- %add = fadd float %tmax.0, 10.0
- ret float %add
-}
-
-; The call site is convergent but the declaration is not.
-; CHECK-LABEL: @call_hoisting(
-; CHECK: call float @func(
-; CHECK-NOT: call float @func(
-define float @call_hoisting(float %d, float %min, float %max, float %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- %cmp = fcmp oge float %div, 0.000000e+00
- br i1 %cmp, label %if.then, label %if.else
-
-if.then:
- %sub1 = fsub float %max, %a
- %mul2 = call float @func(float %sub1, float %div)
- br label %if.end
-
-if.else:
- %sub5 = fsub float %max, %a
- %mul6 = call float @func(float %sub5, float %div)
- br label %if.end
-
-if.end:
- %tmax.0 = phi float [ %mul2, %if.then ], [ %mul6, %if.else ]
- %add = fadd float %tmax.0, 10.0
- ret float %add
-}
-
-declare float @convergent_func(float, float) #0
-declare float @func(float, float) #1
-
-attributes #0 = { nounwind readnone convergent }
-attributes #1 = { nounwind readnone }
Removed: llvm/trunk/test/Transforms/GVN/hoist-md.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/hoist-md.ll?rev=278403&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GVN/hoist-md.ll (original)
+++ llvm/trunk/test/Transforms/GVN/hoist-md.ll (removed)
@@ -1,98 +0,0 @@
-; RUN: opt -S -gvn-hoist < %s | FileCheck %s
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-define void @test1(i1 %b, i32* %x) {
-entry:
- br i1 %b, label %if.then, label %if.else
-
-if.then: ; preds = %entry
- store i32 2, i32* %x, align 4, !tbaa !1
- br label %if.end
-
-if.else: ; preds = %entry
- store i32 2, i32* %x, align 4, !tbaa !5
- br label %if.end
-
-if.end: ; preds = %if.else, %if.then
- ret void
-}
-; CHECK-LABEL: define void @test1(
-; CHECK: store i32 2, i32* %x, align 4
-; CHECK-NEXT: br i1 %b
-
-define void @test2(i1 %b, i32* %x) {
-entry:
- br i1 %b, label %if.then, label %if.else
-
-if.then: ; preds = %entry
- %gep1 = getelementptr inbounds i32, i32* %x, i64 1
- store i32 2, i32* %gep1, align 4, !tbaa !1
- br label %if.end
-
-if.else: ; preds = %entry
- %gep2 = getelementptr inbounds i32, i32* %x, i64 1
- store i32 2, i32* %gep2, align 4, !tbaa !5
- br label %if.end
-
-if.end: ; preds = %if.else, %if.then
- ret void
-}
-; CHECK-LABEL: define void @test2(
-; CHECK: %[[gep:.*]] = getelementptr inbounds i32, i32* %x, i64 1
-; CHECK: store i32 2, i32* %[[gep]], align 4
-; CHECK-NEXT: br i1 %b
-
-define void @test3(i1 %b, i32* %x) {
-entry:
- br i1 %b, label %if.then, label %if.else
-
-if.then: ; preds = %entry
- %gep1 = getelementptr inbounds i32, i32* %x, i64 1
- store i32 2, i32* %gep1, align 4, !tbaa !1
- br label %if.end
-
-if.else: ; preds = %entry
- %gep2 = getelementptr i32, i32* %x, i64 1
- store i32 2, i32* %gep2, align 4, !tbaa !5
- br label %if.end
-
-if.end: ; preds = %if.else, %if.then
- ret void
-}
-; CHECK-LABEL: define void @test3(
-; CHECK: %[[gep:.*]] = getelementptr i32, i32* %x, i64 1
-; CHECK: store i32 2, i32* %[[gep]], align 4
-; CHECK-NEXT: br i1 %b
-
-!1 = !{!2, !2, i64 0}
-!2 = !{!"int", !3, i64 0}
-!3 = !{!"omnipotent char", !4, i64 0}
-!4 = !{!"Simple C++ TBAA"}
-!5 = !{!6, !6, i64 0}
-!6 = !{!"_ZTS1e", !3, i64 0}
-
-define i32 @test4(i1 %b, i32* %y) {
-entry:
- br i1 %b, label %if.then, label %if.end
-
-if.then: ; preds = %entry
- %0 = load i32, i32* %y, align 4, !range !7
- br label %return
-
-if.end: ; preds = %entry
- %1 = load i32, i32* %y, align 4, !range !8
- br label %return
-
-return: ; preds = %if.end, %if.then
- %retval.0 = phi i32 [ %0, %if.then ], [ %1, %if.end ]
- ret i32 %retval.0
-}
-; CHECK-LABEL: define i32 @test4(
-; CHECK: %[[load:.*]] = load i32, i32* %y, align 4, !range ![[range_md:.*]]
-; CHECK: %[[phi:.*]] = phi i32 [ %[[load]], %{{.*}} ], [ %[[load]], %{{.*}} ]
-; CHECK: ret i32 %[[phi]]
-
-!7 = !{i32 0, i32 2}
-!8 = !{i32 3, i32 4}
-; CHECK: ![[range_md]] = !{i32 0, i32 2, i32 3, i32 4}
Removed: llvm/trunk/test/Transforms/GVN/hoist-mssa.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/hoist-mssa.ll?rev=278403&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GVN/hoist-mssa.ll (original)
+++ llvm/trunk/test/Transforms/GVN/hoist-mssa.ll (removed)
@@ -1,69 +0,0 @@
-; RUN: opt -S -gvn-hoist < %s | FileCheck %s
-
-; Check that store hoisting works: there should be only one store left.
-; CHECK-LABEL: @getopt
-; CHECK: store i32
-; CHECK-NOT: store i32
-
- at optind = external global i32, align 4
-
-define void @getopt() {
-bb:
- br label %bb1
-
-bb1: ; preds = %bb
- br i1 undef, label %bb2, label %bb3
-
-bb2: ; preds = %bb1
- br label %bb13
-
-bb3: ; preds = %bb1
- br i1 undef, label %bb4, label %bb9
-
-bb4: ; preds = %bb3
- %tmp = load i32, i32* @optind, align 4
- br i1 undef, label %bb5, label %bb7
-
-bb5: ; preds = %bb4
- %tmp6 = add nsw i32 %tmp, 1
- store i32 %tmp6, i32* @optind, align 4
- br label %bb12
-
-bb7: ; preds = %bb4
- %tmp8 = add nsw i32 %tmp, 1
- store i32 %tmp8, i32* @optind, align 4
- br label %bb13
-
-bb9: ; preds = %bb3
- %tmp10 = load i32, i32* @optind, align 4
- %tmp11 = add nsw i32 %tmp10, 1
- store i32 %tmp11, i32* @optind, align 4
- br label %bb12
-
-bb12: ; preds = %bb9, %bb5
- br label %bb13
-
-bb13: ; preds = %bb12, %bb7, %bb2
- ret void
-}
-
- at GlobalVar = internal global float 1.000000e+00
-
-; Check that we hoist stores and remove the MSSA phi node.
-; CHECK-LABEL: @hoistStoresUpdateMSSA
-; CHECK: store float
-; CHECK-NOT: store float
-define float @hoistStoresUpdateMSSA(float %d) {
-entry:
- store float 0.000000e+00, float* @GlobalVar
- %cmp = fcmp oge float %d, 0.000000e+00
- br i1 %cmp, label %if.then, label %if.end
-
-if.then:
- store float 0.000000e+00, float* @GlobalVar
- br label %if.end
-
-if.end:
- %tmp = load float, float* @GlobalVar, align 4
- ret float %tmp
-}
Removed: llvm/trunk/test/Transforms/GVN/hoist-pr20242.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/hoist-pr20242.ll?rev=278403&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GVN/hoist-pr20242.ll (original)
+++ llvm/trunk/test/Transforms/GVN/hoist-pr20242.ll (removed)
@@ -1,74 +0,0 @@
-; RUN: opt -gvn-hoist -S < %s | FileCheck %s
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-; Check that all "or" expressions are hoisted.
-; CHECK-LABEL: @encode
-; CHECK: or i32
-; CHECK-NOT: or i32
-
-define i8* @encode(i8* %p, i32 %v) {
-entry:
- %p.addr = alloca i8*, align 8
- %v.addr = alloca i32, align 4
- store i8* %p, i8** %p.addr, align 8
- store i32 %v, i32* %v.addr, align 4
- %0 = load i32, i32* %v.addr, align 4
- %cmp = icmp ult i32 %0, 23
- br i1 %cmp, label %if.then, label %if.else
-
-if.then: ; preds = %entry
- %1 = load i32, i32* %v.addr, align 4
- %or = or i32 %1, 128
- %conv = trunc i32 %or to i8
- %2 = load i8*, i8** %p.addr, align 8
- %incdec.ptr = getelementptr inbounds i8, i8* %2, i32 1
- store i8* %incdec.ptr, i8** %p.addr, align 8
- store i8 %conv, i8* %2, align 1
- br label %if.end15
-
-if.else: ; preds = %entry
- %3 = load i32, i32* %v.addr, align 4
- %cmp1 = icmp ult i32 %3, 42
- br i1 %cmp1, label %if.then3, label %if.else9
-
-if.then3: ; preds = %if.else
- %4 = load i32, i32* %v.addr, align 4
- %or4 = or i32 %4, 128
- %conv5 = trunc i32 %or4 to i8
- %5 = load i8*, i8** %p.addr, align 8
- %incdec.ptr6 = getelementptr inbounds i8, i8* %5, i32 1
- store i8* %incdec.ptr6, i8** %p.addr, align 8
- store i8 %conv5, i8* %5, align 1
- %6 = load i32, i32* %v.addr, align 4
- %conv7 = trunc i32 %6 to i8
- %7 = load i8*, i8** %p.addr, align 8
- %incdec.ptr8 = getelementptr inbounds i8, i8* %7, i32 1
- store i8* %incdec.ptr8, i8** %p.addr, align 8
- store i8 %conv7, i8* %7, align 1
- br label %if.end
-
-if.else9: ; preds = %if.else
- %8 = load i32, i32* %v.addr, align 4
- %or10 = or i32 %8, 128
- %conv11 = trunc i32 %or10 to i8
- %9 = load i8*, i8** %p.addr, align 8
- %incdec.ptr12 = getelementptr inbounds i8, i8* %9, i32 1
- store i8* %incdec.ptr12, i8** %p.addr, align 8
- store i8 %conv11, i8* %9, align 1
- %10 = load i32, i32* %v.addr, align 4
- %shr = lshr i32 %10, 7
- %conv13 = trunc i32 %shr to i8
- %11 = load i8*, i8** %p.addr, align 8
- %incdec.ptr14 = getelementptr inbounds i8, i8* %11, i32 1
- store i8* %incdec.ptr14, i8** %p.addr, align 8
- store i8 %conv13, i8* %11, align 1
- br label %if.end
-
-if.end: ; preds = %if.else9, %if.then3
- br label %if.end15
-
-if.end15: ; preds = %if.end, %if.then
- %12 = load i8*, i8** %p.addr, align 8
- ret i8* %12
-}
Removed: llvm/trunk/test/Transforms/GVN/hoist-pr22005.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/hoist-pr22005.ll?rev=278403&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GVN/hoist-pr22005.ll (original)
+++ llvm/trunk/test/Transforms/GVN/hoist-pr22005.ll (removed)
@@ -1,30 +0,0 @@
-; RUN: opt -gvn-hoist -S < %s | FileCheck %s
-target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
-; Check that all "sub" expressions are hoisted.
-; CHECK-LABEL: @fun
-; CHECK: sub i64
-; CHECK-NOT: sub i64
-
-define i64 @fun(i8* %out, i8* %end) {
- %1 = icmp ult i8* %out, %end
- br i1 %1, label %2, label %6
-
-; <label>:2 ; preds = %0
- %3 = ptrtoint i8* %end to i64
- %4 = ptrtoint i8* %out to i64
- %5 = sub i64 %3, %4
- br label %10
-
-; <label>:6 ; preds = %0
- %7 = ptrtoint i8* %out to i64
- %8 = ptrtoint i8* %end to i64
- %9 = sub i64 %8, %7
- br label %10
-
-; <label>:10 ; preds = %6, %2
- %.in = phi i64 [ %5, %2 ], [ %9, %6 ]
- %11 = add i64 %.in, 257
- ret i64 %11
-}
Removed: llvm/trunk/test/Transforms/GVN/hoist-pr28606.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/hoist-pr28606.ll?rev=278403&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GVN/hoist-pr28606.ll (original)
+++ llvm/trunk/test/Transforms/GVN/hoist-pr28606.ll (removed)
@@ -1,50 +0,0 @@
-; RUN: opt -gvn-hoist -S < %s | FileCheck %s
-
-target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
-target triple = "i686-pc-windows-msvc18.0.0"
-
-%struct.S = type { i8* }
-
-declare void @f(<{ %struct.S }>* inalloca)
-
-
-; Check that we don't clone the %x alloca and insert it in the live range of
-; %argmem, which would break the inalloca contract.
-;
-; CHECK-LABEL: @test
-; CHECK: alloca i8
-; CHECK: stacksave
-; CHECK: alloca inalloca
-; CHECK-NOT: alloca i8
-
-; Check that store instructions are hoisted.
-; CHECK: store i8
-; CHECK-NOT: store i8
-; CHECK: stackrestore
-
-define void @test(i1 %b) {
-entry:
- %x = alloca i8
- %inalloca.save = call i8* @llvm.stacksave()
- %argmem = alloca inalloca <{ %struct.S }>, align 4
- %0 = getelementptr inbounds <{ %struct.S }>, <{ %struct.S }>* %argmem, i32 0, i32 0
- br i1 %b, label %true, label %false
-
-true:
- %p = getelementptr inbounds %struct.S, %struct.S* %0, i32 0, i32 0
- store i8* %x, i8** %p, align 4
- br label %exit
-
-false:
- %p2 = getelementptr inbounds %struct.S, %struct.S* %0, i32 0, i32 0
- store i8* %x, i8** %p2, align 4
- br label %exit
-
-exit:
- call void @f(<{ %struct.S }>* inalloca %argmem)
- call void @llvm.stackrestore(i8* %inalloca.save)
- ret void
-}
-
-declare i8* @llvm.stacksave()
-declare void @llvm.stackrestore(i8*)
Removed: llvm/trunk/test/Transforms/GVN/hoist-pr28933.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/hoist-pr28933.ll?rev=278403&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GVN/hoist-pr28933.ll (original)
+++ llvm/trunk/test/Transforms/GVN/hoist-pr28933.ll (removed)
@@ -1,21 +0,0 @@
-; RUN: opt -S -gvn-hoist -verify-memoryssa < %s | FileCheck %s
-
-; Check that we end up with one load and one store, in the right order
-; CHECK-LABEL: define void @test_it(
-; CHECK: store
-; CHECK-NEXT: load
-; CHECK-NOT: store
-; CHECK-NOT: load
-
-%rec894.0.1.2.3.12 = type { i16 }
-
- at a = external global %rec894.0.1.2.3.12
-
-define void @test_it() {
-bb2:
- store i16 undef, i16* getelementptr inbounds (%rec894.0.1.2.3.12, %rec894.0.1.2.3.12* @a, i16 0, i32 0), align 1
- %_tmp61 = load i16, i16* getelementptr inbounds (%rec894.0.1.2.3.12, %rec894.0.1.2.3.12* @a, i16 0, i32 0), align 1
- store i16 undef, i16* getelementptr inbounds (%rec894.0.1.2.3.12, %rec894.0.1.2.3.12* @a, i16 0, i32 0), align 1
- %_tmp92 = load i16, i16* getelementptr inbounds (%rec894.0.1.2.3.12, %rec894.0.1.2.3.12* @a, i16 0, i32 0), align 1
- ret void
-}
Removed: llvm/trunk/test/Transforms/GVN/hoist-recursive-geps.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/hoist-recursive-geps.ll?rev=278403&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GVN/hoist-recursive-geps.ll (original)
+++ llvm/trunk/test/Transforms/GVN/hoist-recursive-geps.ll (removed)
@@ -1,103 +0,0 @@
-; RUN: opt -gvn-hoist -S < %s | FileCheck %s
-
-; Check that recursive GEPs are hoisted.
-; CHECK-LABEL: @fun
-; CHECK: fdiv
-; CHECK: load
-; CHECK: load
-; CHECK: load
-; CHECK: load
-; CHECK: fsub
-; CHECK: fmul
-; CHECK: fsub
-; CHECK: fmul
-; CHECK-NOT: fsub
-; CHECK-NOT: fmul
-
-%0 = type { double, double, double }
-%1 = type { double, double, double }
-%2 = type { %3, %1, %1 }
-%3 = type { i32 (...)**, %4, %10*, %11, %11, %11, %11, %11, %11, %11, %11, %11 }
-%4 = type { %5 }
-%5 = type { %6 }
-%6 = type { %7 }
-%7 = type { %8 }
-%8 = type { %9 }
-%9 = type { i64, i64, i8* }
-%10 = type <{ i32 (...)**, i32, [4 x i8] }>
-%11 = type { [4 x [4 x double]] }
-%12 = type <{ %1, %0, i32, [4 x i8] }>
-%13 = type { %1, %0, %12, %3*, %14* }
-%14 = type opaque
-
- at d = external global %0, align 8
- at p = external global %1, align 8
-
-define zeroext i1 @fun(%2*, %12* dereferenceable(56), double*, %13*) {
- %5 = alloca %2*, align 8
- %6 = alloca %12*, align 8
- %7 = alloca double*, align 8
- %8 = alloca %13*, align 8
- %9 = alloca double, align 8
- %10 = alloca double, align 8
- %11 = alloca double, align 8
- %12 = alloca double, align 8
- %13 = alloca double, align 8
- %14 = alloca double, align 8
- %15 = alloca double, align 8
- store %2* %0, %2** %5, align 8
- store %12* %1, %12** %6, align 8
- store double* %2, double** %7, align 8
- store %13* %3, %13** %8, align 8
- %16 = load %2*, %2** %5, align 8
- %17 = load double, double* getelementptr inbounds (%0, %0* @d, i32 0, i32 0), align 8
- %18 = fdiv double 1.000000e+00, %17
- store double %18, double* %15, align 8
- %19 = load double, double* %15, align 8
- %20 = fcmp oge double %19, 0.000000e+00
- br i1 %20, label %21, label %36
-
-; <label>:21: ; preds = %4
- %22 = getelementptr inbounds %2, %2* %16, i32 0, i32 1
- %23 = getelementptr inbounds %1, %1* %22, i32 0, i32 0
- %24 = load double, double* %23, align 8
- %25 = load double, double* getelementptr inbounds (%1, %1* @p, i32 0, i32 0), align 8
- %26 = fsub double %24, %25
- %27 = load double, double* %15, align 8
- %28 = fmul double %26, %27
- store double %28, double* %9, align 8
- %29 = getelementptr inbounds %2, %2* %16, i32 0, i32 2
- %30 = getelementptr inbounds %1, %1* %29, i32 0, i32 0
- %31 = load double, double* %30, align 8
- %32 = load double, double* getelementptr inbounds (%1, %1* @p, i32 0, i32 0), align 8
- %33 = fsub double %31, %32
- %34 = load double, double* %15, align 8
- %35 = fmul double %33, %34
- store double %35, double* %12, align 8
- br label %51
-
-; <label>:36: ; preds = %4
- %37 = getelementptr inbounds %2, %2* %16, i32 0, i32 2
- %38 = getelementptr inbounds %1, %1* %37, i32 0, i32 0
- %39 = load double, double* %38, align 8
- %40 = load double, double* getelementptr inbounds (%1, %1* @p, i32 0, i32 0), align 8
- %41 = fsub double %39, %40
- %42 = load double, double* %15, align 8
- %43 = fmul double %41, %42
- store double %43, double* %9, align 8
- %44 = getelementptr inbounds %2, %2* %16, i32 0, i32 1
- %45 = getelementptr inbounds %1, %1* %44, i32 0, i32 0
- %46 = load double, double* %45, align 8
- %47 = load double, double* getelementptr inbounds (%1, %1* @p, i32 0, i32 0), align 8
- %48 = fsub double %46, %47
- %49 = load double, double* %15, align 8
- %50 = fmul double %48, %49
- store double %50, double* %12, align 8
- br label %51
-
-; <label>:51: ; preds = %36, %21
- %52 = load double, double* %12, align 8
- %53 = load double, double* %9, align 8
- %54 = fcmp olt double %52, %53
- ret i1 %54
-}
Removed: llvm/trunk/test/Transforms/GVN/hoist.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/hoist.ll?rev=278403&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GVN/hoist.ll (original)
+++ llvm/trunk/test/Transforms/GVN/hoist.ll (removed)
@@ -1,713 +0,0 @@
-; RUN: opt -gvn-hoist -S < %s | FileCheck %s
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
-
- at GlobalVar = internal global float 1.000000e+00
-
-; Check that all scalar expressions are hoisted.
-;
-; CHECK-LABEL: @scalarsHoisting
-; CHECK: fsub
-; CHECK: fsub
-; CHECK: fmul
-; CHECK: fmul
-; CHECK-NOT: fmul
-; CHECK-NOT: fsub
-define float @scalarsHoisting(float %d, float %min, float %max, float %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- %cmp = fcmp oge float %div, 0.000000e+00
- br i1 %cmp, label %if.then, label %if.else
-
-if.then: ; preds = %entry
- %sub = fsub float %min, %a
- %mul = fmul float %sub, %div
- %sub1 = fsub float %max, %a
- %mul2 = fmul float %sub1, %div
- br label %if.end
-
-if.else: ; preds = %entry
- %sub3 = fsub float %max, %a
- %mul4 = fmul float %sub3, %div
- %sub5 = fsub float %min, %a
- %mul6 = fmul float %sub5, %div
- br label %if.end
-
-if.end: ; preds = %if.else, %if.then
- %tmax.0 = phi float [ %mul2, %if.then ], [ %mul6, %if.else ]
- %tmin.0 = phi float [ %mul, %if.then ], [ %mul4, %if.else ]
- %add = fadd float %tmax.0, %tmin.0
- ret float %add
-}
-
-; Check that all loads and scalars depending on the loads are hoisted.
-; Check that getelementptr computation gets hoisted before the load.
-;
-; CHECK-LABEL: @readsAndScalarsHoisting
-; CHECK: load
-; CHECK: load
-; CHECK: load
-; CHECK: fsub
-; CHECK: fsub
-; CHECK: fmul
-; CHECK: fmul
-; CHECK-NOT: load
-; CHECK-NOT: fmul
-; CHECK-NOT: fsub
-define float @readsAndScalarsHoisting(float %d, float* %min, float* %max, float* %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- %cmp = fcmp oge float %div, 0.000000e+00
- br i1 %cmp, label %if.then, label %if.else
-
-if.then: ; preds = %entry
- %A = getelementptr float, float* %min, i32 1
- %0 = load float, float* %A, align 4
- %1 = load float, float* %a, align 4
- %sub = fsub float %0, %1
- %mul = fmul float %sub, %div
- %2 = load float, float* %max, align 4
- %sub1 = fsub float %2, %1
- %mul2 = fmul float %sub1, %div
- br label %if.end
-
-if.else: ; preds = %entry
- %3 = load float, float* %max, align 4
- %4 = load float, float* %a, align 4
- %sub3 = fsub float %3, %4
- %mul4 = fmul float %sub3, %div
- %B = getelementptr float, float* %min, i32 1
- %5 = load float, float* %B, align 4
- %sub5 = fsub float %5, %4
- %mul6 = fmul float %sub5, %div
- br label %if.end
-
-if.end: ; preds = %if.else, %if.then
- %tmax.0 = phi float [ %mul2, %if.then ], [ %mul6, %if.else ]
- %tmin.0 = phi float [ %mul, %if.then ], [ %mul4, %if.else ]
- %add = fadd float %tmax.0, %tmin.0
- ret float %add
-}
-
-; Check that we do not hoist loads after a store: the first two loads will be
-; hoisted, and then the third load will not be hoisted.
-;
-; CHECK-LABEL: @readsAndWrites
-; CHECK: load
-; CHECK: load
-; CHECK: fsub
-; CHECK: fmul
-; CHECK: store
-; CHECK: load
-; CHECK: fsub
-; CHECK: fmul
-; CHECK: load
-; CHECK: fsub
-; CHECK: fmul
-; CHECK-NOT: load
-; CHECK-NOT: fmul
-; CHECK-NOT: fsub
-define float @readsAndWrites(float %d, float* %min, float* %max, float* %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- %cmp = fcmp oge float %div, 0.000000e+00
- br i1 %cmp, label %if.then, label %if.else
-
-if.then: ; preds = %entry
- %0 = load float, float* %min, align 4
- %1 = load float, float* %a, align 4
- store float %0, float* @GlobalVar
- %sub = fsub float %0, %1
- %mul = fmul float %sub, %div
- %2 = load float, float* %max, align 4
- %sub1 = fsub float %2, %1
- %mul2 = fmul float %sub1, %div
- br label %if.end
-
-if.else: ; preds = %entry
- %3 = load float, float* %max, align 4
- %4 = load float, float* %a, align 4
- %sub3 = fsub float %3, %4
- %mul4 = fmul float %sub3, %div
- %5 = load float, float* %min, align 4
- %sub5 = fsub float %5, %4
- %mul6 = fmul float %sub5, %div
- br label %if.end
-
-if.end: ; preds = %if.else, %if.then
- %tmax.0 = phi float [ %mul2, %if.then ], [ %mul6, %if.else ]
- %tmin.0 = phi float [ %mul, %if.then ], [ %mul4, %if.else ]
- %add = fadd float %tmax.0, %tmin.0
- ret float %add
-}
-
-; Check that we do hoist loads when the store is above the insertion point.
-;
-; CHECK-LABEL: @readsAndWriteAboveInsertPt
-; CHECK: load
-; CHECK: load
-; CHECK: load
-; CHECK: fsub
-; CHECK: fsub
-; CHECK: fmul
-; CHECK: fmul
-; CHECK-NOT: load
-; CHECK-NOT: fmul
-; CHECK-NOT: fsub
-define float @readsAndWriteAboveInsertPt(float %d, float* %min, float* %max, float* %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- store float 0.000000e+00, float* @GlobalVar
- %cmp = fcmp oge float %div, 0.000000e+00
- br i1 %cmp, label %if.then, label %if.else
-
-if.then: ; preds = %entry
- %0 = load float, float* %min, align 4
- %1 = load float, float* %a, align 4
- %sub = fsub float %0, %1
- %mul = fmul float %sub, %div
- %2 = load float, float* %max, align 4
- %sub1 = fsub float %2, %1
- %mul2 = fmul float %sub1, %div
- br label %if.end
-
-if.else: ; preds = %entry
- %3 = load float, float* %max, align 4
- %4 = load float, float* %a, align 4
- %sub3 = fsub float %3, %4
- %mul4 = fmul float %sub3, %div
- %5 = load float, float* %min, align 4
- %sub5 = fsub float %5, %4
- %mul6 = fmul float %sub5, %div
- br label %if.end
-
-if.end: ; preds = %if.else, %if.then
- %tmax.0 = phi float [ %mul2, %if.then ], [ %mul6, %if.else ]
- %tmin.0 = phi float [ %mul, %if.then ], [ %mul4, %if.else ]
- %add = fadd float %tmax.0, %tmin.0
- ret float %add
-}
-
-; Check that dependent expressions are hoisted.
-; CHECK-LABEL: @dependentScalarsHoisting
-; CHECK: fsub
-; CHECK: fadd
-; CHECK: fdiv
-; CHECK: fmul
-; CHECK-NOT: fsub
-; CHECK-NOT: fadd
-; CHECK-NOT: fdiv
-; CHECK-NOT: fmul
-define float @dependentScalarsHoisting(float %a, float %b, i1 %c) {
-entry:
- br i1 %c, label %if.then, label %if.else
-
-if.then:
- %d = fsub float %b, %a
- %e = fadd float %d, %a
- %f = fdiv float %e, %a
- %g = fmul float %f, %a
- br label %if.end
-
-if.else:
- %h = fsub float %b, %a
- %i = fadd float %h, %a
- %j = fdiv float %i, %a
- %k = fmul float %j, %a
- br label %if.end
-
-if.end:
- %r = phi float [ %g, %if.then ], [ %k, %if.else ]
- ret float %r
-}
-
-; Check that all independent expressions are hoisted.
-; CHECK-LABEL: @independentScalarsHoisting
-; CHECK: fsub
-; CHECK: fdiv
-; CHECK: fmul
-; CHECK: fadd
-; CHECK-NOT: fsub
-; CHECK-NOT: fdiv
-; CHECK-NOT: fmul
-define float @independentScalarsHoisting(float %a, float %b, i1 %c) {
-entry:
- br i1 %c, label %if.then, label %if.else
-
-if.then:
- %d = fadd float %b, %a
- %e = fsub float %b, %a
- %f = fdiv float %b, %a
- %g = fmul float %b, %a
- br label %if.end
-
-if.else:
- %i = fadd float %b, %a
- %h = fsub float %b, %a
- %j = fdiv float %b, %a
- %k = fmul float %b, %a
- br label %if.end
-
-if.end:
- %p = phi float [ %d, %if.then ], [ %i, %if.else ]
- %q = phi float [ %e, %if.then ], [ %h, %if.else ]
- %r = phi float [ %f, %if.then ], [ %j, %if.else ]
- %s = phi float [ %g, %if.then ], [ %k, %if.else ]
- %t = fadd float %p, %q
- %u = fadd float %r, %s
- %v = fadd float %t, %u
- ret float %v
-}
-
-; Check that we hoist load and scalar expressions in triangles.
-; CHECK-LABEL: @triangleHoisting
-; CHECK: load
-; CHECK: load
-; CHECK: load
-; CHECK: fsub
-; CHECK: fsub
-; CHECK: fmul
-; CHECK: fmul
-; CHECK-NOT: load
-; CHECK-NOT: fmul
-; CHECK-NOT: fsub
-define float @triangleHoisting(float %d, float* %min, float* %max, float* %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- %cmp = fcmp oge float %div, 0.000000e+00
- br i1 %cmp, label %if.then, label %if.end
-
-if.then: ; preds = %entry
- %0 = load float, float* %min, align 4
- %1 = load float, float* %a, align 4
- %sub = fsub float %0, %1
- %mul = fmul float %sub, %div
- %2 = load float, float* %max, align 4
- %sub1 = fsub float %2, %1
- %mul2 = fmul float %sub1, %div
- br label %if.end
-
-if.end: ; preds = %entry
- %p1 = phi float [ %mul2, %if.then ], [ 0.000000e+00, %entry ]
- %p2 = phi float [ %mul, %if.then ], [ 0.000000e+00, %entry ]
- %3 = load float, float* %max, align 4
- %4 = load float, float* %a, align 4
- %sub3 = fsub float %3, %4
- %mul4 = fmul float %sub3, %div
- %5 = load float, float* %min, align 4
- %sub5 = fsub float %5, %4
- %mul6 = fmul float %sub5, %div
-
- %x = fadd float %p1, %mul6
- %y = fadd float %p2, %mul4
- %z = fadd float %x, %y
- ret float %z
-}
-
-; Check that we hoist load and scalar expressions in dominator.
-; CHECK-LABEL: @dominatorHoisting
-; CHECK: load
-; CHECK: load
-; CHECK: fsub
-; CHECK: fmul
-; CHECK: load
-; CHECK: fsub
-; CHECK: fmul
-; CHECK-NOT: load
-; CHECK-NOT: fmul
-; CHECK-NOT: fsub
-define float @dominatorHoisting(float %d, float* %min, float* %max, float* %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- %0 = load float, float* %min, align 4
- %1 = load float, float* %a, align 4
- %sub = fsub float %0, %1
- %mul = fmul float %sub, %div
- %2 = load float, float* %max, align 4
- %sub1 = fsub float %2, %1
- %mul2 = fmul float %sub1, %div
- %cmp = fcmp oge float %div, 0.000000e+00
- br i1 %cmp, label %if.then, label %if.end
-
-if.then: ; preds = %entry
- %3 = load float, float* %max, align 4
- %4 = load float, float* %a, align 4
- %sub3 = fsub float %3, %4
- %mul4 = fmul float %sub3, %div
- %5 = load float, float* %min, align 4
- %sub5 = fsub float %5, %4
- %mul6 = fmul float %sub5, %div
- br label %if.end
-
-if.end: ; preds = %entry
- %p1 = phi float [ %mul4, %if.then ], [ 0.000000e+00, %entry ]
- %p2 = phi float [ %mul6, %if.then ], [ 0.000000e+00, %entry ]
-
- %x = fadd float %p1, %mul2
- %y = fadd float %p2, %mul
- %z = fadd float %x, %y
- ret float %z
-}
-
-; Check that we hoist load and scalar expressions in dominator.
-; CHECK-LABEL: @domHoisting
-; CHECK: load
-; CHECK: load
-; CHECK: fsub
-; CHECK: fmul
-; CHECK: load
-; CHECK: fsub
-; CHECK: fmul
-; CHECK-NOT: load
-; CHECK-NOT: fmul
-; CHECK-NOT: fsub
-define float @domHoisting(float %d, float* %min, float* %max, float* %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- %0 = load float, float* %min, align 4
- %1 = load float, float* %a, align 4
- %sub = fsub float %0, %1
- %mul = fmul float %sub, %div
- %2 = load float, float* %max, align 4
- %sub1 = fsub float %2, %1
- %mul2 = fmul float %sub1, %div
- %cmp = fcmp oge float %div, 0.000000e+00
- br i1 %cmp, label %if.then, label %if.else
-
-if.then:
- %3 = load float, float* %max, align 4
- %4 = load float, float* %a, align 4
- %sub3 = fsub float %3, %4
- %mul4 = fmul float %sub3, %div
- %5 = load float, float* %min, align 4
- %sub5 = fsub float %5, %4
- %mul6 = fmul float %sub5, %div
- br label %if.end
-
-if.else:
- %6 = load float, float* %max, align 4
- %7 = load float, float* %a, align 4
- %sub9 = fsub float %6, %7
- %mul10 = fmul float %sub9, %div
- %8 = load float, float* %min, align 4
- %sub12 = fsub float %8, %7
- %mul13 = fmul float %sub12, %div
- br label %if.end
-
-if.end:
- %p1 = phi float [ %mul4, %if.then ], [ %mul10, %if.else ]
- %p2 = phi float [ %mul6, %if.then ], [ %mul13, %if.else ]
-
- %x = fadd float %p1, %mul2
- %y = fadd float %p2, %mul
- %z = fadd float %x, %y
- ret float %z
-}
-
-; Check that we do not hoist loads past stores within a same basic block.
-; CHECK-LABEL: @noHoistInSingleBBWithStore
-; CHECK: load
-; CHECK: store
-; CHECK: load
-; CHECK: store
-define i32 @noHoistInSingleBBWithStore() {
-entry:
- %D = alloca i32, align 4
- %0 = bitcast i32* %D to i8*
- %bf = load i8, i8* %0, align 4
- %bf.clear = and i8 %bf, -3
- store i8 %bf.clear, i8* %0, align 4
- %bf1 = load i8, i8* %0, align 4
- %bf.clear1 = and i8 %bf1, 1
- store i8 %bf.clear1, i8* %0, align 4
- ret i32 0
-}
-
-; Check that we do not hoist loads past calls within a same basic block.
-; CHECK-LABEL: @noHoistInSingleBBWithCall
-; CHECK: load
-; CHECK: call
-; CHECK: load
-declare void @foo()
-define i32 @noHoistInSingleBBWithCall() {
-entry:
- %D = alloca i32, align 4
- %0 = bitcast i32* %D to i8*
- %bf = load i8, i8* %0, align 4
- %bf.clear = and i8 %bf, -3
- call void @foo()
- %bf1 = load i8, i8* %0, align 4
- %bf.clear1 = and i8 %bf1, 1
- ret i32 0
-}
-
-; Check that we do not hoist loads past stores in any branch of a diamond.
-; CHECK-LABEL: @noHoistInDiamondWithOneStore1
-; CHECK: fdiv
-; CHECK: fcmp
-; CHECK: br
-define float @noHoistInDiamondWithOneStore1(float %d, float* %min, float* %max, float* %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- %cmp = fcmp oge float %div, 0.000000e+00
- br i1 %cmp, label %if.then, label %if.else
-
-if.then: ; preds = %entry
- store float 0.000000e+00, float* @GlobalVar
- %0 = load float, float* %min, align 4
- %1 = load float, float* %a, align 4
- %sub = fsub float %0, %1
- %mul = fmul float %sub, %div
- %2 = load float, float* %max, align 4
- %sub1 = fsub float %2, %1
- %mul2 = fmul float %sub1, %div
- br label %if.end
-
-if.else: ; preds = %entry
- ; There are no side effects on the if.else branch.
- %3 = load float, float* %max, align 4
- %4 = load float, float* %a, align 4
- %sub3 = fsub float %3, %4
- %mul4 = fmul float %sub3, %div
- %5 = load float, float* %min, align 4
- %sub5 = fsub float %5, %4
- %mul6 = fmul float %sub5, %div
- br label %if.end
-
-if.end: ; preds = %if.else, %if.then
- %tmax.0 = phi float [ %mul2, %if.then ], [ %mul6, %if.else ]
- %tmin.0 = phi float [ %mul, %if.then ], [ %mul4, %if.else ]
-
- %6 = load float, float* %max, align 4
- %7 = load float, float* %a, align 4
- %sub6 = fsub float %6, %7
- %mul7 = fmul float %sub6, %div
- %8 = load float, float* %min, align 4
- %sub8 = fsub float %8, %7
- %mul9 = fmul float %sub8, %div
-
- %add = fadd float %tmax.0, %tmin.0
- ret float %add
-}
-
-; Check that we do not hoist loads past stores from half diamond.
-; CHECK-LABEL: @noHoistInHalfDiamondPastStore
-; CHECK: load
-; CHECK-NEXT: load
-; CHECK-NEXT: store
-; CHECK-NEXT: br
-; CHECK: load
-; CHECK: load
-; CHECK: load
-; CHECK: br
-define float @noHoistInHalfDiamondPastStore(float %d, float* %min, float* %max, float* %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- %cmp = fcmp oge float %div, 0.000000e+00
- %0 = load float, float* %min, align 4
- %1 = load float, float* %a, align 4
-
- ; Loads should not be hoisted above this store.
- store float 0.000000e+00, float* @GlobalVar
-
- br i1 %cmp, label %if.then, label %if.end
-
-if.then:
- ; There are no side effects on the if.then branch.
- %2 = load float, float* %max, align 4
- %3 = load float, float* %a, align 4
- %sub3 = fsub float %2, %3
- %mul4 = fmul float %sub3, %div
- %4 = load float, float* %min, align 4
- %sub5 = fsub float %4, %3
- %mul6 = fmul float %sub5, %div
- br label %if.end
-
-if.end:
- %tmax.0 = phi float [ %mul4, %if.then ], [ %0, %entry ]
- %tmin.0 = phi float [ %mul6, %if.then ], [ %1, %entry ]
-
- %add = fadd float %tmax.0, %tmin.0
- ret float %add
-}
-
-; Check that we do not hoist loads past a store in any branch of a diamond.
-; CHECK-LABEL: @noHoistInDiamondWithOneStore2
-; CHECK: fdiv
-; CHECK: fcmp
-; CHECK: br
-define float @noHoistInDiamondWithOneStore2(float %d, float* %min, float* %max, float* %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- %cmp = fcmp oge float %div, 0.000000e+00
- br i1 %cmp, label %if.then, label %if.else
-
-if.then: ; preds = %entry
- ; There are no side effects on the if.then branch.
- %0 = load float, float* %min, align 4
- %1 = load float, float* %a, align 4
- %sub = fsub float %0, %1
- %mul = fmul float %sub, %div
- %2 = load float, float* %max, align 4
- %sub1 = fsub float %2, %1
- %mul2 = fmul float %sub1, %div
- br label %if.end
-
-if.else: ; preds = %entry
- store float 0.000000e+00, float* @GlobalVar
- %3 = load float, float* %max, align 4
- %4 = load float, float* %a, align 4
- %sub3 = fsub float %3, %4
- %mul4 = fmul float %sub3, %div
- %5 = load float, float* %min, align 4
- %sub5 = fsub float %5, %4
- %mul6 = fmul float %sub5, %div
- br label %if.end
-
-if.end: ; preds = %if.else, %if.then
- %tmax.0 = phi float [ %mul2, %if.then ], [ %mul6, %if.else ]
- %tmin.0 = phi float [ %mul, %if.then ], [ %mul4, %if.else ]
-
- %6 = load float, float* %max, align 4
- %7 = load float, float* %a, align 4
- %sub6 = fsub float %6, %7
- %mul7 = fmul float %sub6, %div
- %8 = load float, float* %min, align 4
- %sub8 = fsub float %8, %7
- %mul9 = fmul float %sub8, %div
-
- %add = fadd float %tmax.0, %tmin.0
- ret float %add
-}
-
-; Check that we do not hoist loads outside a loop containing stores.
-; CHECK-LABEL: @noHoistInLoopsWithStores
-; CHECK: fdiv
-; CHECK: fcmp
-; CHECK: br
-define float @noHoistInLoopsWithStores(float %d, float* %min, float* %max, float* %a) {
-entry:
- %div = fdiv float 1.000000e+00, %d
- %cmp = fcmp oge float %div, 0.000000e+00
- br i1 %cmp, label %do.body, label %if.else
-
-do.body:
- %0 = load float, float* %min, align 4
- %1 = load float, float* %a, align 4
-
- ; It is unsafe to hoist the loads outside the loop because of the store.
- store float 0.000000e+00, float* @GlobalVar
-
- %sub = fsub float %0, %1
- %mul = fmul float %sub, %div
- %2 = load float, float* %max, align 4
- %sub1 = fsub float %2, %1
- %mul2 = fmul float %sub1, %div
- br label %while.cond
-
-while.cond:
- %cmp1 = fcmp oge float %mul2, 0.000000e+00
- br i1 %cmp1, label %if.end, label %do.body
-
-if.else:
- %3 = load float, float* %max, align 4
- %4 = load float, float* %a, align 4
- %sub3 = fsub float %3, %4
- %mul4 = fmul float %sub3, %div
- %5 = load float, float* %min, align 4
- %sub5 = fsub float %5, %4
- %mul6 = fmul float %sub5, %div
- br label %if.end
-
-if.end:
- %tmax.0 = phi float [ %mul2, %while.cond ], [ %mul6, %if.else ]
- %tmin.0 = phi float [ %mul, %while.cond ], [ %mul4, %if.else ]
-
- %add = fadd float %tmax.0, %tmin.0
- ret float %add
-}
-
-; Check that we hoist stores: all the instructions from the then branch
-; should be hoisted.
-; CHECK-LABEL: @hoistStores
-; CHECK: zext
-; CHECK-NEXT: trunc
-; CHECK-NEXT: getelementptr
-; CHECK-NEXT: load
-; CHECK-NEXT: getelementptr
-; CHECK-NEXT: getelementptr
-; CHECK-NEXT: store
-; CHECK-NEXT: load
-; CHECK-NEXT: load
-; CHECK-NEXT: zext
-; CHECK-NEXT: add
-; CHECK-NEXT: store
-; CHECK-NEXT: br
-; CHECK: if.then
-; CHECK: br
-
-%struct.foo = type { i16* }
-
-define void @hoistStores(%struct.foo* %s, i32* %coord, i1 zeroext %delta) {
-entry:
- %frombool = zext i1 %delta to i8
- %tobool = trunc i8 %frombool to i1
- br i1 %tobool, label %if.then, label %if.else
-
-if.then: ; preds = %entry
- %p = getelementptr inbounds %struct.foo, %struct.foo* %s, i32 0, i32 0
- %0 = load i16*, i16** %p, align 8
- %incdec.ptr = getelementptr inbounds i16, i16* %0, i32 1
- store i16* %incdec.ptr, i16** %p, align 8
- %1 = load i16, i16* %0, align 2
- %conv = zext i16 %1 to i32
- %2 = load i32, i32* %coord, align 4
- %add = add i32 %2, %conv
- store i32 %add, i32* %coord, align 4
- br label %if.end
-
-if.else: ; preds = %entry
- %p1 = getelementptr inbounds %struct.foo, %struct.foo* %s, i32 0, i32 0
- %3 = load i16*, i16** %p1, align 8
- %incdec.ptr2 = getelementptr inbounds i16, i16* %3, i32 1
- store i16* %incdec.ptr2, i16** %p1, align 8
- %4 = load i16, i16* %3, align 2
- %conv3 = zext i16 %4 to i32
- %5 = load i32, i32* %coord, align 4
- %add4 = add i32 %5, %conv3
- store i32 %add4, i32* %coord, align 4
- %6 = load i16*, i16** %p1, align 8
- %incdec.ptr6 = getelementptr inbounds i16, i16* %6, i32 1
- store i16* %incdec.ptr6, i16** %p1, align 8
- %7 = load i16, i16* %6, align 2
- %conv7 = zext i16 %7 to i32
- %shl = shl i32 %conv7, 8
- %8 = load i32, i32* %coord, align 4
- %add8 = add i32 %8, %shl
- store i32 %add8, i32* %coord, align 4
- br label %if.end
-
-if.end: ; preds = %if.else, %if.then
- ret void
-}
-
-define i32 @mergeAlignments(i1 %b, i32* %y) {
-entry:
- br i1 %b, label %if.then, label %if.end
-
-if.then: ; preds = %entry
- %l1 = load i32, i32* %y, align 4
- br label %return
-
-if.end: ; preds = %entry
- %l2 = load i32, i32* %y, align 1
- br label %return
-
-return: ; preds = %if.end, %if.then
- %retval.0 = phi i32 [ %l1, %if.then ], [ %l2, %if.end ]
- ret i32 %retval.0
-}
-; CHECK-LABEL: define i32 @mergeAlignments(
-; CHECK: %[[load:.*]] = load i32, i32* %y, align 1
-; CHECK: %[[phi:.*]] = phi i32 [ %[[load]], %{{.*}} ], [ %[[load]], %{{.*}} ]
-; CHECK: i32 %[[phi]]
Copied: llvm/trunk/test/Transforms/GVNHoist/hoist-call.ll (from r278401, llvm/trunk/test/Transforms/GVN/hoist-call.ll)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVNHoist/hoist-call.ll?p2=llvm/trunk/test/Transforms/GVNHoist/hoist-call.ll&p1=llvm/trunk/test/Transforms/GVN/hoist-call.ll&r1=278401&r2=278404&rev=278404&view=diff
==============================================================================
(empty)
Copied: llvm/trunk/test/Transforms/GVNHoist/hoist-convergent.ll (from r278401, llvm/trunk/test/Transforms/GVN/hoist-convergent.ll)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVNHoist/hoist-convergent.ll?p2=llvm/trunk/test/Transforms/GVNHoist/hoist-convergent.ll&p1=llvm/trunk/test/Transforms/GVN/hoist-convergent.ll&r1=278401&r2=278404&rev=278404&view=diff
==============================================================================
(empty)
Copied: llvm/trunk/test/Transforms/GVNHoist/hoist-md.ll (from r278401, llvm/trunk/test/Transforms/GVN/hoist-md.ll)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVNHoist/hoist-md.ll?p2=llvm/trunk/test/Transforms/GVNHoist/hoist-md.ll&p1=llvm/trunk/test/Transforms/GVN/hoist-md.ll&r1=278401&r2=278404&rev=278404&view=diff
==============================================================================
(empty)
Copied: llvm/trunk/test/Transforms/GVNHoist/hoist-mssa.ll (from r278401, llvm/trunk/test/Transforms/GVN/hoist-mssa.ll)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVNHoist/hoist-mssa.ll?p2=llvm/trunk/test/Transforms/GVNHoist/hoist-mssa.ll&p1=llvm/trunk/test/Transforms/GVN/hoist-mssa.ll&r1=278401&r2=278404&rev=278404&view=diff
==============================================================================
(empty)
Copied: llvm/trunk/test/Transforms/GVNHoist/hoist-pr20242.ll (from r278401, llvm/trunk/test/Transforms/GVN/hoist-pr20242.ll)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVNHoist/hoist-pr20242.ll?p2=llvm/trunk/test/Transforms/GVNHoist/hoist-pr20242.ll&p1=llvm/trunk/test/Transforms/GVN/hoist-pr20242.ll&r1=278401&r2=278404&rev=278404&view=diff
==============================================================================
(empty)
Copied: llvm/trunk/test/Transforms/GVNHoist/hoist-pr22005.ll (from r278401, llvm/trunk/test/Transforms/GVN/hoist-pr22005.ll)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVNHoist/hoist-pr22005.ll?p2=llvm/trunk/test/Transforms/GVNHoist/hoist-pr22005.ll&p1=llvm/trunk/test/Transforms/GVN/hoist-pr22005.ll&r1=278401&r2=278404&rev=278404&view=diff
==============================================================================
(empty)
Copied: llvm/trunk/test/Transforms/GVNHoist/hoist-pr28606.ll (from r278401, llvm/trunk/test/Transforms/GVN/hoist-pr28606.ll)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVNHoist/hoist-pr28606.ll?p2=llvm/trunk/test/Transforms/GVNHoist/hoist-pr28606.ll&p1=llvm/trunk/test/Transforms/GVN/hoist-pr28606.ll&r1=278401&r2=278404&rev=278404&view=diff
==============================================================================
(empty)
Copied: llvm/trunk/test/Transforms/GVNHoist/hoist-pr28933.ll (from r278401, llvm/trunk/test/Transforms/GVN/hoist-pr28933.ll)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVNHoist/hoist-pr28933.ll?p2=llvm/trunk/test/Transforms/GVNHoist/hoist-pr28933.ll&p1=llvm/trunk/test/Transforms/GVN/hoist-pr28933.ll&r1=278401&r2=278404&rev=278404&view=diff
==============================================================================
(empty)
Copied: llvm/trunk/test/Transforms/GVNHoist/hoist-recursive-geps.ll (from r278401, llvm/trunk/test/Transforms/GVN/hoist-recursive-geps.ll)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVNHoist/hoist-recursive-geps.ll?p2=llvm/trunk/test/Transforms/GVNHoist/hoist-recursive-geps.ll&p1=llvm/trunk/test/Transforms/GVN/hoist-recursive-geps.ll&r1=278401&r2=278404&rev=278404&view=diff
==============================================================================
(empty)
Copied: llvm/trunk/test/Transforms/GVNHoist/hoist.ll (from r278401, llvm/trunk/test/Transforms/GVN/hoist.ll)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVNHoist/hoist.ll?p2=llvm/trunk/test/Transforms/GVNHoist/hoist.ll&p1=llvm/trunk/test/Transforms/GVN/hoist.ll&r1=278401&r2=278404&rev=278404&view=diff
==============================================================================
(empty)
More information about the llvm-commits
mailing list