Skip to content

Instantly share code, notes, and snippets.

@artagnon
Created November 12, 2015 20:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save artagnon/c9ecbc929ed8b7378a91 to your computer and use it in GitHub Desktop.
Save artagnon/c9ecbc929ed8b7378a91 to your computer and use it in GitHub Desktop.
Smart pointer versus dumb pointer (code generation impact)
; 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