Skip to content

Instantly share code, notes, and snippets.

@luc-tielen
Created November 17, 2021 16:10
Show Gist options
  • Save luc-tielen/86903f7666c750ed6594916678777eb6 to your computer and use it in GitHub Desktop.
Save luc-tielen/86903f7666c750ed6594916678777eb6 to your computer and use it in GitHub Desktop.
Demo of "Generating fast and expressive code using LLVM & Haskell" talk, extras
; ModuleID = 'bf'
source_filename = "<string>"
declare i8* @malloc(i32)
declare void @free(i8*)
declare void @llvm.memset.p0i8.i64(i8*, i8, i64, i1)
declare i32 @putchar(i32)
declare i32 @getchar()
define i32 @main(i32 %argc_0, i8** %argv_0) {
%1 = call i8* @malloc(i32 120000)
call void @llvm.memset.p0i8.i64(i8* %1, i8 0, i64 120000, i1 false)
%2 = bitcast i8* %1 to i32*
%3 = alloca i32
store i32 0, i32* %3
%4 = load i32, i32* %3
%5 = getelementptr i32, i32* %2, i32 %4
%6 = load i32, i32* %5
%7 = add i32 1, %6
store i32 %7, i32* %5
%8 = load i32, i32* %3
%9 = getelementptr i32, i32* %2, i32 %8
%10 = load i32, i32* %9
%11 = add i32 1, %10
store i32 %11, i32* %9
%12 = load i32, i32* %3
%13 = getelementptr i32, i32* %2, i32 %12
%14 = load i32, i32* %13
%15 = add i32 1, %14
store i32 %15, i32* %13
%16 = load i32, i32* %3
%17 = getelementptr i32, i32* %2, i32 %16
%18 = load i32, i32* %17
%19 = add i32 1, %18
store i32 %19, i32* %17
%20 = load i32, i32* %3
%21 = getelementptr i32, i32* %2, i32 %20
%22 = load i32, i32* %21
%23 = add i32 1, %22
store i32 %23, i32* %21
%24 = load i32, i32* %3
%25 = getelementptr i32, i32* %2, i32 %24
%26 = load i32, i32* %25
%27 = add i32 1, %26
store i32 %27, i32* %25
%28 = load i32, i32* %3
%29 = getelementptr i32, i32* %2, i32 %28
%30 = load i32, i32* %29
%31 = add i32 1, %30
store i32 %31, i32* %29
%32 = load i32, i32* %3
%33 = getelementptr i32, i32* %2, i32 %32
%34 = load i32, i32* %33
%35 = add i32 1, %34
store i32 %35, i32* %33
br label %while.begin_0
while.begin_0: ; preds = %while.end_1, %0
%36 = load i32, i32* %3
%37 = getelementptr i32, i32* %2, i32 %36
%38 = load i32, i32* %37
%39 = icmp ne i32 %38, 0
br i1 %39, label %while.body_0, label %while.end_2
while.body_0: ; preds = %while.begin_0
%40 = load i32, i32* %3
%41 = add i32 1, %40
store i32 %41, i32* %3
%42 = load i32, i32* %3
%43 = getelementptr i32, i32* %2, i32 %42
%44 = load i32, i32* %43
%45 = add i32 1, %44
store i32 %45, i32* %43
%46 = load i32, i32* %3
%47 = getelementptr i32, i32* %2, i32 %46
%48 = load i32, i32* %47
%49 = add i32 1, %48
store i32 %49, i32* %47
%50 = load i32, i32* %3
%51 = getelementptr i32, i32* %2, i32 %50
%52 = load i32, i32* %51
%53 = add i32 1, %52
store i32 %53, i32* %51
%54 = load i32, i32* %3
%55 = getelementptr i32, i32* %2, i32 %54
%56 = load i32, i32* %55
%57 = add i32 1, %56
store i32 %57, i32* %55
br label %while.begin_1
while.begin_1: ; preds = %while.body_1, %while.body_0
%58 = load i32, i32* %3
%59 = getelementptr i32, i32* %2, i32 %58
%60 = load i32, i32* %59
%61 = icmp ne i32 %60, 0
br i1 %61, label %while.body_1, label %while.end_0
while.body_1: ; preds = %while.begin_1
%62 = load i32, i32* %3
%63 = add i32 1, %62
store i32 %63, i32* %3
%64 = load i32, i32* %3
%65 = getelementptr i32, i32* %2, i32 %64
%66 = load i32, i32* %65
%67 = add i32 1, %66
store i32 %67, i32* %65
%68 = load i32, i32* %3
%69 = getelementptr i32, i32* %2, i32 %68
%70 = load i32, i32* %69
%71 = add i32 1, %70
store i32 %71, i32* %69
%72 = load i32, i32* %3
%73 = add i32 1, %72
store i32 %73, i32* %3
%74 = load i32, i32* %3
%75 = getelementptr i32, i32* %2, i32 %74
%76 = load i32, i32* %75
%77 = add i32 1, %76
store i32 %77, i32* %75
%78 = load i32, i32* %3
%79 = getelementptr i32, i32* %2, i32 %78
%80 = load i32, i32* %79
%81 = add i32 1, %80
store i32 %81, i32* %79
%82 = load i32, i32* %3
%83 = getelementptr i32, i32* %2, i32 %82
%84 = load i32, i32* %83
%85 = add i32 1, %84
store i32 %85, i32* %83
%86 = load i32, i32* %3
%87 = add i32 1, %86
store i32 %87, i32* %3
%88 = load i32, i32* %3
%89 = getelementptr i32, i32* %2, i32 %88
%90 = load i32, i32* %89
%91 = add i32 1, %90
store i32 %91, i32* %89
%92 = load i32, i32* %3
%93 = getelementptr i32, i32* %2, i32 %92
%94 = load i32, i32* %93
%95 = add i32 1, %94
store i32 %95, i32* %93
%96 = load i32, i32* %3
%97 = getelementptr i32, i32* %2, i32 %96
%98 = load i32, i32* %97
%99 = add i32 1, %98
store i32 %99, i32* %97
%100 = load i32, i32* %3
%101 = add i32 1, %100
store i32 %101, i32* %3
%102 = load i32, i32* %3
%103 = getelementptr i32, i32* %2, i32 %102
%104 = load i32, i32* %103
%105 = add i32 1, %104
store i32 %105, i32* %103
%106 = load i32, i32* %3
%107 = sub i32 %106, 1
store i32 %107, i32* %3
%108 = load i32, i32* %3
%109 = sub i32 %108, 1
store i32 %109, i32* %3
%110 = load i32, i32* %3
%111 = sub i32 %110, 1
store i32 %111, i32* %3
%112 = load i32, i32* %3
%113 = sub i32 %112, 1
store i32 %113, i32* %3
%114 = load i32, i32* %3
%115 = getelementptr i32, i32* %2, i32 %114
%116 = load i32, i32* %115
%117 = sub i32 %116, 1
store i32 %117, i32* %115
br label %while.begin_1
while.end_0: ; preds = %while.begin_1
%118 = load i32, i32* %3
%119 = add i32 1, %118
store i32 %119, i32* %3
%120 = load i32, i32* %3
%121 = getelementptr i32, i32* %2, i32 %120
%122 = load i32, i32* %121
%123 = add i32 1, %122
store i32 %123, i32* %121
%124 = load i32, i32* %3
%125 = add i32 1, %124
store i32 %125, i32* %3
%126 = load i32, i32* %3
%127 = getelementptr i32, i32* %2, i32 %126
%128 = load i32, i32* %127
%129 = add i32 1, %128
store i32 %129, i32* %127
%130 = load i32, i32* %3
%131 = add i32 1, %130
store i32 %131, i32* %3
%132 = load i32, i32* %3
%133 = getelementptr i32, i32* %2, i32 %132
%134 = load i32, i32* %133
%135 = sub i32 %134, 1
store i32 %135, i32* %133
%136 = load i32, i32* %3
%137 = add i32 1, %136
store i32 %137, i32* %3
%138 = load i32, i32* %3
%139 = add i32 1, %138
store i32 %139, i32* %3
%140 = load i32, i32* %3
%141 = getelementptr i32, i32* %2, i32 %140
%142 = load i32, i32* %141
%143 = add i32 1, %142
store i32 %143, i32* %141
br label %while.begin_2
while.begin_2: ; preds = %while.body_2, %while.end_0
%144 = load i32, i32* %3
%145 = getelementptr i32, i32* %2, i32 %144
%146 = load i32, i32* %145
%147 = icmp ne i32 %146, 0
br i1 %147, label %while.body_2, label %while.end_1
while.body_2: ; preds = %while.begin_2
%148 = load i32, i32* %3
%149 = sub i32 %148, 1
store i32 %149, i32* %3
br label %while.begin_2
while.end_1: ; preds = %while.begin_2
%150 = load i32, i32* %3
%151 = sub i32 %150, 1
store i32 %151, i32* %3
%152 = load i32, i32* %3
%153 = getelementptr i32, i32* %2, i32 %152
%154 = load i32, i32* %153
%155 = sub i32 %154, 1
store i32 %155, i32* %153
br label %while.begin_0
while.end_2: ; preds = %while.begin_0
%156 = load i32, i32* %3
%157 = add i32 1, %156
store i32 %157, i32* %3
%158 = load i32, i32* %3
%159 = add i32 1, %158
store i32 %159, i32* %3
%160 = load i32, i32* %3
%161 = getelementptr i32, i32* %2, i32 %160
%162 = load i32, i32* %161
%163 = call i32 @putchar(i32 %162)
%164 = load i32, i32* %3
%165 = add i32 1, %164
store i32 %165, i32* %3
%166 = load i32, i32* %3
%167 = getelementptr i32, i32* %2, i32 %166
%168 = load i32, i32* %167
%169 = sub i32 %168, 1
store i32 %169, i32* %167
%170 = load i32, i32* %3
%171 = getelementptr i32, i32* %2, i32 %170
%172 = load i32, i32* %171
%173 = sub i32 %172, 1
store i32 %173, i32* %171
%174 = load i32, i32* %3
%175 = getelementptr i32, i32* %2, i32 %174
%176 = load i32, i32* %175
%177 = sub i32 %176, 1
store i32 %177, i32* %175
%178 = load i32, i32* %3
%179 = getelementptr i32, i32* %2, i32 %178
%180 = load i32, i32* %179
%181 = call i32 @putchar(i32 %180)
%182 = load i32, i32* %3
%183 = getelementptr i32, i32* %2, i32 %182
%184 = load i32, i32* %183
%185 = add i32 1, %184
store i32 %185, i32* %183
%186 = load i32, i32* %3
%187 = getelementptr i32, i32* %2, i32 %186
%188 = load i32, i32* %187
%189 = add i32 1, %188
store i32 %189, i32* %187
%190 = load i32, i32* %3
%191 = getelementptr i32, i32* %2, i32 %190
%192 = load i32, i32* %191
%193 = add i32 1, %192
store i32 %193, i32* %191
%194 = load i32, i32* %3
%195 = getelementptr i32, i32* %2, i32 %194
%196 = load i32, i32* %195
%197 = add i32 1, %196
store i32 %197, i32* %195
%198 = load i32, i32* %3
%199 = getelementptr i32, i32* %2, i32 %198
%200 = load i32, i32* %199
%201 = add i32 1, %200
store i32 %201, i32* %199
%202 = load i32, i32* %3
%203 = getelementptr i32, i32* %2, i32 %202
%204 = load i32, i32* %203
%205 = add i32 1, %204
store i32 %205, i32* %203
%206 = load i32, i32* %3
%207 = getelementptr i32, i32* %2, i32 %206
%208 = load i32, i32* %207
%209 = add i32 1, %208
store i32 %209, i32* %207
%210 = load i32, i32* %3
%211 = getelementptr i32, i32* %2, i32 %210
%212 = load i32, i32* %211
%213 = call i32 @putchar(i32 %212)
%214 = load i32, i32* %3
%215 = getelementptr i32, i32* %2, i32 %214
%216 = load i32, i32* %215
%217 = call i32 @putchar(i32 %216)
%218 = load i32, i32* %3
%219 = getelementptr i32, i32* %2, i32 %218
%220 = load i32, i32* %219
%221 = add i32 1, %220
store i32 %221, i32* %219
%222 = load i32, i32* %3
%223 = getelementptr i32, i32* %2, i32 %222
%224 = load i32, i32* %223
%225 = add i32 1, %224
store i32 %225, i32* %223
%226 = load i32, i32* %3
%227 = getelementptr i32, i32* %2, i32 %226
%228 = load i32, i32* %227
%229 = add i32 1, %228
store i32 %229, i32* %227
%230 = load i32, i32* %3
%231 = getelementptr i32, i32* %2, i32 %230
%232 = load i32, i32* %231
%233 = call i32 @putchar(i32 %232)
%234 = load i32, i32* %3
%235 = add i32 1, %234
store i32 %235, i32* %3
%236 = load i32, i32* %3
%237 = add i32 1, %236
store i32 %237, i32* %3
%238 = load i32, i32* %3
%239 = getelementptr i32, i32* %2, i32 %238
%240 = load i32, i32* %239
%241 = call i32 @putchar(i32 %240)
%242 = load i32, i32* %3
%243 = sub i32 %242, 1
store i32 %243, i32* %3
%244 = load i32, i32* %3
%245 = getelementptr i32, i32* %2, i32 %244
%246 = load i32, i32* %245
%247 = sub i32 %246, 1
store i32 %247, i32* %245
%248 = load i32, i32* %3
%249 = getelementptr i32, i32* %2, i32 %248
%250 = load i32, i32* %249
%251 = call i32 @putchar(i32 %250)
%252 = load i32, i32* %3
%253 = sub i32 %252, 1
store i32 %253, i32* %3
%254 = load i32, i32* %3
%255 = getelementptr i32, i32* %2, i32 %254
%256 = load i32, i32* %255
%257 = call i32 @putchar(i32 %256)
%258 = load i32, i32* %3
%259 = getelementptr i32, i32* %2, i32 %258
%260 = load i32, i32* %259
%261 = add i32 1, %260
store i32 %261, i32* %259
%262 = load i32, i32* %3
%263 = getelementptr i32, i32* %2, i32 %262
%264 = load i32, i32* %263
%265 = add i32 1, %264
store i32 %265, i32* %263
%266 = load i32, i32* %3
%267 = getelementptr i32, i32* %2, i32 %266
%268 = load i32, i32* %267
%269 = add i32 1, %268
store i32 %269, i32* %267
%270 = load i32, i32* %3
%271 = getelementptr i32, i32* %2, i32 %270
%272 = load i32, i32* %271
%273 = call i32 @putchar(i32 %272)
%274 = load i32, i32* %3
%275 = getelementptr i32, i32* %2, i32 %274
%276 = load i32, i32* %275
%277 = sub i32 %276, 1
store i32 %277, i32* %275
%278 = load i32, i32* %3
%279 = getelementptr i32, i32* %2, i32 %278
%280 = load i32, i32* %279
%281 = sub i32 %280, 1
store i32 %281, i32* %279
%282 = load i32, i32* %3
%283 = getelementptr i32, i32* %2, i32 %282
%284 = load i32, i32* %283
%285 = sub i32 %284, 1
store i32 %285, i32* %283
%286 = load i32, i32* %3
%287 = getelementptr i32, i32* %2, i32 %286
%288 = load i32, i32* %287
%289 = sub i32 %288, 1
store i32 %289, i32* %287
%290 = load i32, i32* %3
%291 = getelementptr i32, i32* %2, i32 %290
%292 = load i32, i32* %291
%293 = sub i32 %292, 1
store i32 %293, i32* %291
%294 = load i32, i32* %3
%295 = getelementptr i32, i32* %2, i32 %294
%296 = load i32, i32* %295
%297 = sub i32 %296, 1
store i32 %297, i32* %295
%298 = load i32, i32* %3
%299 = getelementptr i32, i32* %2, i32 %298
%300 = load i32, i32* %299
%301 = call i32 @putchar(i32 %300)
%302 = load i32, i32* %3
%303 = getelementptr i32, i32* %2, i32 %302
%304 = load i32, i32* %303
%305 = sub i32 %304, 1
store i32 %305, i32* %303
%306 = load i32, i32* %3
%307 = getelementptr i32, i32* %2, i32 %306
%308 = load i32, i32* %307
%309 = sub i32 %308, 1
store i32 %309, i32* %307
%310 = load i32, i32* %3
%311 = getelementptr i32, i32* %2, i32 %310
%312 = load i32, i32* %311
%313 = sub i32 %312, 1
store i32 %313, i32* %311
%314 = load i32, i32* %3
%315 = getelementptr i32, i32* %2, i32 %314
%316 = load i32, i32* %315
%317 = sub i32 %316, 1
store i32 %317, i32* %315
%318 = load i32, i32* %3
%319 = getelementptr i32, i32* %2, i32 %318
%320 = load i32, i32* %319
%321 = sub i32 %320, 1
store i32 %321, i32* %319
%322 = load i32, i32* %3
%323 = getelementptr i32, i32* %2, i32 %322
%324 = load i32, i32* %323
%325 = sub i32 %324, 1
store i32 %325, i32* %323
%326 = load i32, i32* %3
%327 = getelementptr i32, i32* %2, i32 %326
%328 = load i32, i32* %327
%329 = sub i32 %328, 1
store i32 %329, i32* %327
%330 = load i32, i32* %3
%331 = getelementptr i32, i32* %2, i32 %330
%332 = load i32, i32* %331
%333 = sub i32 %332, 1
store i32 %333, i32* %331
%334 = load i32, i32* %3
%335 = getelementptr i32, i32* %2, i32 %334
%336 = load i32, i32* %335
%337 = call i32 @putchar(i32 %336)
%338 = load i32, i32* %3
%339 = add i32 1, %338
store i32 %339, i32* %3
%340 = load i32, i32* %3
%341 = add i32 1, %340
store i32 %341, i32* %3
%342 = load i32, i32* %3
%343 = getelementptr i32, i32* %2, i32 %342
%344 = load i32, i32* %343
%345 = add i32 1, %344
store i32 %345, i32* %343
%346 = load i32, i32* %3
%347 = getelementptr i32, i32* %2, i32 %346
%348 = load i32, i32* %347
%349 = call i32 @putchar(i32 %348)
%350 = load i32, i32* %3
%351 = add i32 1, %350
store i32 %351, i32* %3
%352 = load i32, i32* %3
%353 = getelementptr i32, i32* %2, i32 %352
%354 = load i32, i32* %353
%355 = add i32 1, %354
store i32 %355, i32* %353
%356 = load i32, i32* %3
%357 = getelementptr i32, i32* %2, i32 %356
%358 = load i32, i32* %357
%359 = add i32 1, %358
store i32 %359, i32* %357
%360 = load i32, i32* %3
%361 = getelementptr i32, i32* %2, i32 %360
%362 = load i32, i32* %361
%363 = call i32 @putchar(i32 %362)
call void @free(i8* %1)
ret i32 0
}
@luc-tielen
Copy link
Author

This is the raw LLVM IR that the BF compiler generates.
Here's also 2 images what that looks like in a control flow graph before and after optimizing with LLVM (You get all this for free using LLVM!).

Before:

After:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment