Created
November 12, 2015 20:51
-
-
Save artagnon/c9ecbc929ed8b7378a91 to your computer and use it in GitHub Desktop.
Smart pointer versus dumb pointer (code generation impact)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; ModuleID = 'dumb.cpp' | |
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" | |
target triple = "x86_64-apple-macosx10.10.0" | |
; Function Attrs: ssp uwtable | |
define i32 @main() #0 { | |
entry: | |
%retval = alloca i32, align 4 | |
%Dumb = alloca i32*, align 8 | |
store i32 0, i32* %retval, align 4 | |
%call = call noalias i8* @_Znwm(i64 4) #3 | |
%0 = bitcast i8* %call to i32* | |
store i32 3, i32* %0, align 4 | |
store i32* %0, i32** %Dumb, align 8 | |
%1 = load i32*, i32** %Dumb, align 8 | |
%isnull = icmp eq i32* %1, null | |
br i1 %isnull, label %delete.end, label %delete.notnull | |
delete.notnull: ; preds = %entry | |
%2 = bitcast i32* %1 to i8* | |
call void @_ZdlPv(i8* %2) #4 | |
br label %delete.end | |
delete.end: ; preds = %delete.notnull, %entry | |
ret i32 0 | |
} | |
; Function Attrs: nobuiltin | |
declare noalias i8* @_Znwm(i64) #1 | |
; Function Attrs: nobuiltin nounwind | |
declare void @_ZdlPv(i8*) #2 | |
attributes #0 = { ssp uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+ssse3" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #1 = { nobuiltin "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+ssse3" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #2 = { nobuiltin nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+ssse3" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #3 = { builtin } | |
attributes #4 = { builtin nounwind } | |
!llvm.module.flags = !{!0} | |
!llvm.ident = !{!1} | |
!0 = !{i32 1, !"PIC Level", i32 2} | |
!1 = !{!"clang version 3.8.0 "} | |
; ------------------------------------------------------------- | |
; ModuleID = 'smart.cpp' | |
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" | |
target triple = "x86_64-apple-macosx10.10.0" | |
%"class.std::__1::__libcpp_compressed_pair_imp" = type { i32* } | |
%"class.std::__1::__compressed_pair" = type { %"class.std::__1::__libcpp_compressed_pair_imp" } | |
%"struct.std::__1::default_delete" = type { i8 } | |
%"class.std::__1::unique_ptr" = type { %"class.std::__1::__compressed_pair" } | |
; Function Attrs: ssp uwtable | |
define i32 @main() #0 personality i32 (...)* @__gxx_personality_v0 { | |
entry: | |
%this.addr.i.i.13.i.i.i = alloca %"class.std::__1::__libcpp_compressed_pair_imp"*, align 8 | |
%this.addr.i.14.i.i.i = alloca %"class.std::__1::__compressed_pair"*, align 8 | |
%this.addr.i.i.8.i.i.i = alloca %"class.std::__1::__libcpp_compressed_pair_imp"*, align 8 | |
%this.addr.i.9.i.i.i = alloca %"class.std::__1::__compressed_pair"*, align 8 | |
%this.addr.i.6.i.i.i = alloca %"struct.std::__1::default_delete"*, align 8 | |
%__ptr.addr.i.i.i.i = alloca i32*, align 8 | |
%this.addr.i.i.i.i.i.1 = alloca %"class.std::__1::__libcpp_compressed_pair_imp"*, align 8 | |
%this.addr.i.i.i.i.2 = alloca %"class.std::__1::__compressed_pair"*, align 8 | |
%this.addr.i.i.i.3 = alloca %"class.std::__1::unique_ptr"*, align 8 | |
%__p.addr.i.i.i.4 = alloca i32*, align 8 | |
%__tmp.i.i.i = alloca i32*, align 8 | |
%this.addr.i.i.5 = alloca %"class.std::__1::unique_ptr"*, align 8 | |
%this.addr.i = alloca %"class.std::__1::unique_ptr"*, align 8 | |
%__t.addr.i.i.i.i.i.i.i = alloca i32**, align 8 | |
%this.addr.i.i.i.i.i.i = alloca %"class.std::__1::__libcpp_compressed_pair_imp"*, align 8 | |
%__t1.addr.i.i.i.i.i.i = alloca i32*, align 8 | |
%__t.addr.i.i.i.i.i.i = alloca i32**, align 8 | |
%this.addr.i.i.i.i.i = alloca %"class.std::__1::__compressed_pair"*, align 8 | |
%__t1.addr.i.i.i.i.i = alloca i32*, align 8 | |
%this.addr.i.i.i.i = alloca %"class.std::__1::__compressed_pair"*, align 8 | |
%__t1.addr.i.i.i.i = alloca i32*, align 8 | |
%__t.addr.i.i.i.i = alloca i32**, align 8 | |
%this.addr.i.i.i = alloca %"class.std::__1::unique_ptr"*, align 8 | |
%__p.addr.i.i.i = alloca i32*, align 8 | |
%this.addr.i.i = alloca %"class.std::__1::unique_ptr"*, align 8 | |
%__p.addr.i.i = alloca i32*, align 8 | |
%__t.addr.i.i = alloca i32*, align 8 | |
%__args.addr.i = alloca i32*, align 8 | |
%retval = alloca i32, align 4 | |
%Smart = alloca %"class.std::__1::unique_ptr", align 8 | |
%ref.tmp = alloca i32, align 4 | |
store i32 0, i32* %retval, align 4 | |
store i32 3, i32* %ref.tmp, align 4 | |
store i32* %ref.tmp, i32** %__args.addr.i, align 8, !noalias !2 | |
%call.i = call noalias i8* @_Znwm(i64 4) #4, !noalias !2 | |
%0 = bitcast i8* %call.i to i32* | |
%1 = load i32*, i32** %__args.addr.i, align 8, !noalias !2 | |
store i32* %1, i32** %__t.addr.i.i, align 8, !noalias !2 | |
%2 = load i32*, i32** %__t.addr.i.i, align 8, !noalias !2 | |
%3 = load i32, i32* %2, align 4, !noalias !2 | |
store i32 %3, i32* %0, align 4, !noalias !2 | |
store %"class.std::__1::unique_ptr"* %Smart, %"class.std::__1::unique_ptr"** %this.addr.i.i, align 8, !noalias !2 | |
store i32* %0, i32** %__p.addr.i.i, align 8, !noalias !2 | |
%this1.i.i = load %"class.std::__1::unique_ptr"*, %"class.std::__1::unique_ptr"** %this.addr.i.i, align 8, !noalias !2 | |
%4 = load i32*, i32** %__p.addr.i.i, align 8, !noalias !2 | |
store %"class.std::__1::unique_ptr"* %this1.i.i, %"class.std::__1::unique_ptr"** %this.addr.i.i.i, align 8, !noalias !2 | |
store i32* %4, i32** %__p.addr.i.i.i, align 8, !noalias !2 | |
%this1.i.i.i = load %"class.std::__1::unique_ptr"*, %"class.std::__1::unique_ptr"** %this.addr.i.i.i, align 8, !noalias !2 | |
%__ptr_.i.i.i = getelementptr inbounds %"class.std::__1::unique_ptr", %"class.std::__1::unique_ptr"* %this1.i.i.i, i32 0, i32 0 | |
store i32** %__p.addr.i.i.i, i32*** %__t.addr.i.i.i.i, align 8, !noalias !2 | |
%5 = load i32**, i32*** %__t.addr.i.i.i.i, align 8, !noalias !2 | |
%6 = load i32*, i32** %5, align 8 | |
store %"class.std::__1::__compressed_pair"* %__ptr_.i.i.i, %"class.std::__1::__compressed_pair"** %this.addr.i.i.i.i, align 8, !noalias !2 | |
store i32* %6, i32** %__t1.addr.i.i.i.i, align 8, !noalias !2 | |
%this1.i.i.i.i = load %"class.std::__1::__compressed_pair"*, %"class.std::__1::__compressed_pair"** %this.addr.i.i.i.i, align 8, !noalias !2 | |
%7 = load i32*, i32** %__t1.addr.i.i.i.i, align 8, !noalias !2 | |
store %"class.std::__1::__compressed_pair"* %this1.i.i.i.i, %"class.std::__1::__compressed_pair"** %this.addr.i.i.i.i.i, align 8, !noalias !2 | |
store i32* %7, i32** %__t1.addr.i.i.i.i.i, align 8, !noalias !2 | |
%this1.i.i.i.i.i = load %"class.std::__1::__compressed_pair"*, %"class.std::__1::__compressed_pair"** %this.addr.i.i.i.i.i, align 8, !noalias !2 | |
%8 = bitcast %"class.std::__1::__compressed_pair"* %this1.i.i.i.i.i to %"class.std::__1::__libcpp_compressed_pair_imp"* | |
store i32** %__t1.addr.i.i.i.i.i, i32*** %__t.addr.i.i.i.i.i.i, align 8, !noalias !2 | |
%9 = load i32**, i32*** %__t.addr.i.i.i.i.i.i, align 8, !noalias !2 | |
%10 = load i32*, i32** %9, align 8 | |
store %"class.std::__1::__libcpp_compressed_pair_imp"* %8, %"class.std::__1::__libcpp_compressed_pair_imp"** %this.addr.i.i.i.i.i.i, align 8, !noalias !2 | |
store i32* %10, i32** %__t1.addr.i.i.i.i.i.i, align 8, !noalias !2 | |
%this1.i.i.i.i.i.i = load %"class.std::__1::__libcpp_compressed_pair_imp"*, %"class.std::__1::__libcpp_compressed_pair_imp"** %this.addr.i.i.i.i.i.i, align 8, !noalias !2 | |
%11 = bitcast %"class.std::__1::__libcpp_compressed_pair_imp"* %this1.i.i.i.i.i.i to %"struct.std::__1::default_delete"* | |
%__first_.i.i.i.i.i.i = getelementptr inbounds %"class.std::__1::__libcpp_compressed_pair_imp", %"class.std::__1::__libcpp_compressed_pair_imp"* %this1.i.i.i.i.i.i, i32 0, i32 0 | |
store i32** %__t1.addr.i.i.i.i.i.i, i32*** %__t.addr.i.i.i.i.i.i.i, align 8, !noalias !2 | |
%12 = load i32**, i32*** %__t.addr.i.i.i.i.i.i.i, align 8, !noalias !2 | |
%13 = load i32*, i32** %12, align 8 | |
store i32* %13, i32** %__first_.i.i.i.i.i.i, align 8 | |
store i32 0, i32* %retval, align 4 | |
store %"class.std::__1::unique_ptr"* %Smart, %"class.std::__1::unique_ptr"** %this.addr.i, align 8 | |
%this1.i = load %"class.std::__1::unique_ptr"*, %"class.std::__1::unique_ptr"** %this.addr.i, align 8 | |
store %"class.std::__1::unique_ptr"* %this1.i, %"class.std::__1::unique_ptr"** %this.addr.i.i.5, align 8 | |
%this1.i.i.6 = load %"class.std::__1::unique_ptr"*, %"class.std::__1::unique_ptr"** %this.addr.i.i.5, align 8 | |
store %"class.std::__1::unique_ptr"* %this1.i.i.6, %"class.std::__1::unique_ptr"** %this.addr.i.i.i.3, align 8 | |
store i32* null, i32** %__p.addr.i.i.i.4, align 8 | |
%this1.i.i.i.7 = load %"class.std::__1::unique_ptr"*, %"class.std::__1::unique_ptr"** %this.addr.i.i.i.3, align 8 | |
%__ptr_.i.i.i.8 = getelementptr inbounds %"class.std::__1::unique_ptr", %"class.std::__1::unique_ptr"* %this1.i.i.i.7, i32 0, i32 0 | |
store %"class.std::__1::__compressed_pair"* %__ptr_.i.i.i.8, %"class.std::__1::__compressed_pair"** %this.addr.i.i.i.i.2, align 8 | |
%this1.i.i.i.i.9 = load %"class.std::__1::__compressed_pair"*, %"class.std::__1::__compressed_pair"** %this.addr.i.i.i.i.2, align 8 | |
%14 = bitcast %"class.std::__1::__compressed_pair"* %this1.i.i.i.i.9 to %"class.std::__1::__libcpp_compressed_pair_imp"* | |
store %"class.std::__1::__libcpp_compressed_pair_imp"* %14, %"class.std::__1::__libcpp_compressed_pair_imp"** %this.addr.i.i.i.i.i.1, align 8 | |
%this1.i.i.i.i.i.10 = load %"class.std::__1::__libcpp_compressed_pair_imp"*, %"class.std::__1::__libcpp_compressed_pair_imp"** %this.addr.i.i.i.i.i.1, align 8 | |
%__first_.i.i.i.i.i = getelementptr inbounds %"class.std::__1::__libcpp_compressed_pair_imp", %"class.std::__1::__libcpp_compressed_pair_imp"* %this1.i.i.i.i.i.10, i32 0, i32 0 | |
%15 = load i32*, i32** %__first_.i.i.i.i.i, align 8 | |
store i32* %15, i32** %__tmp.i.i.i, align 8 | |
%16 = load i32*, i32** %__p.addr.i.i.i.4, align 8 | |
%__ptr_2.i.i.i = getelementptr inbounds %"class.std::__1::unique_ptr", %"class.std::__1::unique_ptr"* %this1.i.i.i.7, i32 0, i32 0 | |
store %"class.std::__1::__compressed_pair"* %__ptr_2.i.i.i, %"class.std::__1::__compressed_pair"** %this.addr.i.9.i.i.i, align 8 | |
%this1.i.10.i.i.i = load %"class.std::__1::__compressed_pair"*, %"class.std::__1::__compressed_pair"** %this.addr.i.9.i.i.i, align 8 | |
%17 = bitcast %"class.std::__1::__compressed_pair"* %this1.i.10.i.i.i to %"class.std::__1::__libcpp_compressed_pair_imp"* | |
store %"class.std::__1::__libcpp_compressed_pair_imp"* %17, %"class.std::__1::__libcpp_compressed_pair_imp"** %this.addr.i.i.8.i.i.i, align 8 | |
%this1.i.i.11.i.i.i = load %"class.std::__1::__libcpp_compressed_pair_imp"*, %"class.std::__1::__libcpp_compressed_pair_imp"** %this.addr.i.i.8.i.i.i, align 8 | |
%__first_.i.i.12.i.i.i = getelementptr inbounds %"class.std::__1::__libcpp_compressed_pair_imp", %"class.std::__1::__libcpp_compressed_pair_imp"* %this1.i.i.11.i.i.i, i32 0, i32 0 | |
store i32* %16, i32** %__first_.i.i.12.i.i.i, align 8 | |
%18 = load i32*, i32** %__tmp.i.i.i, align 8 | |
%tobool.i.i.i = icmp ne i32* %18, null | |
br i1 %tobool.i.i.i, label %if.then.i.i.i, label %_ZNSt3__110unique_ptrIiNS_14default_deleteIiEEED1Ev.exit | |
if.then.i.i.i: ; preds = %entry | |
%__ptr_4.i.i.i = getelementptr inbounds %"class.std::__1::unique_ptr", %"class.std::__1::unique_ptr"* %this1.i.i.i.7, i32 0, i32 0 | |
store %"class.std::__1::__compressed_pair"* %__ptr_4.i.i.i, %"class.std::__1::__compressed_pair"** %this.addr.i.14.i.i.i, align 8 | |
%this1.i.15.i.i.i = load %"class.std::__1::__compressed_pair"*, %"class.std::__1::__compressed_pair"** %this.addr.i.14.i.i.i, align 8 | |
%19 = bitcast %"class.std::__1::__compressed_pair"* %this1.i.15.i.i.i to %"class.std::__1::__libcpp_compressed_pair_imp"* | |
store %"class.std::__1::__libcpp_compressed_pair_imp"* %19, %"class.std::__1::__libcpp_compressed_pair_imp"** %this.addr.i.i.13.i.i.i, align 8 | |
%this1.i.i.16.i.i.i = load %"class.std::__1::__libcpp_compressed_pair_imp"*, %"class.std::__1::__libcpp_compressed_pair_imp"** %this.addr.i.i.13.i.i.i, align 8 | |
%20 = bitcast %"class.std::__1::__libcpp_compressed_pair_imp"* %this1.i.i.16.i.i.i to %"struct.std::__1::default_delete"* | |
%21 = load i32*, i32** %__tmp.i.i.i, align 8 | |
store %"struct.std::__1::default_delete"* %20, %"struct.std::__1::default_delete"** %this.addr.i.6.i.i.i, align 8 | |
store i32* %21, i32** %__ptr.addr.i.i.i.i, align 8 | |
%this1.i.7.i.i.i = load %"struct.std::__1::default_delete"*, %"struct.std::__1::default_delete"** %this.addr.i.6.i.i.i, align 8 | |
%22 = load i32*, i32** %__ptr.addr.i.i.i.i, align 8 | |
%isnull.i.i.i.i = icmp eq i32* %22, null | |
br i1 %isnull.i.i.i.i, label %_ZNKSt3__114default_deleteIiEclEPi.exit.i.i.i, label %delete.notnull.i.i.i.i | |
delete.notnull.i.i.i.i: ; preds = %if.then.i.i.i | |
%23 = bitcast i32* %22 to i8* | |
call void @_ZdlPv(i8* %23) #5 | |
br label %_ZNKSt3__114default_deleteIiEclEPi.exit.i.i.i | |
_ZNKSt3__114default_deleteIiEclEPi.exit.i.i.i: ; preds = %delete.notnull.i.i.i.i, %if.then.i.i.i | |
br label %_ZNSt3__110unique_ptrIiNS_14default_deleteIiEEED1Ev.exit | |
_ZNSt3__110unique_ptrIiNS_14default_deleteIiEEED1Ev.exit: ; preds = %entry, %_ZNKSt3__114default_deleteIiEclEPi.exit.i.i.i | |
%24 = load i32, i32* %retval, align 4 | |
ret i32 %24 | |
} | |
; Function Attrs: nobuiltin | |
declare noalias i8* @_Znwm(i64) #1 | |
declare i32 @__gxx_personality_v0(...) | |
; Function Attrs: noinline noreturn nounwind | |
define linkonce_odr hidden void @__clang_call_terminate(i8*) #2 { | |
%2 = call i8* @__cxa_begin_catch(i8* %0) #6 | |
call void @_ZSt9terminatev() #7 | |
unreachable | |
} | |
declare i8* @__cxa_begin_catch(i8*) | |
declare void @_ZSt9terminatev() | |
; Function Attrs: nobuiltin nounwind | |
declare void @_ZdlPv(i8*) #3 | |
attributes #0 = { ssp uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+ssse3" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #1 = { nobuiltin "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+ssse3" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #2 = { noinline noreturn nounwind } | |
attributes #3 = { nobuiltin nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+ssse3" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #4 = { builtin } | |
attributes #5 = { builtin nounwind } | |
attributes #6 = { nounwind } | |
attributes #7 = { noreturn nounwind } | |
!llvm.module.flags = !{!0} | |
!llvm.ident = !{!1} | |
!0 = !{i32 1, !"PIC Level", i32 2} | |
!1 = !{!"clang version 3.8.0 "} | |
!2 = !{!3} | |
!3 = distinct !{!3, !4, !"_ZNSt3__111make_uniqueIiJiEEENS_11__unique_ifIT_E15__unique_singleEDpOT0_: %agg.result"} | |
!4 = distinct !{!4, !"_ZNSt3__111make_uniqueIiJiEEENS_11__unique_ifIT_E15__unique_singleEDpOT0_"} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment