Thanks for using Compiler Explorer
Sponsors
C with Coccinelle
C++ with Coccinelle
Jakt
C++
Ada
Algol68
Analysis
Android Java
Android Kotlin
Assembly
C
C3
Carbon
C++ (Circle)
CIRCT
Clean
CMake
CMakeScript
COBOL
C++ for OpenCL
MLIR
Cppx
Cppx-Blue
Cppx-Gold
Cpp2-cppfront
Crystal
C#
CUDA C++
D
Dart
Elixir
Erlang
Fortran
F#
GLSL
Go
Haskell
HLSL
Hook
Hylo
IL
ispc
Java
Julia
Kotlin
LLVM IR
LLVM MIR
Modula-2
Nim
Numba
Objective-C
Objective-C++
OCaml
Odin
OpenCL C
Pascal
Pony
Python
Racket
Ruby
Rust
Snowball
Scala
Slang
Solidity
Spice
SPIR-V
Swift
LLVM TableGen
Toit
TypeScript Native
V
Vala
Visual Basic
Vyper
WASM
Zig
Javascript
GIMPLE
Ygen
sway
llvm source #1
Output
Compile to binary object
Link to binary
Execute the code
Intel asm syntax
Demangle identifiers
Verbose demangling
Filters
Unused labels
Library functions
Directives
Comments
Horizontal whitespace
Debug intrinsics
Compiler
clang (assertions trunk)
clang (trunk)
clang 10.0.0
clang 10.0.1
clang 11.0.0
clang 11.0.1
clang 12.0.0
clang 12.0.1
clang 13.0.0
clang 14.0.0
clang 15.0.0
clang 16.0.0
clang 17.0.1
clang 18.1.0
clang 19.1.0
clang 4.0.1
clang 5.0.0
clang 6.0.0
clang 7.0.0
clang 8.0.0
clang 9.0.0
hexagon-clang 16.0.5
llc (assertions trunk)
llc (trunk)
llc 10.0.0
llc 10.0.1
llc 11.0.0
llc 11.0.1
llc 12.0.0
llc 12.0.1
llc 13.0.0
llc 14.0.0
llc 15.0.0
llc 16.0.0
llc 17.0.1
llc 18.1.0
llc 19.1.0
llc 3.2
llc 3.3
llc 3.9.1
llc 4.0.0
llc 4.0.1
llc 5.0.0
llc 6.0.0
llc 7.0.0
llc 8.0.0
llc 9.0.0
opt (assertions trunk)
opt (trunk)
opt 10.0.0
opt 10.0.1
opt 11.0.0
opt 11.0.1
opt 12.0.0
opt 12.0.1
opt 13.0.0
opt 14.0.0
opt 15.0.0
opt 16.0.0
opt 17.0.1
opt 18.1.0
opt 19.1.0
opt 3.2
opt 3.3
opt 3.9.1
opt 4.0.0
opt 4.0.1
opt 5.0.0
opt 6.0.0
opt 7.0.0
opt 8.0.0
opt 9.0.0
Options
Source code
; ModuleID = 'reduced.ll' source_filename = "reduced.ll" target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32" target triple = "arm64-apple-macosx15.0.0" @global = constant [1 x i8] zeroinitializer declare void @widget(ptr, i64) ; Function Attrs: sanitize_address define ptr @baz(ptr %arg) #0 { bb: store i64 0, ptr null, align 8 %load = load volatile ptr, ptr null, align 8 store i64 0, ptr null, align 8 ret ptr %arg } ; Function Attrs: sanitize_address define fastcc void @snork(ptr %arg, i1 %arg1) #0 { bb: br i1 %arg1, label %bb3, label %bb4 bb2: ; preds = %bb4, %bb3 ret void bb3: ; preds = %bb %call = call ptr @spam(ptr %arg, ptr @global) br label %bb2 bb4: ; preds = %bb call fastcc void @zot() br label %bb2 } ; Function Attrs: sanitize_address define ptr @spam(ptr %arg, ptr %arg1) #0 { bb: %call = call ptr @wombat(ptr %arg, ptr %arg1) ret ptr null } define fastcc void @zot() { bb: switch i32 0, label %bb3 [ i32 92, label %bb3 i32 0, label %bb2 i32 1, label %bb1 ] bb1: ; preds = %bb call fastcc void @spam.11() ret void bb2: ; preds = %bb call fastcc void @quux.12() ret void bb3: ; preds = %bb, %bb call fastcc void @baz.13() ret void } ; Function Attrs: sanitize_address define ptr @wombat(ptr %arg, ptr %arg1) #0 { bb: %call = call i64 @wobble(ptr %arg1) call void @quux(ptr %arg, i64 %call) ret ptr null } declare void @wombat.1(ptr) ; Function Attrs: inlinehint sanitize_address define void @quux(ptr %arg, i64 %arg1) #1 { bb: %call = call i64 @eggs(ptr null) %icmp = icmp eq i64 %call, 0 br i1 %icmp, label %bb2, label %bb3 bb2: ; preds = %bb unreachable bb3: ; preds = %bb %call4 = call i1 @wobble.2(i64 %arg1) br i1 %call4, label %bb5, label %bb7 bb5: ; preds = %bb3 call void @quux.3(ptr null, i64 0) %call6 = call ptr @zot.4(ptr %arg) br label %bb7 bb7: ; preds = %bb5, %bb3 %phi = phi ptr [ %call6, %bb5 ], [ null, %bb3 ] %call8 = call ptr @blam(ptr %phi, ptr %arg, i64 %arg1) ret void } ; Function Attrs: sanitize_address define i64 @wobble(ptr %arg) #0 personality ptr null { bb: %call = call i64 @foo.10(ptr %arg) ret i64 %call } declare i64 @eggs(ptr) ; Function Attrs: sanitize_address define i1 @wobble.2(i64 %arg) #0 { bb: %icmp = icmp ult i64 %arg, 23 ret i1 %icmp } declare void @quux.3(ptr, i64) ; Function Attrs: sanitize_address define ptr @zot.4(ptr %arg) #0 { bb: %call = call ptr @baz(ptr %arg) %getelementptr = getelementptr i8, ptr %call, i64 1 call void @widget(ptr null, i64 0) %call1 = call ptr @barney(ptr null) ret ptr %getelementptr } ; Function Attrs: sanitize_address define ptr @blam(ptr %arg, ptr %arg1, i64 %arg2) #0 personality ptr null { bb: %icmp = icmp ult ptr %arg1, %arg br i1 %icmp, label %bb7, label %bb3 bb3: ; preds = %bb %icmp4 = icmp ne ptr %arg, null %icmp5 = icmp eq i64 %arg2, 0 %xor = xor i1 %icmp4, %icmp5 br i1 %xor, label %bb7, label %bb6 bb6: ; preds = %bb3 br label %bb7 bb7: ; preds = %bb6, %bb3, %bb call void @wombat.1(ptr null) %call = call ptr @snork.5(ptr %arg1, i64 %arg2, ptr %arg) ret ptr null } declare ptr @barney(ptr) ; Function Attrs: sanitize_address define ptr @snork.5(ptr %arg, i64 %arg1, ptr %arg2) #0 { bb: %add = add i64 %arg1, 1 %icmp = icmp ne ptr %arg, null %icmp3 = icmp eq i64 %add, 0 %xor = xor i1 %icmp, %icmp3 %icmp4 = icmp ne i64 %add, 0 %icmp5 = icmp slt i64 %arg1, 0 %xor6 = xor i1 %icmp5, %icmp4 %and = and i1 %xor, %xor6 br i1 %and, label %bb8, label %bb7 bb7: ; preds = %bb store i1 false, ptr null, align 1 br label %bb8 bb8: ; preds = %bb7, %bb %getelementptr = getelementptr i8, ptr %arg, i64 %arg1 %call = call ptr @wibble(ptr %arg, ptr %getelementptr, ptr %arg2) ret ptr null } ; Function Attrs: sanitize_address define ptr @wibble(ptr %arg, ptr %arg1, ptr %arg2) #0 { bb: %call = call [2 x i64] @zot.6(ptr %arg, ptr %arg1, ptr %arg2) ret ptr null } ; Function Attrs: sanitize_address define [2 x i64] @zot.6(ptr %arg, ptr %arg1, ptr %arg2) #0 { bb: %call = call [2 x i64] @foo(ptr %arg, ptr %arg1, ptr %arg2) ret [2 x i64] zeroinitializer } ; Function Attrs: sanitize_address define [2 x i64] @foo(ptr %arg, ptr %arg1, ptr %arg2) #0 { bb: store ptr null, ptr null, align 8 %call = call [2 x i64] @ham(ptr %arg, ptr %arg1, ptr %arg2) ret [2 x i64] zeroinitializer } ; Function Attrs: sanitize_address define [2 x i64] @ham(ptr %arg, ptr %arg1, ptr %arg2) #0 { bb: %call = call [2 x i64] @quux.7(ptr null) %call3 = call [2 x i64] @foo.8(ptr %arg, ptr %arg1, ptr %arg2) ret [2 x i64] zeroinitializer } declare [2 x i64] @quux.7(ptr) ; Function Attrs: sanitize_address define [2 x i64] @foo.8(ptr %arg, ptr %arg1, ptr %arg2) #0 { bb: %call = call [2 x i64] @ham.9(ptr %arg, ptr %arg1, ptr %arg2) ret [2 x i64] zeroinitializer } ; Function Attrs: sanitize_address define [2 x i64] @ham.9(ptr %arg, ptr %arg1, ptr %arg2) #0 { bb: %ptrtoint = ptrtoint ptr %arg1 to i64 %ptrtoint3 = ptrtoint ptr %arg to i64 %sub = sub i64 %ptrtoint, %ptrtoint3 call void @llvm.memmove.p0.p0.i64(ptr %arg2, ptr %arg, i64 %sub, i1 false) %icmp = icmp ne ptr %arg1, null %icmp4 = icmp eq ptr %arg, null %xor = xor i1 %icmp, %icmp4 br i1 %xor, label %bb6, label %bb5 bb5: ; preds = %bb br label %bb6 bb6: ; preds = %bb5, %bb ret [2 x i64] zeroinitializer } ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite) declare void @llvm.memmove.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1 immarg) #2 ; Function Attrs: sanitize_address define i64 @foo.10(ptr %arg) #0 { bb: %call = call i64 @strlen(ptr %arg) ret i64 %call } declare i64 @strlen(ptr) ; Function Attrs: sanitize_address define fastcc void @spam.11() #0 { bb: %call = call ptr null(ptr null) call fastcc void @snork(ptr null, i1 false) ret void } ; Function Attrs: sanitize_address define fastcc void @quux.12() #0 { bb: call fastcc void @spam.11() ret void } ; Function Attrs: sanitize_address define fastcc void @baz.13() #0 { bb: call fastcc void @spam.11() ret void } attributes #0 = { sanitize_address "target-cpu"="apple-m1" } attributes #1 = { inlinehint sanitize_address "target-cpu"="apple-m1" } attributes #2 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
Become a Patron
Sponsor on GitHub
Donate via PayPal
Source on GitHub
Mailing list
Installed libraries
Wiki
Report an issue
How it works
Contact the author
CE on Mastodon
CE on Bluesky
About the author
Statistics
Changelog
Version tree