diff --git a/include/llvm/Intrinsics.td b/include/llvm/Intrinsics.td index b7b4e7cc06c..c526301bf91 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 eeaf998e72c..314b5bb113a 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