aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2011-09-09 07:50:37 +0000
committerDuncan Sands <baldrick@free.fr>2011-09-09 07:50:37 +0000
commit73c8415d90ad5a702538d8bc308411e7b2299f32 (patch)
tree84a547927ab39254ab2a3f0560201bd60b1e98d8
parentd3be6ecafec0068e70d034f6467b1d6acf1cb806 (diff)
Mark the eh.typeid.for intrinsic as being 'const', which it is inside
any given function. As pointed out by John McCall, this is needed to have redundant eh.typeid.for tests be eliminated in the presence of cleanups. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139360 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Intrinsics.td4
-rw-r--r--test/Transforms/GVN/2011-09-07-TypeIdFor.ll3
2 files changed, 6 insertions, 1 deletions
diff --git a/include/llvm/Intrinsics.td b/include/llvm/Intrinsics.td
index b7b4e7cc06..c526301bf9 100644
--- a/include/llvm/Intrinsics.td
+++ b/include/llvm/Intrinsics.td
@@ -309,7 +309,9 @@ def int_eh_selector : Intrinsic<[llvm_i32_ty],
[llvm_ptr_ty, llvm_ptr_ty, llvm_vararg_ty]>;
def int_eh_resume : Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty], [Throws]>;
-def int_eh_typeid_for : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty], [IntrReadMem]>;
+// The result of eh.typeid.for depends on the enclosing function, but inside a
+// given function it is 'const' and may be CSE'd etc.
+def int_eh_typeid_for : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty], [IntrNoMem]>;
def int_eh_return_i32 : Intrinsic<[], [llvm_i32_ty, llvm_ptr_ty]>;
def int_eh_return_i64 : Intrinsic<[], [llvm_i64_ty, llvm_ptr_ty]>;
diff --git a/test/Transforms/GVN/2011-09-07-TypeIdFor.ll b/test/Transforms/GVN/2011-09-07-TypeIdFor.ll
index eeaf998e72..314b5bb113 100644
--- a/test/Transforms/GVN/2011-09-07-TypeIdFor.ll
+++ b/test/Transforms/GVN/2011-09-07-TypeIdFor.ll
@@ -7,6 +7,8 @@
declare void @_Z4barv()
+declare void @_Z7cleanupv()
+
declare i32 @llvm.eh.typeid.for(i8*) nounwind readonly
declare i8* @__cxa_begin_catch(i8*) nounwind
@@ -50,6 +52,7 @@ ppad2: ; preds = %next
br label %return
next2: ; preds = %next
+ call void @_Z7cleanupv()
%typeid = tail call i32 @llvm.eh.typeid.for(i8* bitcast (%struct.__fundamental_type_info_pseudo* @_ZTIi to i8*))
; CHECK-NOT: call i32 @llvm.eh.typeid.for
%4 = icmp eq i32 %filter3.i, %typeid