diff options
| -rw-r--r-- | llvm/lib/Transforms/IPO/Attributor.cpp | 10 | ||||
| -rw-r--r-- | llvm/test/Transforms/FunctionAttrs/liveness.ll | 43 |
2 files changed, 47 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp index 9fdfed8dbed..3d6a2c6f94f 100644 --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -2576,23 +2576,23 @@ static bool identifyAliveSuccessors(Attributor &A, const SwitchInst &SI, AbstractAttribute &AA, SmallVectorImpl<const Instruction *> &AliveSuccessors) { - bool UsedAssumedInformation = false; - Optional<ConstantInt *> CI = getAssumedConstant(A, *SI.getCondition(), AA); + Optional<ConstantInt *> CI = getAssumedConstant(A, *SI.getCondition(), AA); if (!CI.hasValue()) { // No value yet, assume all edges are dead. } else if (CI.getValue()) { for (auto &CaseIt : SI.cases()) { if (CaseIt.getCaseValue() == CI.getValue()) { AliveSuccessors.push_back(&CaseIt.getCaseSuccessor()->front()); - UsedAssumedInformation = true; - break; + return true; } } + AliveSuccessors.push_back(&SI.getDefaultDest()->front()); + return true; } else { for (const BasicBlock *SuccBB : successors(SI.getParent())) AliveSuccessors.push_back(&SuccBB->front()); } - return UsedAssumedInformation; + return false; } ChangeStatus AAIsDeadFunction::updateImpl(Attributor &A) { diff --git a/llvm/test/Transforms/FunctionAttrs/liveness.ll b/llvm/test/Transforms/FunctionAttrs/liveness.ll index 85afb10ca08..2526d65bbf5 100644 --- a/llvm/test/Transforms/FunctionAttrs/liveness.ll +++ b/llvm/test/Transforms/FunctionAttrs/liveness.ll @@ -1,5 +1,6 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes ; RUN: opt -attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s +; UTC_ARGS: --turn off declare void @no_return_call() nofree noreturn nounwind readnone @@ -748,3 +749,43 @@ define void @useless_arg_ext_int_ext(i32* %a) { call void @useless_arg_ext_int(i32* %a) ret void } + +; UTC_ARGS: --turn on + +; FIXME: We should fold terminators. + +define internal i32 @switch_default(i64 %i) nounwind { +; CHECK-LABEL: define {{[^@]+}}@switch_default +; CHECK-SAME: (i64 [[I:%.*]]) +; CHECK-NEXT: entry: +; CHECK-NEXT: switch i64 0, label [[SW_DEFAULT:%.*]] [ +; CHECK-NEXT: i64 3, label [[RETURN:%.*]] +; CHECK-NEXT: i64 10, label [[RETURN]] +; CHECK-NEXT: ] +; CHECK: sw.default: +; CHECK-NEXT: ret i32 123 +; CHECK: return: +; CHECK-NEXT: unreachable +; +entry: + switch i64 %i, label %sw.default [ + i64 3, label %return + i64 10, label %return + ] + +sw.default: + ret i32 123 + +return: + ret i32 0 +} + +define i32 @switch_default_caller() { +; CHECK-LABEL: define {{[^@]+}}@switch_default_caller() +; CHECK-NEXT: [[CALL2:%.*]] = tail call i32 @switch_default(i64 0) +; CHECK-NEXT: ret i32 123 +; + %call2 = tail call i32 @switch_default(i64 0) + ret i32 %call2 +} +; UTC_ARGS: --turn off |

