Advertisement
Guest User

Limitations of CSE in C++ LLVM IR

a guest
May 28th, 2015
593
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
LLVM 7.57 KB | None | 0 0
  1. ; Function Attrs: uwtable
  2. define %struct.Foo* @getFoo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unordered_map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<Foo, std::default_delete<Foo> >, std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::unique_ptr<Foo, std::default_delete<Foo> > > > >&)(%"class.std::basic_string"* %key, %"class.std::unordered_map"* %cache) #0 {
  3.   %1 = alloca %"class.std::unique_ptr", align 8
  4.   call void @llvm.dbg.declare(metadata !{%"class.std::basic_string"* %key}, metadata !2421), !dbg !3147
  5.   call void @llvm.dbg.value(metadata !{%"class.std::unordered_map"* %cache}, i64 0, metadata !2422), !dbg !3148
  6.   %2 = call %"class.std::unique_ptr"* @std::unordered_map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<Foo, std::default_delete<Foo> >, std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::unique_ptr<Foo, std::default_delete<Foo> > > > >::operator[](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)(%"class.std::unordered_map"* %cache, %"class.std::basic_string"* %key), !dbg !3149
  7.   %3 = call zeroext i1 @std::unique_ptr<Foo, std::default_delete<Foo> >::operator bool() const(%"class.std::unique_ptr"* %2) #5, !dbg !3149
  8.   %4 = call %"class.std::unique_ptr"* @std::unordered_map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<Foo, std::default_delete<Foo> >, std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::unique_ptr<Foo, std::default_delete<Foo> > > > >::operator[](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)(%"class.std::unordered_map"* %cache, %"class.std::basic_string"* %key), !dbg !3151
  9.   br i1 %3, label %5, label %7, !dbg !3149
  10.  
  11. ; <label>:5                                       ; preds = %0
  12.   %6 = call %struct.Foo* @std::unique_ptr<Foo, std::default_delete<Foo> >::get() const(%"class.std::unique_ptr"* %4) #5, !dbg !3151
  13.   br label %14, !dbg !3151
  14.  
  15. ; <label>:7                                       ; preds = %0
  16.   %8 = call noalias i8* @operator new(unsigned long)(i64 4) #16, !dbg !3152
  17.   %9 = bitcast i8* %8 to %struct.Foo*, !dbg !3152
  18.   %10 = bitcast i8* %8 to i32*, !dbg !3152
  19.   store i32 0, i32* %10, align 4, !dbg !3152
  20.   call void @std::unique_ptr<Foo, std::default_delete<Foo> >::unique_ptr(Foo*)(%"class.std::unique_ptr"* %1, %struct.Foo* %9) #5, !dbg !3152
  21.   %11 = call %"class.std::unique_ptr"* @std::unique_ptr<Foo, std::default_delete<Foo> >::operator=(std::unique_ptr<Foo, std::default_delete<Foo> >&&)(%"class.std::unique_ptr"* %4, %"class.std::unique_ptr"* %1) #5, !dbg !3152
  22.   call void @std::unique_ptr<Foo, std::default_delete<Foo> >::~unique_ptr()(%"class.std::unique_ptr"* %1) #5, !dbg !3152
  23.   %12 = call %"class.std::unique_ptr"* @std::unordered_map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<Foo, std::default_delete<Foo> >, std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::unique_ptr<Foo, std::default_delete<Foo> > > > >::operator[](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)(%"class.std::unordered_map"* %cache, %"class.std::basic_string"* %key), !dbg !3153
  24.   %13 = call %struct.Foo* @std::unique_ptr<Foo, std::default_delete<Foo> >::get() const(%"class.std::unique_ptr"* %12) #5, !dbg !3153
  25.   br label %14, !dbg !3153
  26.  
  27. ; <label>:14                                      ; preds = %7, %5
  28.   %.0 = phi %struct.Foo* [ %6, %5 ], [ %13, %7 ]
  29.   ret %struct.Foo* %.0, !dbg !3154
  30. }
  31.  
  32.  
  33.  
  34. ; Function Attrs: uwtable
  35. define %struct.Foo* @getFooBetter(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unordered_map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<Foo, std::default_delete<Foo> >, std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::unique_ptr<Foo, std::default_delete<Foo> > > > >&)(%"class.std::basic_string"* %key, %"class.std::unordered_map"* %cache) #0 {
  36.   %1 = alloca %"class.std::unique_ptr", align 8
  37.   call void @llvm.dbg.declare(metadata !{%"class.std::basic_string"* %key}, metadata !2425), !dbg !3185
  38.   call void @llvm.dbg.value(metadata !{%"class.std::unordered_map"* %cache}, i64 0, metadata !2426), !dbg !3186
  39.   %2 = call %"class.std::unique_ptr"* @std::unordered_map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<Foo, std::default_delete<Foo> >, std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::unique_ptr<Foo, std::default_delete<Foo> > > > >::operator[](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)(%"class.std::unordered_map"* %cache, %"class.std::basic_string"* %key), !dbg !3187
  40.   call void @llvm.dbg.value(metadata !{%"class.std::unique_ptr"* %2}, i64 0, metadata !2427), !dbg !3187
  41.   %3 = call zeroext i1 @std::unique_ptr<Foo, std::default_delete<Foo> >::operator bool() const(%"class.std::unique_ptr"* %2) #5, !dbg !3188
  42.   br i1 %3, label %4, label %6, !dbg !3188
  43.  
  44. ; <label>:4                                       ; preds = %0
  45.   %5 = call %struct.Foo* @std::unique_ptr<Foo, std::default_delete<Foo> >::get() const(%"class.std::unique_ptr"* %2) #5, !dbg !3190
  46.   br label %12, !dbg !3190
  47.  
  48. ; <label>:6                                       ; preds = %0
  49.   %7 = call noalias i8* @operator new(unsigned long)(i64 4) #16, !dbg !3191
  50.   %8 = bitcast i8* %7 to %struct.Foo*, !dbg !3191
  51.   %9 = bitcast i8* %7 to i32*, !dbg !3191
  52.   store i32 0, i32* %9, align 4, !dbg !3191
  53.   call void @std::unique_ptr<Foo, std::default_delete<Foo> >::unique_ptr(Foo*)(%"class.std::unique_ptr"* %1, %struct.Foo* %8) #5, !dbg !3191
  54.   %10 = call %"class.std::unique_ptr"* @std::unique_ptr<Foo, std::default_delete<Foo> >::operator=(std::unique_ptr<Foo, std::default_delete<Foo> >&&)(%"class.std::unique_ptr"* %2, %"class.std::unique_ptr"* %1) #5, !dbg !3191
  55.   call void @std::unique_ptr<Foo, std::default_delete<Foo> >::~unique_ptr()(%"class.std::unique_ptr"* %1) #5, !dbg !3191
  56.   %11 = call %struct.Foo* @std::unique_ptr<Foo, std::default_delete<Foo> >::get() const(%"class.std::unique_ptr"* %2) #5, !dbg !3192
  57.   br label %12, !dbg !3192
  58.  
  59. ; <label>:12                                      ; preds = %6, %4
  60.   %.0 = phi %struct.Foo* [ %5, %4 ], [ %11, %6 ]
  61.   ret %struct.Foo* %.0, !dbg !3193
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement