Mark the eh.typeid.for intrinsic as being 'const', which it is inside
authorDuncan Sands <baldrick@free.fr>
Fri, 9 Sep 2011 07:50:37 +0000 (07:50 +0000)
committerDuncan Sands <baldrick@free.fr>
Fri, 9 Sep 2011 07:50:37 +0000 (07:50 +0000)
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

include/llvm/Intrinsics.td
test/Transforms/GVN/2011-09-07-TypeIdFor.ll

index b7b4e7cc06c7d4b297abb6b0a051d99b81a7a9f7..c526301bf9182a29f3dd4f70bb9cdf8040b3b87b 100644 (file)
@@ -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]>;
index eeaf998e72c169a0069e7d065c7cdad90d4f6d77..314b5bb113a68ae8c63dd7cf5e6df792792976bc 100644 (file)
@@ -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