diff options
author | Eric Christopher <echristo@gmail.com> | 2019-04-17 02:12:23 +0000 |
---|---|---|
committer | Eric Christopher <echristo@gmail.com> | 2019-04-17 02:12:23 +0000 |
commit | a86343512845c9c1fdbac865fea88aa5fce7142a (patch) | |
tree | 666fc6353de19ad8b00e56b67edd33f24104e4a7 /llvm/test/Transforms/DeadArgElim/aggregates.ll | |
parent | 7f8ca6e3679b3af951cb7a4b1377edfaa3244b93 (diff) | |
download | bcm5719-llvm-a86343512845c9c1fdbac865fea88aa5fce7142a.tar.gz bcm5719-llvm-a86343512845c9c1fdbac865fea88aa5fce7142a.zip |
Temporarily Revert "Add basic loop fusion pass."
As it's causing some bot failures (and per request from kbarton).
This reverts commit r358543/ab70da07286e618016e78247e4a24fcb84077fda.
llvm-svn: 358546
Diffstat (limited to 'llvm/test/Transforms/DeadArgElim/aggregates.ll')
-rw-r--r-- | llvm/test/Transforms/DeadArgElim/aggregates.ll | 186 |
1 files changed, 0 insertions, 186 deletions
diff --git a/llvm/test/Transforms/DeadArgElim/aggregates.ll b/llvm/test/Transforms/DeadArgElim/aggregates.ll deleted file mode 100644 index 2eca76a4a4e..00000000000 --- a/llvm/test/Transforms/DeadArgElim/aggregates.ll +++ /dev/null @@ -1,186 +0,0 @@ -; RUN: opt -S -deadargelim %s | FileCheck %s - -; Case 0: the basic example: an entire aggregate use is returned, but it's -; actually only used in ways we can eliminate. We gain benefit from analysing -; the "use" and applying its results to all sub-values. - -; CHECK-LABEL: define internal void @agguse_dead() - -define internal { i32, i32 } @agguse_dead() { - ret { i32, i32 } { i32 0, i32 1 } -} - -define internal { i32, i32 } @test_agguse_dead() { - %val = call { i32, i32 } @agguse_dead() - ret { i32, i32 } %val -} - - - -; Case 1: an opaque use of the aggregate exists (in this case dead). Otherwise -; only one value is used, so function can be simplified. - -; CHECK-LABEL: define internal i32 @rets_independent_if_agguse_dead() -; CHECK: [[RET:%.*]] = extractvalue { i32, i32 } { i32 0, i32 1 }, 1 -; CHECK: ret i32 [[RET]] - -define internal { i32, i32 } @rets_independent_if_agguse_dead() { - ret { i32, i32 } { i32 0, i32 1 } -} - -define internal { i32, i32 } @test_rets_independent_if_agguse_dead(i1 %tst) { - %val = call { i32, i32 } @rets_independent_if_agguse_dead() - br i1 %tst, label %use_1, label %use_aggregate - -use_1: - ; This use can be classified as applying only to ret 1. - %val0 = extractvalue { i32, i32 } %val, 1 - call void @callee(i32 %val0) - ret { i32, i32 } undef - -use_aggregate: - ; This use is assumed to apply to both 0 and 1. - ret { i32, i32 } %val -} - -; Case 2: an opaque use of the aggregate exists (in this case *live*). Other -; uses shouldn't matter. - -; CHECK-LABEL: define internal { i32, i32 } @rets_live_agguse() -; CHECK: ret { i32, i32 } { i32 0, i32 1 } - -define internal { i32, i32 } @rets_live_agguse() { - ret { i32, i32} { i32 0, i32 1 } -} - -define { i32, i32 } @test_rets_live_aggues(i1 %tst) { - %val = call { i32, i32 } @rets_live_agguse() - br i1 %tst, label %use_1, label %use_aggregate - -use_1: - ; This use can be classified as applying only to ret 1. - %val0 = extractvalue { i32, i32 } %val, 1 - call void @callee(i32 %val0) - ret { i32, i32 } undef - -use_aggregate: - ; This use is assumed to apply to both 0 and 1. - ret { i32, i32 } %val -} - -declare void @callee(i32) - -; Case 3: the insertvalue meant %in was live if ret-slot-1 was, but we were only -; tracking multiple ret-slots for struct types. So %in was eliminated -; incorrectly. - -; CHECK-LABEL: define internal [2 x i32] @array_rets_have_multiple_slots(i32 %in) - -define internal [2 x i32] @array_rets_have_multiple_slots(i32 %in) { - %ret = insertvalue [2 x i32] undef, i32 %in, 1 - ret [2 x i32] %ret -} - -define [2 x i32] @test_array_rets_have_multiple_slots() { - %res = call [2 x i32] @array_rets_have_multiple_slots(i32 42) - ret [2 x i32] %res -} - -; Case 4: we can remove some retvals from the array. It's nice to produce an -; array again having done so (rather than converting it to a struct). - -; CHECK-LABEL: define internal [2 x i32] @can_shrink_arrays() -; CHECK: [[VAL0:%.*]] = extractvalue [3 x i32] [i32 42, i32 43, i32 44], 0 -; CHECK: [[RESTMP:%.*]] = insertvalue [2 x i32] undef, i32 [[VAL0]], 0 -; CHECK: [[VAL2:%.*]] = extractvalue [3 x i32] [i32 42, i32 43, i32 44], 2 -; CHECK: [[RES:%.*]] = insertvalue [2 x i32] [[RESTMP]], i32 [[VAL2]], 1 -; CHECK: ret [2 x i32] [[RES]] - -; CHECK-LABEL: define void @test_can_shrink_arrays() - -define internal [3 x i32] @can_shrink_arrays() { - ret [3 x i32] [i32 42, i32 43, i32 44] -} - -define void @test_can_shrink_arrays() { - %res = call [3 x i32] @can_shrink_arrays() - - %res.0 = extractvalue [3 x i32] %res, 0 - call void @callee(i32 %res.0) - - %res.2 = extractvalue [3 x i32] %res, 2 - call void @callee(i32 %res.2) - - ret void -} - -; Case 5: %in gets passed directly to the return. It should mark be marked as -; used if *any* of the return values are, not just if value 0 is. - -; CHECK-LABEL: define internal i32 @ret_applies_to_all({ i32, i32 } %in) -; CHECK: [[RET:%.*]] = extractvalue { i32, i32 } %in, 1 -; CHECK: ret i32 [[RET]] - -define internal {i32, i32} @ret_applies_to_all({i32, i32} %in) { - ret {i32, i32} %in -} - -define i32 @test_ret_applies_to_all() { - %val = call {i32, i32} @ret_applies_to_all({i32, i32} {i32 42, i32 43}) - %ret = extractvalue {i32, i32} %val, 1 - ret i32 %ret -} - -; Case 6: When considering @mid, the return instruciton has sub-value 0 -; unconditionally live, but 1 only conditionally live. Since at that level we're -; applying the results to the whole of %res, this means %res is live and cannot -; be reduced. There is scope for further optimisation here (though not visible -; in this test-case). - -; CHECK-LABEL: define internal { i8*, i32 } @inner() - -define internal {i8*, i32} @mid() { - %res = call {i8*, i32} @inner() - %intval = extractvalue {i8*, i32} %res, 1 - %tst = icmp eq i32 %intval, 42 - br i1 %tst, label %true, label %true - -true: - ret {i8*, i32} %res -} - -define internal {i8*, i32} @inner() { - ret {i8*, i32} {i8* null, i32 42} -} - -define internal i8 @outer() { - %res = call {i8*, i32} @mid() - %resptr = extractvalue {i8*, i32} %res, 0 - - %val = load i8, i8* %resptr - ret i8 %val -} - -define internal { i32 } @agg_ret() { -entry: - unreachable -} - -; CHECK-LABEL: define void @PR24906 -; CHECK: %[[invoke:.*]] = invoke i32 @agg_ret() -; CHECK: %[[oldret:.*]] = insertvalue { i32 } undef, i32 %[[invoke]], 0 -; CHECK: phi { i32 } [ %[[oldret]], -define void @PR24906() personality i32 (i32)* undef { -entry: - %tmp2 = invoke { i32 } @agg_ret() - to label %bb3 unwind label %bb4 - -bb3: - %tmp3 = phi { i32 } [ %tmp2, %entry ] - unreachable - -bb4: - %tmp4 = landingpad { i8*, i32 } - cleanup - unreachable -} |