[llvm] r253370 - [EH] Keep filter clauses for types that have been caught.
Andrew Kaylor via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 17 12:13:05 PST 2015
Author: akaylor
Date: Tue Nov 17 14:13:04 2015
New Revision: 253370
URL: http://llvm.org/viewvc/llvm-project?rev=253370&view=rev
Log:
[EH] Keep filter clauses for types that have been caught.
The instruction combiner previously removed types from filter clauses in Landing Pad instructions if the type had previously been seen in a catch clause. This is incorrect and prevents unexpected exception handlers from rethrowing the caught type.
Differential Revision: http://reviews.llvm.org/D14669
Modified:
llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp
llvm/trunk/test/Transforms/InstCombine/LandingPadClauses.ll
Modified: llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp?rev=253370&r1=253369&r2=253370&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp Tue Nov 17 14:13:04 2015
@@ -2486,10 +2486,24 @@ Instruction *InstCombiner::visitLandingP
SawCatchAll = true;
break;
}
- if (AlreadyCaught.count(TypeInfo))
- // Already caught by an earlier clause, so having it in the filter
- // is pointless.
- continue;
+
+ // Even if we've seen a type in a catch clause, we don't want to
+ // remove it from the filter. An unexpected type handler may be
+ // set up for a call site which throws an exception of the same
+ // type caught. In order for the exception thrown by the unexpected
+ // handler to propogate correctly, the filter must be correctly
+ // described for the call site.
+ //
+ // Example:
+ //
+ // void unexpected() { throw 1;}
+ // void foo() throw (int) {
+ // std::set_unexpected(unexpected);
+ // try {
+ // throw 2.0;
+ // } catch (int i) {}
+ // }
+
// There is no point in having multiple copies of the same typeinfo in
// a filter, so only add it if we didn't already.
if (SeenInFilter.insert(TypeInfo).second)
Modified: llvm/trunk/test/Transforms/InstCombine/LandingPadClauses.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/LandingPadClauses.ll?rev=253370&r1=253369&r2=253370&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/LandingPadClauses.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/LandingPadClauses.ll Tue Nov 17 14:13:04 2015
@@ -69,9 +69,11 @@ lpad.c:
filter [1 x i32*] [i32* @T1]
catch i32* @T2
unreachable
+; Caught types should not be removed from filters
; CHECK: %c = landingpad
-; CHECK-NEXT: @T1
-; CHECK-NEXT: filter [0 x i32*]
+; CHECK-NEXT: catch i32* @T1
+; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
+; CHECK-NEXT: catch i32* @T2
; CHECK-NEXT: unreachable
lpad.d:
@@ -87,9 +89,10 @@ lpad.e:
catch i32* @T1
filter [3 x i32*] [i32* @T1, i32* @T2, i32* @T2]
unreachable
+; Caught types should not be removed from filters
; CHECK: %e = landingpad
-; CHECK-NEXT: @T1
-; CHECK-NEXT: filter [1 x i32*] [i32* @T2]
+; CHECK-NEXT: catch i32* @T1
+; CHECK-NEXT: filter [2 x i32*] [i32* @T1, i32* @T2]
; CHECK-NEXT: unreachable
lpad.f:
More information about the llvm-commits
mailing list