From 025cff949410bea278dc0d6a4959033521cbf844 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Tue, 7 May 2024 07:22:49 +0800 Subject: [PATCH] llgo/x/llama2 --- .gitignore | 1 + .gitmodules | 3 + _demo/llama2-c/run.go | 51 + _demo/llama2-c/tokenizer.bin | Bin 0 -> 433869 bytes x/llama2/.gitignore | 26 + x/llama2/README.md | 4 + x/llama2/llama2.c | 1 + x/llama2/llama2.go | 271 +++ x/llama2/llama2/run.c | 2 + x/llama2/llgo.cfg | 3 + x/llama2/llgo_autogen.ll | 3955 ++++++++++++++++++++++++++++++++++ 11 files changed, 4317 insertions(+) create mode 100644 .gitmodules create mode 100644 _demo/llama2-c/run.go create mode 100644 _demo/llama2-c/tokenizer.bin create mode 100644 x/llama2/.gitignore create mode 100644 x/llama2/README.md create mode 160000 x/llama2/llama2.c create mode 100644 x/llama2/llama2.go create mode 100644 x/llama2/llama2/run.c create mode 100644 x/llama2/llgo.cfg create mode 100644 x/llama2/llgo_autogen.ll diff --git a/.gitignore b/.gitignore index 985daa48..1e06ac59 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ *.so *.dylib +stories*.bin .DS_Store err.log diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..0f3ceb95 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "x/llama2/llama2.c"] + path = x/llama2/llama2.c + url = https://github.com/karpathy/llama2.c.git diff --git a/_demo/llama2-c/run.go b/_demo/llama2-c/run.go new file mode 100644 index 00000000..3ad02c8f --- /dev/null +++ b/_demo/llama2-c/run.go @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package main + +import ( + "github.com/goplus/llgo/c" + "github.com/goplus/llgo/x/llama2" +) + +func main() { + var prompt *c.Char = c.Str("Once upon a time") + var checkpointPath *c.Char = c.Str("stories15M.bin") + var tokenizerPath *c.Char = c.Str("tokenizer.bin") + var temperature, topp llama2.Float = 1.0, 0.9 + var steps c.Int = 256 + var rngSeed uint64 = uint64(llama2.Time(nil)) + + // build the Transformer via the model .bin file + var transformer llama2.Transformer + llama2.BuildTransformer(&transformer, checkpointPath) + + // build the Tokenizer via the tokenizer .bin file + var tokenizer llama2.Tokenizer + llama2.BuildTokenizer(&tokenizer, tokenizerPath, transformer.Config.VocabSize) + + // build the Sampler + var sampler llama2.Sampler + llama2.BuildSampler(&sampler, transformer.Config.VocabSize, temperature, topp, rngSeed) + + // run! + llama2.Generate(&transformer, &tokenizer, &sampler, prompt, steps) + + // memory and file handles cleanup + llama2.FreeSampler(&sampler) + llama2.FreeTokenizer(&tokenizer) + llama2.FreeTransformer(&transformer) +} diff --git a/_demo/llama2-c/tokenizer.bin b/_demo/llama2-c/tokenizer.bin new file mode 100644 index 0000000000000000000000000000000000000000..e6c1b23ec0c18ebfd7162ef838a77d559b7e3316 GIT binary patch literal 433869 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 DR0W7x literal 0 HcmV?d00001 diff --git a/x/llama2/.gitignore b/x/llama2/.gitignore new file mode 100644 index 00000000..1eab1ce5 --- /dev/null +++ b/x/llama2/.gitignore @@ -0,0 +1,26 @@ +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +stories*.bin +.DS_Store +err.log + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out +*.swp + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work* diff --git a/x/llama2/README.md b/x/llama2/README.md new file mode 100644 index 00000000..b1846701 --- /dev/null +++ b/x/llama2/README.md @@ -0,0 +1,4 @@ +llama2 - LLGo support for Inference Llama 2 +===== + +TODO diff --git a/x/llama2/llama2.c b/x/llama2/llama2.c new file mode 160000 index 00000000..b3c4b6c3 --- /dev/null +++ b/x/llama2/llama2.c @@ -0,0 +1 @@ +Subproject commit b3c4b6c3c4bbff42e5211293280307019368ccb5 diff --git a/x/llama2/llama2.go b/x/llama2/llama2.go new file mode 100644 index 00000000..60af7dd4 --- /dev/null +++ b/x/llama2/llama2.go @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package llama2 + +import ( + _ "unsafe" + + "github.com/goplus/llgo/c" +) + +const ( + LLGoPackage = "link" +) + +type ( + Char = int8 + Int = c.Int + Uint = c.Uint + Float = float32 +) + +//go:linkname Time C.time +func Time(*int32) int32 + +// ----------------------------------------------------------------------------- + +/* + +typedef struct { + char *str; + int id; +} TokenIndex; + +typedef struct { + char** vocab; + float* vocab_scores; + TokenIndex *sorted_vocab; + int vocab_size; + unsigned int max_token_length; + unsigned char byte_pieces[512]; // stores all single-byte strings +} Tokenizer; + +void build_tokenizer(Tokenizer* t, char* tokenizer_path, int vocab_size); +void free_tokenizer(Tokenizer* t); + +typedef struct { + int dim; // transformer dimension + int hidden_dim; // for ffn layers + int n_layers; // number of layers + int n_heads; // number of query heads + int n_kv_heads; // number of key/value heads (can be < query heads because of multiquery) + int vocab_size; // vocabulary size, usually 256 (byte-level) + int seq_len; // max sequence length +} Config; + +typedef struct { + // token embedding table + float* token_embedding_table; // (vocab_size, dim) + // weights for rmsnorms + float* rms_att_weight; // (layer, dim) rmsnorm weights + float* rms_ffn_weight; // (layer, dim) + // weights for matmuls. note dim == n_heads * head_size + float* wq; // (layer, dim, n_heads * head_size) + float* wk; // (layer, dim, n_kv_heads * head_size) + float* wv; // (layer, dim, n_kv_heads * head_size) + float* wo; // (layer, n_heads * head_size, dim) + // weights for ffn + float* w1; // (layer, hidden_dim, dim) + float* w2; // (layer, dim, hidden_dim) + float* w3; // (layer, hidden_dim, dim) + // final rmsnorm + float* rms_final_weight; // (dim,) + // (optional) classifier weights for the logits, on the last layer + float* wcls; +} TransformerWeights; + +typedef struct { + // current wave of activations + float *x; // activation at current time stamp (dim,) + float *xb; // same, but inside a residual branch (dim,) + float *xb2; // an additional buffer just for convenience (dim,) + float *hb; // buffer for hidden dimension in the ffn (hidden_dim,) + float *hb2; // buffer for hidden dimension in the ffn (hidden_dim,) + float *q; // query (dim,) + float *k; // key (dim,) + float *v; // value (dim,) + float *att; // buffer for scores/attention values (n_heads, seq_len) + float *logits; // output logits + // kv cache + float* key_cache; // (layer, seq_len, dim) + float* value_cache; // (layer, seq_len, dim) +} RunState; + +typedef struct { + Config config; // the hyperparameters of the architecture (the blueprint) + TransformerWeights weights; // the weights of the model + RunState state; // buffers for the "wave" of activations in the forward pass + // some more state needed to properly clean up the memory mapping (sigh) + int fd; // file descriptor for memory mapping + float* data; // memory mapped data pointer + ssize_t file_size; // size of the checkpoint file in bytes +} Transformer; + +void build_transformer(Transformer *t, char* checkpoint_path); +void free_transformer(Transformer* t); + +typedef struct { + float prob; + int index; +} ProbIndex; // struct used when sorting probabilities during top-p sampling + +typedef struct { + int vocab_size; + ProbIndex* probindex; // buffer used in top-p sampling + float temperature; + float topp; + unsigned long long rng_state; +} Sampler; + +void build_sampler(Sampler* sampler, int vocab_size, float temperature, float topp, unsigned long long rng_seed); +void free_sampler(Sampler* sampler); + +void generate(Transformer *transformer, Tokenizer *tokenizer, Sampler *sampler, char *prompt, int steps); + +*/ + +// ----------------------------------------------------------------------------- + +// llgo:type C +type TokenIndex struct { + Str *Char + Id Int +} + +// llgo:type C +type Tokenizer struct { + Vocab **Char + VocabScores *Float + SortedVocab *TokenIndex + VocabSize Int + MaxTokenLength Uint + BytePieces [512]uint8 // stores all single-byte strings +} + +//go:linkname BuildTokenizer C.build_tokenizer +func BuildTokenizer(t *Tokenizer, tokenizerPath *Char, vocabSize Int) + +//go:linkname FreeTokenizer C.free_tokenizer +func FreeTokenizer(t *Tokenizer) + +// ----------------------------------------------------------------------------- + +// llgo:type C +type Config struct { + Dim Int // transformer dimension + HiddenDim Int // for ffn layers + NLayers Int // number of layers + NHeads Int // number of query heads + NKVHeads Int // number of key/value heads (can be < query heads because of multiquery) + VocabSize Int // vocabulary size, usually 256 (byte-level) + SeqLen Int // max sequence length +} + +// llgo:type C +type TransformerWeights struct { + // token embedding table + TokenEmbeddingTable *Float // (vocab_size, dim) + // weights for rmsnorms + RmsAttWeight *Float // (layer, dim) rmsnorm weights + RmsFfnWeight *Float // (layer, dim) + // weights for matmuls. note dim == n_heads * head_size + Wq *Float // (layer, dim, n_heads * head_size) + Wk *Float // (layer, dim, n_kv_heads * head_size) + Wv *Float // (layer, dim, n_kv_heads * head_size) + Wo *Float // (layer, n_heads * head_size, dim) + // weights for ffn + W1 *Float // (layer, hidden_dim, dim) + W2 *Float // (layer, dim, hidden_dim) + W3 *Float // (layer, hidden_dim, dim) + // final rmsnorm + RmsFinalWeight *Float // (dim,) + // (optional) classifier weights for the logits, on the last layer + Wcls *Float +} + +// llgo:type C +type RunState struct { + // current wave of activations + X *Float // activation at current time stamp (dim,) + Xb *Float // same, but inside a residual branch (dim,) + Xb2 *Float // an additional buffer just for convenience (dim,) + Hb *Float // buffer for hidden dimension in the ffn (hidden_dim,) + Hb2 *Float // buffer for hidden dimension in the ffn (hidden_dim,) + Q *Float // query (dim,) + K *Float // key (dim,) + V *Float // value (dim,) + Att *Float // buffer for scores/attention values (n_heads, seq_len) + Logits *Float // output logits + // kv cache + KeyCache *Float // (layer, seq_len, dim) + ValueCache *Float // (layer, seq_len, dim) +} + +// llgo:type C +type Transformer struct { + Config Config // the hyperparameters of the architecture (the blueprint) + Weights TransformerWeights // the weights of the model + State RunState // buffers for the "wave" of activations in the forward pass + + // some more state needed to properly clean up the memory mapping (sigh) + Fd Int // file descriptor for memory mapping + Data *Float // memory mapped data pointer + FileSize uintptr // size of the checkpoint file in bytes +} + +//go:linkname BuildTransformer C.build_transformer +func BuildTransformer(t *Transformer, checkpoint_path *Char) + +//go:linkname FreeTransformer C.free_transformer +func FreeTransformer(t *Transformer) + +// ----------------------------------------------------------------------------- + +// llgo:type C +type ProbIndex struct { + Prob Float + Index Int +} // struct used when sorting probabilities during top-p sampling + +// llgo:type C +type Sampler struct { + VocabSize Int + Probindex *ProbIndex // buffer used in top-p sampling + Temperature Float + Topp Float + RngState uint64 +} + +//go:linkname BuildSampler C.build_sampler +func BuildSampler(sampler *Sampler, vocabSize Int, temperature Float, topp Float, rngSeed uint64) + +//go:linkname FreeSampler C.free_sampler +func FreeSampler(sampler *Sampler) + +// ----------------------------------------------------------------------------- + +//go:linkname Generate C.generate +func Generate( + transformer *Transformer, tokenizer *Tokenizer, sampler *Sampler, + prompt *Char, steps Int) + +//go:linkname Chat C.chat +func Chat( + transformer *Transformer, tokenizer *Tokenizer, sampler *Sampler, + cliUserPrompt *Char, cliSystemPrompt *Char, steps Int) + +// ----------------------------------------------------------------------------- diff --git a/x/llama2/llama2/run.c b/x/llama2/llama2/run.c new file mode 100644 index 00000000..d37d4607 --- /dev/null +++ b/x/llama2/llama2/run.c @@ -0,0 +1,2 @@ +#define TESTING +#include "../llama2.c/run.c" diff --git a/x/llama2/llgo.cfg b/x/llama2/llgo.cfg new file mode 100644 index 00000000..c113f9ea --- /dev/null +++ b/x/llama2/llgo.cfg @@ -0,0 +1,3 @@ +{ + "cl": "clang -emit-llvm -S -o llgo_autogen.ll -c llama2/run.c" +} diff --git a/x/llama2/llgo_autogen.ll b/x/llama2/llgo_autogen.ll new file mode 100644 index 00000000..84cf5be9 --- /dev/null +++ b/x/llama2/llgo_autogen.ll @@ -0,0 +1,3955 @@ +; ModuleID = 'llama2/run.c' +source_filename = "llama2/run.c" +target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" +target triple = "arm64-apple-macosx13.0.0" + +%struct.__sFILE = type { i8*, i32, i32, i16, i16, %struct.__sbuf, i32, i8*, i32 (i8*)*, i32 (i8*, i8*, i32)*, i64 (i8*, i64, i32)*, i32 (i8*, i8*, i32)*, %struct.__sbuf, %struct.__sFILEX*, i32, [3 x i8], [1 x i8], %struct.__sbuf, i32, i64 } +%struct.__sFILEX = type opaque +%struct.__sbuf = type { i8*, i32 } +%struct.RunState = type { float*, float*, float*, float*, float*, float*, float*, float*, float*, float*, float*, float* } +%struct.Config = type { i32, i32, i32, i32, i32, i32, i32 } +%struct.TransformerWeights = type { float*, float*, float*, float*, float*, float*, float*, float*, float*, float*, float*, float* } +%struct.Transformer = type { %struct.Config, %struct.TransformerWeights, %struct.RunState, i32, float*, i64 } +%struct.TokenIndex = type { i8*, i32 } +%struct.Tokenizer = type { i8**, float*, %struct.TokenIndex*, i32, i32, [512 x i8] } +%struct.ProbIndex = type { float, i32 } +%struct.Sampler = type { i32, %struct.ProbIndex*, float, float, i64 } +%struct.timespec = type { i64, i64 } + +@__stderrp = external global %struct.__sFILE*, align 8 +@.str = private unnamed_addr constant [16 x i8] c"malloc failed!\0A\00", align 1 +@.str.1 = private unnamed_addr constant [3 x i8] c"rb\00", align 1 +@.str.2 = private unnamed_addr constant [23 x i8] c"Couldn't open file %s\0A\00", align 1 +@.str.3 = private unnamed_addr constant [14 x i8] c"open failed!\0A\00", align 1 +@.str.4 = private unnamed_addr constant [14 x i8] c"mmap failed!\0A\00", align 1 +@.str.5 = private unnamed_addr constant [18 x i8] c"couldn't load %s\0A\00", align 1 +@.str.6 = private unnamed_addr constant [13 x i8] c"failed read\0A\00", align 1 +@.str.7 = private unnamed_addr constant [11 x i8] c"<0x%02hhX>\00", align 1 +@.str.8 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 +@.str.9 = private unnamed_addr constant [25 x i8] c"cannot encode NULL text\0A\00", align 1 +@.str.10 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@.str.11 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1 +@.str.12 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@.str.13 = private unnamed_addr constant [54 x i8] c"something is wrong, expected at least 1 prompt token\0A\00", align 1 +@__stdoutp = external global %struct.__sFILE*, align 8 +@.str.14 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@.str.15 = private unnamed_addr constant [20 x i8] c"achieved tok/s: %f\0A\00", align 1 +@__stdinp = external global %struct.__sFILE*, align 8 +@.str.16 = private unnamed_addr constant [33 x i8] c"Enter system prompt (optional): \00", align 1 +@.str.17 = private unnamed_addr constant [7 x i8] c"User: \00", align 1 +@__const.chat.system_template = private unnamed_addr constant [39 x i8] c"[INST] <>\0A%s\0A<>\0A\0A%s [/INST]\00", align 1 +@__const.chat.user_template = private unnamed_addr constant [18 x i8] c"[INST] %s [/INST]\00", align 1 +@.str.18 = private unnamed_addr constant [12 x i8] c"Assistant: \00", align 1 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @malloc_run_state(%struct.RunState* noundef %0, %struct.Config* noundef %1) #0 { + %3 = alloca %struct.RunState*, align 8 + %4 = alloca %struct.Config*, align 8 + %5 = alloca i32, align 4 + store %struct.RunState* %0, %struct.RunState** %3, align 8 + store %struct.Config* %1, %struct.Config** %4, align 8 + %6 = load %struct.Config*, %struct.Config** %4, align 8 + %7 = getelementptr inbounds %struct.Config, %struct.Config* %6, i32 0, i32 0 + %8 = load i32, i32* %7, align 4 + %9 = load %struct.Config*, %struct.Config** %4, align 8 + %10 = getelementptr inbounds %struct.Config, %struct.Config* %9, i32 0, i32 4 + %11 = load i32, i32* %10, align 4 + %12 = mul nsw i32 %8, %11 + %13 = load %struct.Config*, %struct.Config** %4, align 8 + %14 = getelementptr inbounds %struct.Config, %struct.Config* %13, i32 0, i32 3 + %15 = load i32, i32* %14, align 4 + %16 = sdiv i32 %12, %15 + store i32 %16, i32* %5, align 4 + %17 = load %struct.Config*, %struct.Config** %4, align 8 + %18 = getelementptr inbounds %struct.Config, %struct.Config* %17, i32 0, i32 0 + %19 = load i32, i32* %18, align 4 + %20 = sext i32 %19 to i64 + %21 = call i8* @calloc(i64 noundef %20, i64 noundef 4) #10 + %22 = bitcast i8* %21 to float* + %23 = load %struct.RunState*, %struct.RunState** %3, align 8 + %24 = getelementptr inbounds %struct.RunState, %struct.RunState* %23, i32 0, i32 0 + store float* %22, float** %24, align 8 + %25 = load %struct.Config*, %struct.Config** %4, align 8 + %26 = getelementptr inbounds %struct.Config, %struct.Config* %25, i32 0, i32 0 + %27 = load i32, i32* %26, align 4 + %28 = sext i32 %27 to i64 + %29 = call i8* @calloc(i64 noundef %28, i64 noundef 4) #10 + %30 = bitcast i8* %29 to float* + %31 = load %struct.RunState*, %struct.RunState** %3, align 8 + %32 = getelementptr inbounds %struct.RunState, %struct.RunState* %31, i32 0, i32 1 + store float* %30, float** %32, align 8 + %33 = load %struct.Config*, %struct.Config** %4, align 8 + %34 = getelementptr inbounds %struct.Config, %struct.Config* %33, i32 0, i32 0 + %35 = load i32, i32* %34, align 4 + %36 = sext i32 %35 to i64 + %37 = call i8* @calloc(i64 noundef %36, i64 noundef 4) #10 + %38 = bitcast i8* %37 to float* + %39 = load %struct.RunState*, %struct.RunState** %3, align 8 + %40 = getelementptr inbounds %struct.RunState, %struct.RunState* %39, i32 0, i32 2 + store float* %38, float** %40, align 8 + %41 = load %struct.Config*, %struct.Config** %4, align 8 + %42 = getelementptr inbounds %struct.Config, %struct.Config* %41, i32 0, i32 1 + %43 = load i32, i32* %42, align 4 + %44 = sext i32 %43 to i64 + %45 = call i8* @calloc(i64 noundef %44, i64 noundef 4) #10 + %46 = bitcast i8* %45 to float* + %47 = load %struct.RunState*, %struct.RunState** %3, align 8 + %48 = getelementptr inbounds %struct.RunState, %struct.RunState* %47, i32 0, i32 3 + store float* %46, float** %48, align 8 + %49 = load %struct.Config*, %struct.Config** %4, align 8 + %50 = getelementptr inbounds %struct.Config, %struct.Config* %49, i32 0, i32 1 + %51 = load i32, i32* %50, align 4 + %52 = sext i32 %51 to i64 + %53 = call i8* @calloc(i64 noundef %52, i64 noundef 4) #10 + %54 = bitcast i8* %53 to float* + %55 = load %struct.RunState*, %struct.RunState** %3, align 8 + %56 = getelementptr inbounds %struct.RunState, %struct.RunState* %55, i32 0, i32 4 + store float* %54, float** %56, align 8 + %57 = load %struct.Config*, %struct.Config** %4, align 8 + %58 = getelementptr inbounds %struct.Config, %struct.Config* %57, i32 0, i32 0 + %59 = load i32, i32* %58, align 4 + %60 = sext i32 %59 to i64 + %61 = call i8* @calloc(i64 noundef %60, i64 noundef 4) #10 + %62 = bitcast i8* %61 to float* + %63 = load %struct.RunState*, %struct.RunState** %3, align 8 + %64 = getelementptr inbounds %struct.RunState, %struct.RunState* %63, i32 0, i32 5 + store float* %62, float** %64, align 8 + %65 = load %struct.Config*, %struct.Config** %4, align 8 + %66 = getelementptr inbounds %struct.Config, %struct.Config* %65, i32 0, i32 2 + %67 = load i32, i32* %66, align 4 + %68 = load %struct.Config*, %struct.Config** %4, align 8 + %69 = getelementptr inbounds %struct.Config, %struct.Config* %68, i32 0, i32 6 + %70 = load i32, i32* %69, align 4 + %71 = mul nsw i32 %67, %70 + %72 = load i32, i32* %5, align 4 + %73 = mul nsw i32 %71, %72 + %74 = sext i32 %73 to i64 + %75 = call i8* @calloc(i64 noundef %74, i64 noundef 4) #10 + %76 = bitcast i8* %75 to float* + %77 = load %struct.RunState*, %struct.RunState** %3, align 8 + %78 = getelementptr inbounds %struct.RunState, %struct.RunState* %77, i32 0, i32 10 + store float* %76, float** %78, align 8 + %79 = load %struct.Config*, %struct.Config** %4, align 8 + %80 = getelementptr inbounds %struct.Config, %struct.Config* %79, i32 0, i32 2 + %81 = load i32, i32* %80, align 4 + %82 = load %struct.Config*, %struct.Config** %4, align 8 + %83 = getelementptr inbounds %struct.Config, %struct.Config* %82, i32 0, i32 6 + %84 = load i32, i32* %83, align 4 + %85 = mul nsw i32 %81, %84 + %86 = load i32, i32* %5, align 4 + %87 = mul nsw i32 %85, %86 + %88 = sext i32 %87 to i64 + %89 = call i8* @calloc(i64 noundef %88, i64 noundef 4) #10 + %90 = bitcast i8* %89 to float* + %91 = load %struct.RunState*, %struct.RunState** %3, align 8 + %92 = getelementptr inbounds %struct.RunState, %struct.RunState* %91, i32 0, i32 11 + store float* %90, float** %92, align 8 + %93 = load %struct.Config*, %struct.Config** %4, align 8 + %94 = getelementptr inbounds %struct.Config, %struct.Config* %93, i32 0, i32 3 + %95 = load i32, i32* %94, align 4 + %96 = load %struct.Config*, %struct.Config** %4, align 8 + %97 = getelementptr inbounds %struct.Config, %struct.Config* %96, i32 0, i32 6 + %98 = load i32, i32* %97, align 4 + %99 = mul nsw i32 %95, %98 + %100 = sext i32 %99 to i64 + %101 = call i8* @calloc(i64 noundef %100, i64 noundef 4) #10 + %102 = bitcast i8* %101 to float* + %103 = load %struct.RunState*, %struct.RunState** %3, align 8 + %104 = getelementptr inbounds %struct.RunState, %struct.RunState* %103, i32 0, i32 8 + store float* %102, float** %104, align 8 + %105 = load %struct.Config*, %struct.Config** %4, align 8 + %106 = getelementptr inbounds %struct.Config, %struct.Config* %105, i32 0, i32 5 + %107 = load i32, i32* %106, align 4 + %108 = sext i32 %107 to i64 + %109 = call i8* @calloc(i64 noundef %108, i64 noundef 4) #10 + %110 = bitcast i8* %109 to float* + %111 = load %struct.RunState*, %struct.RunState** %3, align 8 + %112 = getelementptr inbounds %struct.RunState, %struct.RunState* %111, i32 0, i32 9 + store float* %110, float** %112, align 8 + %113 = load %struct.RunState*, %struct.RunState** %3, align 8 + %114 = getelementptr inbounds %struct.RunState, %struct.RunState* %113, i32 0, i32 0 + %115 = load float*, float** %114, align 8 + %116 = icmp ne float* %115, null + br i1 %116, label %117, label %162 + +117: ; preds = %2 + %118 = load %struct.RunState*, %struct.RunState** %3, align 8 + %119 = getelementptr inbounds %struct.RunState, %struct.RunState* %118, i32 0, i32 1 + %120 = load float*, float** %119, align 8 + %121 = icmp ne float* %120, null + br i1 %121, label %122, label %162 + +122: ; preds = %117 + %123 = load %struct.RunState*, %struct.RunState** %3, align 8 + %124 = getelementptr inbounds %struct.RunState, %struct.RunState* %123, i32 0, i32 2 + %125 = load float*, float** %124, align 8 + %126 = icmp ne float* %125, null + br i1 %126, label %127, label %162 + +127: ; preds = %122 + %128 = load %struct.RunState*, %struct.RunState** %3, align 8 + %129 = getelementptr inbounds %struct.RunState, %struct.RunState* %128, i32 0, i32 3 + %130 = load float*, float** %129, align 8 + %131 = icmp ne float* %130, null + br i1 %131, label %132, label %162 + +132: ; preds = %127 + %133 = load %struct.RunState*, %struct.RunState** %3, align 8 + %134 = getelementptr inbounds %struct.RunState, %struct.RunState* %133, i32 0, i32 4 + %135 = load float*, float** %134, align 8 + %136 = icmp ne float* %135, null + br i1 %136, label %137, label %162 + +137: ; preds = %132 + %138 = load %struct.RunState*, %struct.RunState** %3, align 8 + %139 = getelementptr inbounds %struct.RunState, %struct.RunState* %138, i32 0, i32 5 + %140 = load float*, float** %139, align 8 + %141 = icmp ne float* %140, null + br i1 %141, label %142, label %162 + +142: ; preds = %137 + %143 = load %struct.RunState*, %struct.RunState** %3, align 8 + %144 = getelementptr inbounds %struct.RunState, %struct.RunState* %143, i32 0, i32 10 + %145 = load float*, float** %144, align 8 + %146 = icmp ne float* %145, null + br i1 %146, label %147, label %162 + +147: ; preds = %142 + %148 = load %struct.RunState*, %struct.RunState** %3, align 8 + %149 = getelementptr inbounds %struct.RunState, %struct.RunState* %148, i32 0, i32 11 + %150 = load float*, float** %149, align 8 + %151 = icmp ne float* %150, null + br i1 %151, label %152, label %162 + +152: ; preds = %147 + %153 = load %struct.RunState*, %struct.RunState** %3, align 8 + %154 = getelementptr inbounds %struct.RunState, %struct.RunState* %153, i32 0, i32 8 + %155 = load float*, float** %154, align 8 + %156 = icmp ne float* %155, null + br i1 %156, label %157, label %162 + +157: ; preds = %152 + %158 = load %struct.RunState*, %struct.RunState** %3, align 8 + %159 = getelementptr inbounds %struct.RunState, %struct.RunState* %158, i32 0, i32 9 + %160 = load float*, float** %159, align 8 + %161 = icmp ne float* %160, null + br i1 %161, label %165, label %162 + +162: ; preds = %157, %152, %147, %142, %137, %132, %127, %122, %117, %2 + %163 = load %struct.__sFILE*, %struct.__sFILE** @__stderrp, align 8 + %164 = call i32 (%struct.__sFILE*, i8*, ...) @fprintf(%struct.__sFILE* noundef %163, i8* noundef getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0)) + call void @exit(i32 noundef 1) #11 + unreachable + +165: ; preds = %157 + ret void +} + +; Function Attrs: allocsize(0,1) +declare i8* @calloc(i64 noundef, i64 noundef) #1 + +declare i32 @fprintf(%struct.__sFILE* noundef, i8* noundef, ...) #2 + +; Function Attrs: noreturn +declare void @exit(i32 noundef) #3 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @free_run_state(%struct.RunState* noundef %0) #0 { + %2 = alloca %struct.RunState*, align 8 + store %struct.RunState* %0, %struct.RunState** %2, align 8 + %3 = load %struct.RunState*, %struct.RunState** %2, align 8 + %4 = getelementptr inbounds %struct.RunState, %struct.RunState* %3, i32 0, i32 0 + %5 = load float*, float** %4, align 8 + %6 = bitcast float* %5 to i8* + call void @free(i8* noundef %6) + %7 = load %struct.RunState*, %struct.RunState** %2, align 8 + %8 = getelementptr inbounds %struct.RunState, %struct.RunState* %7, i32 0, i32 1 + %9 = load float*, float** %8, align 8 + %10 = bitcast float* %9 to i8* + call void @free(i8* noundef %10) + %11 = load %struct.RunState*, %struct.RunState** %2, align 8 + %12 = getelementptr inbounds %struct.RunState, %struct.RunState* %11, i32 0, i32 2 + %13 = load float*, float** %12, align 8 + %14 = bitcast float* %13 to i8* + call void @free(i8* noundef %14) + %15 = load %struct.RunState*, %struct.RunState** %2, align 8 + %16 = getelementptr inbounds %struct.RunState, %struct.RunState* %15, i32 0, i32 3 + %17 = load float*, float** %16, align 8 + %18 = bitcast float* %17 to i8* + call void @free(i8* noundef %18) + %19 = load %struct.RunState*, %struct.RunState** %2, align 8 + %20 = getelementptr inbounds %struct.RunState, %struct.RunState* %19, i32 0, i32 4 + %21 = load float*, float** %20, align 8 + %22 = bitcast float* %21 to i8* + call void @free(i8* noundef %22) + %23 = load %struct.RunState*, %struct.RunState** %2, align 8 + %24 = getelementptr inbounds %struct.RunState, %struct.RunState* %23, i32 0, i32 5 + %25 = load float*, float** %24, align 8 + %26 = bitcast float* %25 to i8* + call void @free(i8* noundef %26) + %27 = load %struct.RunState*, %struct.RunState** %2, align 8 + %28 = getelementptr inbounds %struct.RunState, %struct.RunState* %27, i32 0, i32 8 + %29 = load float*, float** %28, align 8 + %30 = bitcast float* %29 to i8* + call void @free(i8* noundef %30) + %31 = load %struct.RunState*, %struct.RunState** %2, align 8 + %32 = getelementptr inbounds %struct.RunState, %struct.RunState* %31, i32 0, i32 9 + %33 = load float*, float** %32, align 8 + %34 = bitcast float* %33 to i8* + call void @free(i8* noundef %34) + %35 = load %struct.RunState*, %struct.RunState** %2, align 8 + %36 = getelementptr inbounds %struct.RunState, %struct.RunState* %35, i32 0, i32 10 + %37 = load float*, float** %36, align 8 + %38 = bitcast float* %37 to i8* + call void @free(i8* noundef %38) + %39 = load %struct.RunState*, %struct.RunState** %2, align 8 + %40 = getelementptr inbounds %struct.RunState, %struct.RunState* %39, i32 0, i32 11 + %41 = load float*, float** %40, align 8 + %42 = bitcast float* %41 to i8* + call void @free(i8* noundef %42) + ret void +} + +declare void @free(i8* noundef) #2 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @memory_map_weights(%struct.TransformerWeights* noundef %0, %struct.Config* noundef %1, float* noundef %2, i32 noundef %3) #0 { + %5 = alloca %struct.TransformerWeights*, align 8 + %6 = alloca %struct.Config*, align 8 + %7 = alloca float*, align 8 + %8 = alloca i32, align 4 + %9 = alloca i32, align 4 + %10 = alloca i64, align 8 + store %struct.TransformerWeights* %0, %struct.TransformerWeights** %5, align 8 + store %struct.Config* %1, %struct.Config** %6, align 8 + store float* %2, float** %7, align 8 + store i32 %3, i32* %8, align 4 + %11 = load %struct.Config*, %struct.Config** %6, align 8 + %12 = getelementptr inbounds %struct.Config, %struct.Config* %11, i32 0, i32 0 + %13 = load i32, i32* %12, align 4 + %14 = load %struct.Config*, %struct.Config** %6, align 8 + %15 = getelementptr inbounds %struct.Config, %struct.Config* %14, i32 0, i32 3 + %16 = load i32, i32* %15, align 4 + %17 = sdiv i32 %13, %16 + store i32 %17, i32* %9, align 4 + %18 = load %struct.Config*, %struct.Config** %6, align 8 + %19 = getelementptr inbounds %struct.Config, %struct.Config* %18, i32 0, i32 2 + %20 = load i32, i32* %19, align 4 + %21 = sext i32 %20 to i64 + store i64 %21, i64* %10, align 8 + %22 = load float*, float** %7, align 8 + %23 = load %struct.TransformerWeights*, %struct.TransformerWeights** %5, align 8 + %24 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %23, i32 0, i32 0 + store float* %22, float** %24, align 8 + %25 = load %struct.Config*, %struct.Config** %6, align 8 + %26 = getelementptr inbounds %struct.Config, %struct.Config* %25, i32 0, i32 5 + %27 = load i32, i32* %26, align 4 + %28 = load %struct.Config*, %struct.Config** %6, align 8 + %29 = getelementptr inbounds %struct.Config, %struct.Config* %28, i32 0, i32 0 + %30 = load i32, i32* %29, align 4 + %31 = mul nsw i32 %27, %30 + %32 = load float*, float** %7, align 8 + %33 = sext i32 %31 to i64 + %34 = getelementptr inbounds float, float* %32, i64 %33 + store float* %34, float** %7, align 8 + %35 = load float*, float** %7, align 8 + %36 = load %struct.TransformerWeights*, %struct.TransformerWeights** %5, align 8 + %37 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %36, i32 0, i32 1 + store float* %35, float** %37, align 8 + %38 = load i64, i64* %10, align 8 + %39 = load %struct.Config*, %struct.Config** %6, align 8 + %40 = getelementptr inbounds %struct.Config, %struct.Config* %39, i32 0, i32 0 + %41 = load i32, i32* %40, align 4 + %42 = sext i32 %41 to i64 + %43 = mul i64 %38, %42 + %44 = load float*, float** %7, align 8 + %45 = getelementptr inbounds float, float* %44, i64 %43 + store float* %45, float** %7, align 8 + %46 = load float*, float** %7, align 8 + %47 = load %struct.TransformerWeights*, %struct.TransformerWeights** %5, align 8 + %48 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %47, i32 0, i32 3 + store float* %46, float** %48, align 8 + %49 = load i64, i64* %10, align 8 + %50 = load %struct.Config*, %struct.Config** %6, align 8 + %51 = getelementptr inbounds %struct.Config, %struct.Config* %50, i32 0, i32 0 + %52 = load i32, i32* %51, align 4 + %53 = sext i32 %52 to i64 + %54 = mul i64 %49, %53 + %55 = load %struct.Config*, %struct.Config** %6, align 8 + %56 = getelementptr inbounds %struct.Config, %struct.Config* %55, i32 0, i32 3 + %57 = load i32, i32* %56, align 4 + %58 = load i32, i32* %9, align 4 + %59 = mul nsw i32 %57, %58 + %60 = sext i32 %59 to i64 + %61 = mul i64 %54, %60 + %62 = load float*, float** %7, align 8 + %63 = getelementptr inbounds float, float* %62, i64 %61 + store float* %63, float** %7, align 8 + %64 = load float*, float** %7, align 8 + %65 = load %struct.TransformerWeights*, %struct.TransformerWeights** %5, align 8 + %66 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %65, i32 0, i32 4 + store float* %64, float** %66, align 8 + %67 = load i64, i64* %10, align 8 + %68 = load %struct.Config*, %struct.Config** %6, align 8 + %69 = getelementptr inbounds %struct.Config, %struct.Config* %68, i32 0, i32 0 + %70 = load i32, i32* %69, align 4 + %71 = sext i32 %70 to i64 + %72 = mul i64 %67, %71 + %73 = load %struct.Config*, %struct.Config** %6, align 8 + %74 = getelementptr inbounds %struct.Config, %struct.Config* %73, i32 0, i32 4 + %75 = load i32, i32* %74, align 4 + %76 = load i32, i32* %9, align 4 + %77 = mul nsw i32 %75, %76 + %78 = sext i32 %77 to i64 + %79 = mul i64 %72, %78 + %80 = load float*, float** %7, align 8 + %81 = getelementptr inbounds float, float* %80, i64 %79 + store float* %81, float** %7, align 8 + %82 = load float*, float** %7, align 8 + %83 = load %struct.TransformerWeights*, %struct.TransformerWeights** %5, align 8 + %84 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %83, i32 0, i32 5 + store float* %82, float** %84, align 8 + %85 = load i64, i64* %10, align 8 + %86 = load %struct.Config*, %struct.Config** %6, align 8 + %87 = getelementptr inbounds %struct.Config, %struct.Config* %86, i32 0, i32 0 + %88 = load i32, i32* %87, align 4 + %89 = sext i32 %88 to i64 + %90 = mul i64 %85, %89 + %91 = load %struct.Config*, %struct.Config** %6, align 8 + %92 = getelementptr inbounds %struct.Config, %struct.Config* %91, i32 0, i32 4 + %93 = load i32, i32* %92, align 4 + %94 = load i32, i32* %9, align 4 + %95 = mul nsw i32 %93, %94 + %96 = sext i32 %95 to i64 + %97 = mul i64 %90, %96 + %98 = load float*, float** %7, align 8 + %99 = getelementptr inbounds float, float* %98, i64 %97 + store float* %99, float** %7, align 8 + %100 = load float*, float** %7, align 8 + %101 = load %struct.TransformerWeights*, %struct.TransformerWeights** %5, align 8 + %102 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %101, i32 0, i32 6 + store float* %100, float** %102, align 8 + %103 = load i64, i64* %10, align 8 + %104 = load %struct.Config*, %struct.Config** %6, align 8 + %105 = getelementptr inbounds %struct.Config, %struct.Config* %104, i32 0, i32 3 + %106 = load i32, i32* %105, align 4 + %107 = load i32, i32* %9, align 4 + %108 = mul nsw i32 %106, %107 + %109 = sext i32 %108 to i64 + %110 = mul i64 %103, %109 + %111 = load %struct.Config*, %struct.Config** %6, align 8 + %112 = getelementptr inbounds %struct.Config, %struct.Config* %111, i32 0, i32 0 + %113 = load i32, i32* %112, align 4 + %114 = sext i32 %113 to i64 + %115 = mul i64 %110, %114 + %116 = load float*, float** %7, align 8 + %117 = getelementptr inbounds float, float* %116, i64 %115 + store float* %117, float** %7, align 8 + %118 = load float*, float** %7, align 8 + %119 = load %struct.TransformerWeights*, %struct.TransformerWeights** %5, align 8 + %120 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %119, i32 0, i32 2 + store float* %118, float** %120, align 8 + %121 = load i64, i64* %10, align 8 + %122 = load %struct.Config*, %struct.Config** %6, align 8 + %123 = getelementptr inbounds %struct.Config, %struct.Config* %122, i32 0, i32 0 + %124 = load i32, i32* %123, align 4 + %125 = sext i32 %124 to i64 + %126 = mul i64 %121, %125 + %127 = load float*, float** %7, align 8 + %128 = getelementptr inbounds float, float* %127, i64 %126 + store float* %128, float** %7, align 8 + %129 = load float*, float** %7, align 8 + %130 = load %struct.TransformerWeights*, %struct.TransformerWeights** %5, align 8 + %131 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %130, i32 0, i32 7 + store float* %129, float** %131, align 8 + %132 = load i64, i64* %10, align 8 + %133 = load %struct.Config*, %struct.Config** %6, align 8 + %134 = getelementptr inbounds %struct.Config, %struct.Config* %133, i32 0, i32 0 + %135 = load i32, i32* %134, align 4 + %136 = sext i32 %135 to i64 + %137 = mul i64 %132, %136 + %138 = load %struct.Config*, %struct.Config** %6, align 8 + %139 = getelementptr inbounds %struct.Config, %struct.Config* %138, i32 0, i32 1 + %140 = load i32, i32* %139, align 4 + %141 = sext i32 %140 to i64 + %142 = mul i64 %137, %141 + %143 = load float*, float** %7, align 8 + %144 = getelementptr inbounds float, float* %143, i64 %142 + store float* %144, float** %7, align 8 + %145 = load float*, float** %7, align 8 + %146 = load %struct.TransformerWeights*, %struct.TransformerWeights** %5, align 8 + %147 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %146, i32 0, i32 8 + store float* %145, float** %147, align 8 + %148 = load i64, i64* %10, align 8 + %149 = load %struct.Config*, %struct.Config** %6, align 8 + %150 = getelementptr inbounds %struct.Config, %struct.Config* %149, i32 0, i32 1 + %151 = load i32, i32* %150, align 4 + %152 = sext i32 %151 to i64 + %153 = mul i64 %148, %152 + %154 = load %struct.Config*, %struct.Config** %6, align 8 + %155 = getelementptr inbounds %struct.Config, %struct.Config* %154, i32 0, i32 0 + %156 = load i32, i32* %155, align 4 + %157 = sext i32 %156 to i64 + %158 = mul i64 %153, %157 + %159 = load float*, float** %7, align 8 + %160 = getelementptr inbounds float, float* %159, i64 %158 + store float* %160, float** %7, align 8 + %161 = load float*, float** %7, align 8 + %162 = load %struct.TransformerWeights*, %struct.TransformerWeights** %5, align 8 + %163 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %162, i32 0, i32 9 + store float* %161, float** %163, align 8 + %164 = load i64, i64* %10, align 8 + %165 = load %struct.Config*, %struct.Config** %6, align 8 + %166 = getelementptr inbounds %struct.Config, %struct.Config* %165, i32 0, i32 0 + %167 = load i32, i32* %166, align 4 + %168 = sext i32 %167 to i64 + %169 = mul i64 %164, %168 + %170 = load %struct.Config*, %struct.Config** %6, align 8 + %171 = getelementptr inbounds %struct.Config, %struct.Config* %170, i32 0, i32 1 + %172 = load i32, i32* %171, align 4 + %173 = sext i32 %172 to i64 + %174 = mul i64 %169, %173 + %175 = load float*, float** %7, align 8 + %176 = getelementptr inbounds float, float* %175, i64 %174 + store float* %176, float** %7, align 8 + %177 = load float*, float** %7, align 8 + %178 = load %struct.TransformerWeights*, %struct.TransformerWeights** %5, align 8 + %179 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %178, i32 0, i32 10 + store float* %177, float** %179, align 8 + %180 = load %struct.Config*, %struct.Config** %6, align 8 + %181 = getelementptr inbounds %struct.Config, %struct.Config* %180, i32 0, i32 0 + %182 = load i32, i32* %181, align 4 + %183 = load float*, float** %7, align 8 + %184 = sext i32 %182 to i64 + %185 = getelementptr inbounds float, float* %183, i64 %184 + store float* %185, float** %7, align 8 + %186 = load %struct.Config*, %struct.Config** %6, align 8 + %187 = getelementptr inbounds %struct.Config, %struct.Config* %186, i32 0, i32 6 + %188 = load i32, i32* %187, align 4 + %189 = load i32, i32* %9, align 4 + %190 = mul nsw i32 %188, %189 + %191 = sdiv i32 %190, 2 + %192 = load float*, float** %7, align 8 + %193 = sext i32 %191 to i64 + %194 = getelementptr inbounds float, float* %192, i64 %193 + store float* %194, float** %7, align 8 + %195 = load %struct.Config*, %struct.Config** %6, align 8 + %196 = getelementptr inbounds %struct.Config, %struct.Config* %195, i32 0, i32 6 + %197 = load i32, i32* %196, align 4 + %198 = load i32, i32* %9, align 4 + %199 = mul nsw i32 %197, %198 + %200 = sdiv i32 %199, 2 + %201 = load float*, float** %7, align 8 + %202 = sext i32 %200 to i64 + %203 = getelementptr inbounds float, float* %201, i64 %202 + store float* %203, float** %7, align 8 + %204 = load i32, i32* %8, align 4 + %205 = icmp ne i32 %204, 0 + br i1 %205, label %206, label %210 + +206: ; preds = %4 + %207 = load %struct.TransformerWeights*, %struct.TransformerWeights** %5, align 8 + %208 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %207, i32 0, i32 0 + %209 = load float*, float** %208, align 8 + br label %212 + +210: ; preds = %4 + %211 = load float*, float** %7, align 8 + br label %212 + +212: ; preds = %210, %206 + %213 = phi float* [ %209, %206 ], [ %211, %210 ] + %214 = load %struct.TransformerWeights*, %struct.TransformerWeights** %5, align 8 + %215 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %214, i32 0, i32 11 + store float* %213, float** %215, align 8 + ret void +} + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @read_checkpoint(i8* noundef %0, %struct.Config* noundef %1, %struct.TransformerWeights* noundef %2, i32* noundef %3, float** noundef %4, i64* noundef %5) #0 { + %7 = alloca i8*, align 8 + %8 = alloca %struct.Config*, align 8 + %9 = alloca %struct.TransformerWeights*, align 8 + %10 = alloca i32*, align 8 + %11 = alloca float**, align 8 + %12 = alloca i64*, align 8 + %13 = alloca %struct.__sFILE*, align 8 + %14 = alloca i32, align 4 + %15 = alloca float*, align 8 + store i8* %0, i8** %7, align 8 + store %struct.Config* %1, %struct.Config** %8, align 8 + store %struct.TransformerWeights* %2, %struct.TransformerWeights** %9, align 8 + store i32* %3, i32** %10, align 8 + store float** %4, float*** %11, align 8 + store i64* %5, i64** %12, align 8 + %16 = load i8*, i8** %7, align 8 + %17 = call %struct.__sFILE* @"\01_fopen"(i8* noundef %16, i8* noundef getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i64 0, i64 0)) + store %struct.__sFILE* %17, %struct.__sFILE** %13, align 8 + %18 = load %struct.__sFILE*, %struct.__sFILE** %13, align 8 + %19 = icmp ne %struct.__sFILE* %18, null + br i1 %19, label %24, label %20 + +20: ; preds = %6 + %21 = load %struct.__sFILE*, %struct.__sFILE** @__stderrp, align 8 + %22 = load i8*, i8** %7, align 8 + %23 = call i32 (%struct.__sFILE*, i8*, ...) @fprintf(%struct.__sFILE* noundef %21, i8* noundef getelementptr inbounds ([23 x i8], [23 x i8]* @.str.2, i64 0, i64 0), i8* noundef %22) + call void @exit(i32 noundef 1) #11 + unreachable + +24: ; preds = %6 + %25 = load %struct.Config*, %struct.Config** %8, align 8 + %26 = bitcast %struct.Config* %25 to i8* + %27 = load %struct.__sFILE*, %struct.__sFILE** %13, align 8 + %28 = call i64 @fread(i8* noundef %26, i64 noundef 28, i64 noundef 1, %struct.__sFILE* noundef %27) + %29 = icmp ne i64 %28, 1 + br i1 %29, label %30, label %31 + +30: ; preds = %24 + call void @exit(i32 noundef 1) #11 + unreachable + +31: ; preds = %24 + %32 = load %struct.Config*, %struct.Config** %8, align 8 + %33 = getelementptr inbounds %struct.Config, %struct.Config* %32, i32 0, i32 5 + %34 = load i32, i32* %33, align 4 + %35 = icmp sgt i32 %34, 0 + %36 = zext i1 %35 to i64 + %37 = select i1 %35, i32 1, i32 0 + store i32 %37, i32* %14, align 4 + %38 = load %struct.Config*, %struct.Config** %8, align 8 + %39 = getelementptr inbounds %struct.Config, %struct.Config* %38, i32 0, i32 5 + %40 = load i32, i32* %39, align 4 + %41 = call i32 @abs(i32 noundef %40) #12 + %42 = load %struct.Config*, %struct.Config** %8, align 8 + %43 = getelementptr inbounds %struct.Config, %struct.Config* %42, i32 0, i32 5 + store i32 %41, i32* %43, align 4 + %44 = load %struct.__sFILE*, %struct.__sFILE** %13, align 8 + %45 = call i32 @fseek(%struct.__sFILE* noundef %44, i64 noundef 0, i32 noundef 2) + %46 = load %struct.__sFILE*, %struct.__sFILE** %13, align 8 + %47 = call i64 @ftell(%struct.__sFILE* noundef %46) + %48 = load i64*, i64** %12, align 8 + store i64 %47, i64* %48, align 8 + %49 = load %struct.__sFILE*, %struct.__sFILE** %13, align 8 + %50 = call i32 @fclose(%struct.__sFILE* noundef %49) + %51 = load i8*, i8** %7, align 8 + %52 = call i32 (i8*, i32, ...) @"\01_open"(i8* noundef %51, i32 noundef 0) + %53 = load i32*, i32** %10, align 8 + store i32 %52, i32* %53, align 4 + %54 = load i32*, i32** %10, align 8 + %55 = load i32, i32* %54, align 4 + %56 = icmp eq i32 %55, -1 + br i1 %56, label %57, label %60 + +57: ; preds = %31 + %58 = load %struct.__sFILE*, %struct.__sFILE** @__stderrp, align 8 + %59 = call i32 (%struct.__sFILE*, i8*, ...) @fprintf(%struct.__sFILE* noundef %58, i8* noundef getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0)) + call void @exit(i32 noundef 1) #11 + unreachable + +60: ; preds = %31 + %61 = load i64*, i64** %12, align 8 + %62 = load i64, i64* %61, align 8 + %63 = load i32*, i32** %10, align 8 + %64 = load i32, i32* %63, align 4 + %65 = call i8* @"\01_mmap"(i8* noundef null, i64 noundef %62, i32 noundef 1, i32 noundef 2, i32 noundef %64, i64 noundef 0) + %66 = bitcast i8* %65 to float* + %67 = load float**, float*** %11, align 8 + store float* %66, float** %67, align 8 + %68 = load float**, float*** %11, align 8 + %69 = load float*, float** %68, align 8 + %70 = icmp eq float* %69, inttoptr (i64 -1 to float*) + br i1 %70, label %71, label %74 + +71: ; preds = %60 + %72 = load %struct.__sFILE*, %struct.__sFILE** @__stderrp, align 8 + %73 = call i32 (%struct.__sFILE*, i8*, ...) @fprintf(%struct.__sFILE* noundef %72, i8* noundef getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i64 0, i64 0)) + call void @exit(i32 noundef 1) #11 + unreachable + +74: ; preds = %60 + %75 = load float**, float*** %11, align 8 + %76 = load float*, float** %75, align 8 + %77 = getelementptr inbounds float, float* %76, i64 7 + store float* %77, float** %15, align 8 + %78 = load %struct.TransformerWeights*, %struct.TransformerWeights** %9, align 8 + %79 = load %struct.Config*, %struct.Config** %8, align 8 + %80 = load float*, float** %15, align 8 + %81 = load i32, i32* %14, align 4 + call void @memory_map_weights(%struct.TransformerWeights* noundef %78, %struct.Config* noundef %79, float* noundef %80, i32 noundef %81) + ret void +} + +declare %struct.__sFILE* @"\01_fopen"(i8* noundef, i8* noundef) #2 + +declare i64 @fread(i8* noundef, i64 noundef, i64 noundef, %struct.__sFILE* noundef) #2 + +; Function Attrs: nounwind readnone willreturn +declare i32 @abs(i32 noundef) #4 + +declare i32 @fseek(%struct.__sFILE* noundef, i64 noundef, i32 noundef) #2 + +declare i64 @ftell(%struct.__sFILE* noundef) #2 + +declare i32 @fclose(%struct.__sFILE* noundef) #2 + +declare i32 @"\01_open"(i8* noundef, i32 noundef, ...) #2 + +declare i8* @"\01_mmap"(i8* noundef, i64 noundef, i32 noundef, i32 noundef, i32 noundef, i64 noundef) #2 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @build_transformer(%struct.Transformer* noundef %0, i8* noundef %1) #0 { + %3 = alloca %struct.Transformer*, align 8 + %4 = alloca i8*, align 8 + store %struct.Transformer* %0, %struct.Transformer** %3, align 8 + store i8* %1, i8** %4, align 8 + %5 = load i8*, i8** %4, align 8 + %6 = load %struct.Transformer*, %struct.Transformer** %3, align 8 + %7 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %6, i32 0, i32 0 + %8 = load %struct.Transformer*, %struct.Transformer** %3, align 8 + %9 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %8, i32 0, i32 1 + %10 = load %struct.Transformer*, %struct.Transformer** %3, align 8 + %11 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %10, i32 0, i32 3 + %12 = load %struct.Transformer*, %struct.Transformer** %3, align 8 + %13 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %12, i32 0, i32 4 + %14 = load %struct.Transformer*, %struct.Transformer** %3, align 8 + %15 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %14, i32 0, i32 5 + call void @read_checkpoint(i8* noundef %5, %struct.Config* noundef %7, %struct.TransformerWeights* noundef %9, i32* noundef %11, float** noundef %13, i64* noundef %15) + %16 = load %struct.Transformer*, %struct.Transformer** %3, align 8 + %17 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %16, i32 0, i32 2 + %18 = load %struct.Transformer*, %struct.Transformer** %3, align 8 + %19 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %18, i32 0, i32 0 + call void @malloc_run_state(%struct.RunState* noundef %17, %struct.Config* noundef %19) + ret void +} + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @free_transformer(%struct.Transformer* noundef %0) #0 { + %2 = alloca %struct.Transformer*, align 8 + store %struct.Transformer* %0, %struct.Transformer** %2, align 8 + %3 = load %struct.Transformer*, %struct.Transformer** %2, align 8 + %4 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %3, i32 0, i32 4 + %5 = load float*, float** %4, align 8 + %6 = icmp ne float* %5, inttoptr (i64 -1 to float*) + br i1 %6, label %7, label %16 + +7: ; preds = %1 + %8 = load %struct.Transformer*, %struct.Transformer** %2, align 8 + %9 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %8, i32 0, i32 4 + %10 = load float*, float** %9, align 8 + %11 = bitcast float* %10 to i8* + %12 = load %struct.Transformer*, %struct.Transformer** %2, align 8 + %13 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %12, i32 0, i32 5 + %14 = load i64, i64* %13, align 8 + %15 = call i32 @"\01_munmap"(i8* noundef %11, i64 noundef %14) + br label %16 + +16: ; preds = %7, %1 + %17 = load %struct.Transformer*, %struct.Transformer** %2, align 8 + %18 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %17, i32 0, i32 3 + %19 = load i32, i32* %18, align 8 + %20 = icmp ne i32 %19, -1 + br i1 %20, label %21, label %26 + +21: ; preds = %16 + %22 = load %struct.Transformer*, %struct.Transformer** %2, align 8 + %23 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %22, i32 0, i32 3 + %24 = load i32, i32* %23, align 8 + %25 = call i32 @"\01_close"(i32 noundef %24) + br label %26 + +26: ; preds = %21, %16 + %27 = load %struct.Transformer*, %struct.Transformer** %2, align 8 + %28 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %27, i32 0, i32 2 + call void @free_run_state(%struct.RunState* noundef %28) + ret void +} + +declare i32 @"\01_munmap"(i8* noundef, i64 noundef) #2 + +declare i32 @"\01_close"(i32 noundef) #2 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @rmsnorm(float* noundef %0, float* noundef %1, float* noundef %2, i32 noundef %3) #0 { + %5 = alloca float*, align 8 + %6 = alloca float*, align 8 + %7 = alloca float*, align 8 + %8 = alloca i32, align 4 + %9 = alloca float, align 4 + %10 = alloca i32, align 4 + %11 = alloca i32, align 4 + store float* %0, float** %5, align 8 + store float* %1, float** %6, align 8 + store float* %2, float** %7, align 8 + store i32 %3, i32* %8, align 4 + store float 0.000000e+00, float* %9, align 4 + store i32 0, i32* %10, align 4 + br label %12 + +12: ; preds = %29, %4 + %13 = load i32, i32* %10, align 4 + %14 = load i32, i32* %8, align 4 + %15 = icmp slt i32 %13, %14 + br i1 %15, label %16, label %32 + +16: ; preds = %12 + %17 = load float*, float** %6, align 8 + %18 = load i32, i32* %10, align 4 + %19 = sext i32 %18 to i64 + %20 = getelementptr inbounds float, float* %17, i64 %19 + %21 = load float, float* %20, align 4 + %22 = load float*, float** %6, align 8 + %23 = load i32, i32* %10, align 4 + %24 = sext i32 %23 to i64 + %25 = getelementptr inbounds float, float* %22, i64 %24 + %26 = load float, float* %25, align 4 + %27 = load float, float* %9, align 4 + %28 = call float @llvm.fmuladd.f32(float %21, float %26, float %27) + store float %28, float* %9, align 4 + br label %29 + +29: ; preds = %16 + %30 = load i32, i32* %10, align 4 + %31 = add nsw i32 %30, 1 + store i32 %31, i32* %10, align 4 + br label %12, !llvm.loop !10 + +32: ; preds = %12 + %33 = load i32, i32* %8, align 4 + %34 = sitofp i32 %33 to float + %35 = load float, float* %9, align 4 + %36 = fdiv float %35, %34 + store float %36, float* %9, align 4 + %37 = load float, float* %9, align 4 + %38 = fadd float %37, 0x3EE4F8B580000000 + store float %38, float* %9, align 4 + %39 = load float, float* %9, align 4 + %40 = call float @llvm.sqrt.f32(float %39) + %41 = fdiv float 1.000000e+00, %40 + store float %41, float* %9, align 4 + store i32 0, i32* %11, align 4 + br label %42 + +42: ; preds = %64, %32 + %43 = load i32, i32* %11, align 4 + %44 = load i32, i32* %8, align 4 + %45 = icmp slt i32 %43, %44 + br i1 %45, label %46, label %67 + +46: ; preds = %42 + %47 = load float*, float** %7, align 8 + %48 = load i32, i32* %11, align 4 + %49 = sext i32 %48 to i64 + %50 = getelementptr inbounds float, float* %47, i64 %49 + %51 = load float, float* %50, align 4 + %52 = load float, float* %9, align 4 + %53 = load float*, float** %6, align 8 + %54 = load i32, i32* %11, align 4 + %55 = sext i32 %54 to i64 + %56 = getelementptr inbounds float, float* %53, i64 %55 + %57 = load float, float* %56, align 4 + %58 = fmul float %52, %57 + %59 = fmul float %51, %58 + %60 = load float*, float** %5, align 8 + %61 = load i32, i32* %11, align 4 + %62 = sext i32 %61 to i64 + %63 = getelementptr inbounds float, float* %60, i64 %62 + store float %59, float* %63, align 4 + br label %64 + +64: ; preds = %46 + %65 = load i32, i32* %11, align 4 + %66 = add nsw i32 %65, 1 + store i32 %66, i32* %11, align 4 + br label %42, !llvm.loop !12 + +67: ; preds = %42 + ret void +} + +; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn +declare float @llvm.fmuladd.f32(float, float, float) #5 + +; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn +declare float @llvm.sqrt.f32(float) #5 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @softmax(float* noundef %0, i32 noundef %1) #0 { + %3 = alloca float*, align 8 + %4 = alloca i32, align 4 + %5 = alloca float, align 4 + %6 = alloca i32, align 4 + %7 = alloca float, align 4 + %8 = alloca i32, align 4 + %9 = alloca i32, align 4 + store float* %0, float** %3, align 8 + store i32 %1, i32* %4, align 4 + %10 = load float*, float** %3, align 8 + %11 = getelementptr inbounds float, float* %10, i64 0 + %12 = load float, float* %11, align 4 + store float %12, float* %5, align 4 + store i32 1, i32* %6, align 4 + br label %13 + +13: ; preds = %32, %2 + %14 = load i32, i32* %6, align 4 + %15 = load i32, i32* %4, align 4 + %16 = icmp slt i32 %14, %15 + br i1 %16, label %17, label %35 + +17: ; preds = %13 + %18 = load float*, float** %3, align 8 + %19 = load i32, i32* %6, align 4 + %20 = sext i32 %19 to i64 + %21 = getelementptr inbounds float, float* %18, i64 %20 + %22 = load float, float* %21, align 4 + %23 = load float, float* %5, align 4 + %24 = fcmp ogt float %22, %23 + br i1 %24, label %25, label %31 + +25: ; preds = %17 + %26 = load float*, float** %3, align 8 + %27 = load i32, i32* %6, align 4 + %28 = sext i32 %27 to i64 + %29 = getelementptr inbounds float, float* %26, i64 %28 + %30 = load float, float* %29, align 4 + store float %30, float* %5, align 4 + br label %31 + +31: ; preds = %25, %17 + br label %32 + +32: ; preds = %31 + %33 = load i32, i32* %6, align 4 + %34 = add nsw i32 %33, 1 + store i32 %34, i32* %6, align 4 + br label %13, !llvm.loop !13 + +35: ; preds = %13 + store float 0.000000e+00, float* %7, align 4 + store i32 0, i32* %8, align 4 + br label %36 + +36: ; preds = %60, %35 + %37 = load i32, i32* %8, align 4 + %38 = load i32, i32* %4, align 4 + %39 = icmp slt i32 %37, %38 + br i1 %39, label %40, label %63 + +40: ; preds = %36 + %41 = load float*, float** %3, align 8 + %42 = load i32, i32* %8, align 4 + %43 = sext i32 %42 to i64 + %44 = getelementptr inbounds float, float* %41, i64 %43 + %45 = load float, float* %44, align 4 + %46 = load float, float* %5, align 4 + %47 = fsub float %45, %46 + %48 = call float @llvm.exp.f32(float %47) + %49 = load float*, float** %3, align 8 + %50 = load i32, i32* %8, align 4 + %51 = sext i32 %50 to i64 + %52 = getelementptr inbounds float, float* %49, i64 %51 + store float %48, float* %52, align 4 + %53 = load float*, float** %3, align 8 + %54 = load i32, i32* %8, align 4 + %55 = sext i32 %54 to i64 + %56 = getelementptr inbounds float, float* %53, i64 %55 + %57 = load float, float* %56, align 4 + %58 = load float, float* %7, align 4 + %59 = fadd float %58, %57 + store float %59, float* %7, align 4 + br label %60 + +60: ; preds = %40 + %61 = load i32, i32* %8, align 4 + %62 = add nsw i32 %61, 1 + store i32 %62, i32* %8, align 4 + br label %36, !llvm.loop !14 + +63: ; preds = %36 + store i32 0, i32* %9, align 4 + br label %64 + +64: ; preds = %76, %63 + %65 = load i32, i32* %9, align 4 + %66 = load i32, i32* %4, align 4 + %67 = icmp slt i32 %65, %66 + br i1 %67, label %68, label %79 + +68: ; preds = %64 + %69 = load float, float* %7, align 4 + %70 = load float*, float** %3, align 8 + %71 = load i32, i32* %9, align 4 + %72 = sext i32 %71 to i64 + %73 = getelementptr inbounds float, float* %70, i64 %72 + %74 = load float, float* %73, align 4 + %75 = fdiv float %74, %69 + store float %75, float* %73, align 4 + br label %76 + +76: ; preds = %68 + %77 = load i32, i32* %9, align 4 + %78 = add nsw i32 %77, 1 + store i32 %78, i32* %9, align 4 + br label %64, !llvm.loop !15 + +79: ; preds = %64 + ret void +} + +; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn +declare float @llvm.exp.f32(float) #5 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @matmul(float* noundef %0, float* noundef %1, float* noundef %2, i32 noundef %3, i32 noundef %4) #0 { + %6 = alloca float*, align 8 + %7 = alloca float*, align 8 + %8 = alloca float*, align 8 + %9 = alloca i32, align 4 + %10 = alloca i32, align 4 + %11 = alloca i32, align 4 + %12 = alloca float, align 4 + %13 = alloca i32, align 4 + store float* %0, float** %6, align 8 + store float* %1, float** %7, align 8 + store float* %2, float** %8, align 8 + store i32 %3, i32* %9, align 4 + store i32 %4, i32* %10, align 4 + store i32 0, i32* %11, align 4 + br label %14 + +14: ; preds = %49, %5 + %15 = load i32, i32* %11, align 4 + %16 = load i32, i32* %10, align 4 + %17 = icmp slt i32 %15, %16 + br i1 %17, label %18, label %52 + +18: ; preds = %14 + store float 0.000000e+00, float* %12, align 4 + store i32 0, i32* %13, align 4 + br label %19 + +19: ; preds = %40, %18 + %20 = load i32, i32* %13, align 4 + %21 = load i32, i32* %9, align 4 + %22 = icmp slt i32 %20, %21 + br i1 %22, label %23, label %43 + +23: ; preds = %19 + %24 = load float*, float** %8, align 8 + %25 = load i32, i32* %11, align 4 + %26 = load i32, i32* %9, align 4 + %27 = mul nsw i32 %25, %26 + %28 = load i32, i32* %13, align 4 + %29 = add nsw i32 %27, %28 + %30 = sext i32 %29 to i64 + %31 = getelementptr inbounds float, float* %24, i64 %30 + %32 = load float, float* %31, align 4 + %33 = load float*, float** %7, align 8 + %34 = load i32, i32* %13, align 4 + %35 = sext i32 %34 to i64 + %36 = getelementptr inbounds float, float* %33, i64 %35 + %37 = load float, float* %36, align 4 + %38 = load float, float* %12, align 4 + %39 = call float @llvm.fmuladd.f32(float %32, float %37, float %38) + store float %39, float* %12, align 4 + br label %40 + +40: ; preds = %23 + %41 = load i32, i32* %13, align 4 + %42 = add nsw i32 %41, 1 + store i32 %42, i32* %13, align 4 + br label %19, !llvm.loop !16 + +43: ; preds = %19 + %44 = load float, float* %12, align 4 + %45 = load float*, float** %6, align 8 + %46 = load i32, i32* %11, align 4 + %47 = sext i32 %46 to i64 + %48 = getelementptr inbounds float, float* %45, i64 %47 + store float %44, float* %48, align 4 + br label %49 + +49: ; preds = %43 + %50 = load i32, i32* %11, align 4 + %51 = add nsw i32 %50, 1 + store i32 %51, i32* %11, align 4 + br label %14, !llvm.loop !17 + +52: ; preds = %14 + ret void +} + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define float* @forward(%struct.Transformer* noundef %0, i32 noundef %1, i32 noundef %2) #0 { + %4 = alloca %struct.Transformer*, align 8 + %5 = alloca i32, align 4 + %6 = alloca i32, align 4 + %7 = alloca %struct.Config*, align 8 + %8 = alloca %struct.TransformerWeights*, align 8 + %9 = alloca %struct.RunState*, align 8 + %10 = alloca float*, align 8 + %11 = alloca i32, align 4 + %12 = alloca i32, align 4 + %13 = alloca i32, align 4 + %14 = alloca i32, align 4 + %15 = alloca i32, align 4 + %16 = alloca float*, align 8 + %17 = alloca i64, align 8 + %18 = alloca i32, align 4 + %19 = alloca i32, align 4 + %20 = alloca i32, align 4 + %21 = alloca float, align 4 + %22 = alloca float, align 4 + %23 = alloca float, align 4 + %24 = alloca float, align 4 + %25 = alloca i32, align 4 + %26 = alloca i32, align 4 + %27 = alloca float*, align 8 + %28 = alloca float, align 4 + %29 = alloca float, align 4 + %30 = alloca i32, align 4 + %31 = alloca float*, align 8 + %32 = alloca float*, align 8 + %33 = alloca i32, align 4 + %34 = alloca float*, align 8 + %35 = alloca float, align 4 + %36 = alloca i32, align 4 + %37 = alloca float*, align 8 + %38 = alloca i32, align 4 + %39 = alloca float*, align 8 + %40 = alloca float, align 4 + %41 = alloca i32, align 4 + %42 = alloca i32, align 4 + %43 = alloca i32, align 4 + %44 = alloca float, align 4 + %45 = alloca i32, align 4 + store %struct.Transformer* %0, %struct.Transformer** %4, align 8 + store i32 %1, i32* %5, align 4 + store i32 %2, i32* %6, align 4 + %46 = load %struct.Transformer*, %struct.Transformer** %4, align 8 + %47 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %46, i32 0, i32 0 + store %struct.Config* %47, %struct.Config** %7, align 8 + %48 = load %struct.Transformer*, %struct.Transformer** %4, align 8 + %49 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %48, i32 0, i32 1 + store %struct.TransformerWeights* %49, %struct.TransformerWeights** %8, align 8 + %50 = load %struct.Transformer*, %struct.Transformer** %4, align 8 + %51 = getelementptr inbounds %struct.Transformer, %struct.Transformer* %50, i32 0, i32 2 + store %struct.RunState* %51, %struct.RunState** %9, align 8 + %52 = load %struct.RunState*, %struct.RunState** %9, align 8 + %53 = getelementptr inbounds %struct.RunState, %struct.RunState* %52, i32 0, i32 0 + %54 = load float*, float** %53, align 8 + store float* %54, float** %10, align 8 + %55 = load %struct.Config*, %struct.Config** %7, align 8 + %56 = getelementptr inbounds %struct.Config, %struct.Config* %55, i32 0, i32 0 + %57 = load i32, i32* %56, align 4 + store i32 %57, i32* %11, align 4 + %58 = load %struct.Config*, %struct.Config** %7, align 8 + %59 = getelementptr inbounds %struct.Config, %struct.Config* %58, i32 0, i32 0 + %60 = load i32, i32* %59, align 4 + %61 = load %struct.Config*, %struct.Config** %7, align 8 + %62 = getelementptr inbounds %struct.Config, %struct.Config* %61, i32 0, i32 4 + %63 = load i32, i32* %62, align 4 + %64 = mul nsw i32 %60, %63 + %65 = load %struct.Config*, %struct.Config** %7, align 8 + %66 = getelementptr inbounds %struct.Config, %struct.Config* %65, i32 0, i32 3 + %67 = load i32, i32* %66, align 4 + %68 = sdiv i32 %64, %67 + store i32 %68, i32* %12, align 4 + %69 = load %struct.Config*, %struct.Config** %7, align 8 + %70 = getelementptr inbounds %struct.Config, %struct.Config* %69, i32 0, i32 3 + %71 = load i32, i32* %70, align 4 + %72 = load %struct.Config*, %struct.Config** %7, align 8 + %73 = getelementptr inbounds %struct.Config, %struct.Config* %72, i32 0, i32 4 + %74 = load i32, i32* %73, align 4 + %75 = sdiv i32 %71, %74 + store i32 %75, i32* %13, align 4 + %76 = load %struct.Config*, %struct.Config** %7, align 8 + %77 = getelementptr inbounds %struct.Config, %struct.Config* %76, i32 0, i32 1 + %78 = load i32, i32* %77, align 4 + store i32 %78, i32* %14, align 4 + %79 = load i32, i32* %11, align 4 + %80 = load %struct.Config*, %struct.Config** %7, align 8 + %81 = getelementptr inbounds %struct.Config, %struct.Config* %80, i32 0, i32 3 + %82 = load i32, i32* %81, align 4 + %83 = sdiv i32 %79, %82 + store i32 %83, i32* %15, align 4 + %84 = load %struct.TransformerWeights*, %struct.TransformerWeights** %8, align 8 + %85 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %84, i32 0, i32 0 + %86 = load float*, float** %85, align 8 + %87 = load i32, i32* %5, align 4 + %88 = load i32, i32* %11, align 4 + %89 = mul nsw i32 %87, %88 + %90 = sext i32 %89 to i64 + %91 = getelementptr inbounds float, float* %86, i64 %90 + store float* %91, float** %16, align 8 + %92 = load float*, float** %10, align 8 + %93 = bitcast float* %92 to i8* + %94 = load float*, float** %16, align 8 + %95 = bitcast float* %94 to i8* + %96 = load i32, i32* %11, align 4 + %97 = sext i32 %96 to i64 + %98 = mul i64 %97, 4 + %99 = load float*, float** %10, align 8 + %100 = bitcast float* %99 to i8* + %101 = call i64 @llvm.objectsize.i64.p0i8(i8* %100, i1 false, i1 true, i1 false) + %102 = call i8* @__memcpy_chk(i8* noundef %93, i8* noundef %95, i64 noundef %98, i64 noundef %101) #13 + store i64 0, i64* %17, align 8 + br label %103 + +103: ; preds = %635, %3 + %104 = load i64, i64* %17, align 8 + %105 = load %struct.Config*, %struct.Config** %7, align 8 + %106 = getelementptr inbounds %struct.Config, %struct.Config* %105, i32 0, i32 2 + %107 = load i32, i32* %106, align 4 + %108 = sext i32 %107 to i64 + %109 = icmp ult i64 %104, %108 + br i1 %109, label %110, label %638 + +110: ; preds = %103 + %111 = load %struct.RunState*, %struct.RunState** %9, align 8 + %112 = getelementptr inbounds %struct.RunState, %struct.RunState* %111, i32 0, i32 1 + %113 = load float*, float** %112, align 8 + %114 = load float*, float** %10, align 8 + %115 = load %struct.TransformerWeights*, %struct.TransformerWeights** %8, align 8 + %116 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %115, i32 0, i32 1 + %117 = load float*, float** %116, align 8 + %118 = load i64, i64* %17, align 8 + %119 = load i32, i32* %11, align 4 + %120 = sext i32 %119 to i64 + %121 = mul i64 %118, %120 + %122 = getelementptr inbounds float, float* %117, i64 %121 + %123 = load i32, i32* %11, align 4 + call void @rmsnorm(float* noundef %113, float* noundef %114, float* noundef %122, i32 noundef %123) + %124 = load i64, i64* %17, align 8 + %125 = load %struct.Config*, %struct.Config** %7, align 8 + %126 = getelementptr inbounds %struct.Config, %struct.Config* %125, i32 0, i32 6 + %127 = load i32, i32* %126, align 4 + %128 = sext i32 %127 to i64 + %129 = mul i64 %124, %128 + %130 = load i32, i32* %12, align 4 + %131 = sext i32 %130 to i64 + %132 = mul i64 %129, %131 + %133 = trunc i64 %132 to i32 + store i32 %133, i32* %18, align 4 + %134 = load %struct.RunState*, %struct.RunState** %9, align 8 + %135 = getelementptr inbounds %struct.RunState, %struct.RunState* %134, i32 0, i32 10 + %136 = load float*, float** %135, align 8 + %137 = load i32, i32* %18, align 4 + %138 = sext i32 %137 to i64 + %139 = getelementptr inbounds float, float* %136, i64 %138 + %140 = load i32, i32* %6, align 4 + %141 = load i32, i32* %12, align 4 + %142 = mul nsw i32 %140, %141 + %143 = sext i32 %142 to i64 + %144 = getelementptr inbounds float, float* %139, i64 %143 + %145 = load %struct.RunState*, %struct.RunState** %9, align 8 + %146 = getelementptr inbounds %struct.RunState, %struct.RunState* %145, i32 0, i32 6 + store float* %144, float** %146, align 8 + %147 = load %struct.RunState*, %struct.RunState** %9, align 8 + %148 = getelementptr inbounds %struct.RunState, %struct.RunState* %147, i32 0, i32 11 + %149 = load float*, float** %148, align 8 + %150 = load i32, i32* %18, align 4 + %151 = sext i32 %150 to i64 + %152 = getelementptr inbounds float, float* %149, i64 %151 + %153 = load i32, i32* %6, align 4 + %154 = load i32, i32* %12, align 4 + %155 = mul nsw i32 %153, %154 + %156 = sext i32 %155 to i64 + %157 = getelementptr inbounds float, float* %152, i64 %156 + %158 = load %struct.RunState*, %struct.RunState** %9, align 8 + %159 = getelementptr inbounds %struct.RunState, %struct.RunState* %158, i32 0, i32 7 + store float* %157, float** %159, align 8 + %160 = load %struct.RunState*, %struct.RunState** %9, align 8 + %161 = getelementptr inbounds %struct.RunState, %struct.RunState* %160, i32 0, i32 5 + %162 = load float*, float** %161, align 8 + %163 = load %struct.RunState*, %struct.RunState** %9, align 8 + %164 = getelementptr inbounds %struct.RunState, %struct.RunState* %163, i32 0, i32 1 + %165 = load float*, float** %164, align 8 + %166 = load %struct.TransformerWeights*, %struct.TransformerWeights** %8, align 8 + %167 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %166, i32 0, i32 3 + %168 = load float*, float** %167, align 8 + %169 = load i64, i64* %17, align 8 + %170 = load i32, i32* %11, align 4 + %171 = sext i32 %170 to i64 + %172 = mul i64 %169, %171 + %173 = load i32, i32* %11, align 4 + %174 = sext i32 %173 to i64 + %175 = mul i64 %172, %174 + %176 = getelementptr inbounds float, float* %168, i64 %175 + %177 = load i32, i32* %11, align 4 + %178 = load i32, i32* %11, align 4 + call void @matmul(float* noundef %162, float* noundef %165, float* noundef %176, i32 noundef %177, i32 noundef %178) + %179 = load %struct.RunState*, %struct.RunState** %9, align 8 + %180 = getelementptr inbounds %struct.RunState, %struct.RunState* %179, i32 0, i32 6 + %181 = load float*, float** %180, align 8 + %182 = load %struct.RunState*, %struct.RunState** %9, align 8 + %183 = getelementptr inbounds %struct.RunState, %struct.RunState* %182, i32 0, i32 1 + %184 = load float*, float** %183, align 8 + %185 = load %struct.TransformerWeights*, %struct.TransformerWeights** %8, align 8 + %186 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %185, i32 0, i32 4 + %187 = load float*, float** %186, align 8 + %188 = load i64, i64* %17, align 8 + %189 = load i32, i32* %11, align 4 + %190 = sext i32 %189 to i64 + %191 = mul i64 %188, %190 + %192 = load i32, i32* %12, align 4 + %193 = sext i32 %192 to i64 + %194 = mul i64 %191, %193 + %195 = getelementptr inbounds float, float* %187, i64 %194 + %196 = load i32, i32* %11, align 4 + %197 = load i32, i32* %12, align 4 + call void @matmul(float* noundef %181, float* noundef %184, float* noundef %195, i32 noundef %196, i32 noundef %197) + %198 = load %struct.RunState*, %struct.RunState** %9, align 8 + %199 = getelementptr inbounds %struct.RunState, %struct.RunState* %198, i32 0, i32 7 + %200 = load float*, float** %199, align 8 + %201 = load %struct.RunState*, %struct.RunState** %9, align 8 + %202 = getelementptr inbounds %struct.RunState, %struct.RunState* %201, i32 0, i32 1 + %203 = load float*, float** %202, align 8 + %204 = load %struct.TransformerWeights*, %struct.TransformerWeights** %8, align 8 + %205 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %204, i32 0, i32 5 + %206 = load float*, float** %205, align 8 + %207 = load i64, i64* %17, align 8 + %208 = load i32, i32* %11, align 4 + %209 = sext i32 %208 to i64 + %210 = mul i64 %207, %209 + %211 = load i32, i32* %12, align 4 + %212 = sext i32 %211 to i64 + %213 = mul i64 %210, %212 + %214 = getelementptr inbounds float, float* %206, i64 %213 + %215 = load i32, i32* %11, align 4 + %216 = load i32, i32* %12, align 4 + call void @matmul(float* noundef %200, float* noundef %203, float* noundef %214, i32 noundef %215, i32 noundef %216) + store i32 0, i32* %19, align 4 + br label %217 + +217: ; preds = %299, %110 + %218 = load i32, i32* %19, align 4 + %219 = load i32, i32* %11, align 4 + %220 = icmp slt i32 %218, %219 + br i1 %220, label %221, label %302 + +221: ; preds = %217 + %222 = load i32, i32* %19, align 4 + %223 = load i32, i32* %15, align 4 + %224 = srem i32 %222, %223 + store i32 %224, i32* %20, align 4 + %225 = load i32, i32* %20, align 4 + %226 = sitofp i32 %225 to float + %227 = load i32, i32* %15, align 4 + %228 = sitofp i32 %227 to float + %229 = fdiv float %226, %228 + %230 = call float @llvm.pow.f32(float 1.000000e+04, float %229) + %231 = fdiv float 1.000000e+00, %230 + store float %231, float* %21, align 4 + %232 = load i32, i32* %6, align 4 + %233 = sitofp i32 %232 to float + %234 = load float, float* %21, align 4 + %235 = fmul float %233, %234 + store float %235, float* %22, align 4 + %236 = load float, float* %22, align 4 + %237 = call float @llvm.cos.f32(float %236) + store float %237, float* %23, align 4 + %238 = load float, float* %22, align 4 + %239 = call float @llvm.sin.f32(float %238) + store float %239, float* %24, align 4 + %240 = load i32, i32* %19, align 4 + %241 = load i32, i32* %12, align 4 + %242 = icmp slt i32 %240, %241 + %243 = zext i1 %242 to i64 + %244 = select i1 %242, i32 2, i32 1 + store i32 %244, i32* %25, align 4 + store i32 0, i32* %26, align 4 + br label %245 + +245: ; preds = %295, %221 + %246 = load i32, i32* %26, align 4 + %247 = load i32, i32* %25, align 4 + %248 = icmp slt i32 %246, %247 + br i1 %248, label %249, label %298 + +249: ; preds = %245 + %250 = load i32, i32* %26, align 4 + %251 = icmp eq i32 %250, 0 + br i1 %251, label %252, label %256 + +252: ; preds = %249 + %253 = load %struct.RunState*, %struct.RunState** %9, align 8 + %254 = getelementptr inbounds %struct.RunState, %struct.RunState* %253, i32 0, i32 5 + %255 = load float*, float** %254, align 8 + br label %260 + +256: ; preds = %249 + %257 = load %struct.RunState*, %struct.RunState** %9, align 8 + %258 = getelementptr inbounds %struct.RunState, %struct.RunState* %257, i32 0, i32 6 + %259 = load float*, float** %258, align 8 + br label %260 + +260: ; preds = %256, %252 + %261 = phi float* [ %255, %252 ], [ %259, %256 ] + store float* %261, float** %27, align 8 + %262 = load float*, float** %27, align 8 + %263 = load i32, i32* %19, align 4 + %264 = sext i32 %263 to i64 + %265 = getelementptr inbounds float, float* %262, i64 %264 + %266 = load float, float* %265, align 4 + store float %266, float* %28, align 4 + %267 = load float*, float** %27, align 8 + %268 = load i32, i32* %19, align 4 + %269 = add nsw i32 %268, 1 + %270 = sext i32 %269 to i64 + %271 = getelementptr inbounds float, float* %267, i64 %270 + %272 = load float, float* %271, align 4 + store float %272, float* %29, align 4 + %273 = load float, float* %28, align 4 + %274 = load float, float* %23, align 4 + %275 = load float, float* %29, align 4 + %276 = load float, float* %24, align 4 + %277 = fmul float %275, %276 + %278 = fneg float %277 + %279 = call float @llvm.fmuladd.f32(float %273, float %274, float %278) + %280 = load float*, float** %27, align 8 + %281 = load i32, i32* %19, align 4 + %282 = sext i32 %281 to i64 + %283 = getelementptr inbounds float, float* %280, i64 %282 + store float %279, float* %283, align 4 + %284 = load float, float* %28, align 4 + %285 = load float, float* %24, align 4 + %286 = load float, float* %29, align 4 + %287 = load float, float* %23, align 4 + %288 = fmul float %286, %287 + %289 = call float @llvm.fmuladd.f32(float %284, float %285, float %288) + %290 = load float*, float** %27, align 8 + %291 = load i32, i32* %19, align 4 + %292 = add nsw i32 %291, 1 + %293 = sext i32 %292 to i64 + %294 = getelementptr inbounds float, float* %290, i64 %293 + store float %289, float* %294, align 4 + br label %295 + +295: ; preds = %260 + %296 = load i32, i32* %26, align 4 + %297 = add nsw i32 %296, 1 + store i32 %297, i32* %26, align 4 + br label %245, !llvm.loop !18 + +298: ; preds = %245 + br label %299 + +299: ; preds = %298 + %300 = load i32, i32* %19, align 4 + %301 = add nsw i32 %300, 2 + store i32 %301, i32* %19, align 4 + br label %217, !llvm.loop !19 + +302: ; preds = %217 + store i32 0, i32* %30, align 4 + br label %303 + +303: ; preds = %459, %302 + %304 = load i32, i32* %30, align 4 + %305 = load %struct.Config*, %struct.Config** %7, align 8 + %306 = getelementptr inbounds %struct.Config, %struct.Config* %305, i32 0, i32 3 + %307 = load i32, i32* %306, align 4 + %308 = icmp slt i32 %304, %307 + br i1 %308, label %309, label %462 + +309: ; preds = %303 + %310 = load %struct.RunState*, %struct.RunState** %9, align 8 + %311 = getelementptr inbounds %struct.RunState, %struct.RunState* %310, i32 0, i32 5 + %312 = load float*, float** %311, align 8 + %313 = load i32, i32* %30, align 4 + %314 = load i32, i32* %15, align 4 + %315 = mul nsw i32 %313, %314 + %316 = sext i32 %315 to i64 + %317 = getelementptr inbounds float, float* %312, i64 %316 + store float* %317, float** %31, align 8 + %318 = load %struct.RunState*, %struct.RunState** %9, align 8 + %319 = getelementptr inbounds %struct.RunState, %struct.RunState* %318, i32 0, i32 8 + %320 = load float*, float** %319, align 8 + %321 = load i32, i32* %30, align 4 + %322 = load %struct.Config*, %struct.Config** %7, align 8 + %323 = getelementptr inbounds %struct.Config, %struct.Config* %322, i32 0, i32 6 + %324 = load i32, i32* %323, align 4 + %325 = mul nsw i32 %321, %324 + %326 = sext i32 %325 to i64 + %327 = getelementptr inbounds float, float* %320, i64 %326 + store float* %327, float** %32, align 8 + store i32 0, i32* %33, align 4 + br label %328 + +328: ; preds = %382, %309 + %329 = load i32, i32* %33, align 4 + %330 = load i32, i32* %6, align 4 + %331 = icmp sle i32 %329, %330 + br i1 %331, label %332, label %385 + +332: ; preds = %328 + %333 = load %struct.RunState*, %struct.RunState** %9, align 8 + %334 = getelementptr inbounds %struct.RunState, %struct.RunState* %333, i32 0, i32 10 + %335 = load float*, float** %334, align 8 + %336 = load i32, i32* %18, align 4 + %337 = sext i32 %336 to i64 + %338 = getelementptr inbounds float, float* %335, i64 %337 + %339 = load i32, i32* %33, align 4 + %340 = load i32, i32* %12, align 4 + %341 = mul nsw i32 %339, %340 + %342 = sext i32 %341 to i64 + %343 = getelementptr inbounds float, float* %338, i64 %342 + %344 = load i32, i32* %30, align 4 + %345 = load i32, i32* %13, align 4 + %346 = sdiv i32 %344, %345 + %347 = load i32, i32* %15, align 4 + %348 = mul nsw i32 %346, %347 + %349 = sext i32 %348 to i64 + %350 = getelementptr inbounds float, float* %343, i64 %349 + store float* %350, float** %34, align 8 + store float 0.000000e+00, float* %35, align 4 + store i32 0, i32* %36, align 4 + br label %351 + +351: ; preds = %368, %332 + %352 = load i32, i32* %36, align 4 + %353 = load i32, i32* %15, align 4 + %354 = icmp slt i32 %352, %353 + br i1 %354, label %355, label %371 + +355: ; preds = %351 + %356 = load float*, float** %31, align 8 + %357 = load i32, i32* %36, align 4 + %358 = sext i32 %357 to i64 + %359 = getelementptr inbounds float, float* %356, i64 %358 + %360 = load float, float* %359, align 4 + %361 = load float*, float** %34, align 8 + %362 = load i32, i32* %36, align 4 + %363 = sext i32 %362 to i64 + %364 = getelementptr inbounds float, float* %361, i64 %363 + %365 = load float, float* %364, align 4 + %366 = load float, float* %35, align 4 + %367 = call float @llvm.fmuladd.f32(float %360, float %365, float %366) + store float %367, float* %35, align 4 + br label %368 + +368: ; preds = %355 + %369 = load i32, i32* %36, align 4 + %370 = add nsw i32 %369, 1 + store i32 %370, i32* %36, align 4 + br label %351, !llvm.loop !20 + +371: ; preds = %351 + %372 = load i32, i32* %15, align 4 + %373 = sitofp i32 %372 to float + %374 = call float @llvm.sqrt.f32(float %373) + %375 = load float, float* %35, align 4 + %376 = fdiv float %375, %374 + store float %376, float* %35, align 4 + %377 = load float, float* %35, align 4 + %378 = load float*, float** %32, align 8 + %379 = load i32, i32* %33, align 4 + %380 = sext i32 %379 to i64 + %381 = getelementptr inbounds float, float* %378, i64 %380 + store float %377, float* %381, align 4 + br label %382 + +382: ; preds = %371 + %383 = load i32, i32* %33, align 4 + %384 = add nsw i32 %383, 1 + store i32 %384, i32* %33, align 4 + br label %328, !llvm.loop !21 + +385: ; preds = %328 + %386 = load float*, float** %32, align 8 + %387 = load i32, i32* %6, align 4 + %388 = add nsw i32 %387, 1 + call void @softmax(float* noundef %386, i32 noundef %388) + %389 = load %struct.RunState*, %struct.RunState** %9, align 8 + %390 = getelementptr inbounds %struct.RunState, %struct.RunState* %389, i32 0, i32 1 + %391 = load float*, float** %390, align 8 + %392 = load i32, i32* %30, align 4 + %393 = load i32, i32* %15, align 4 + %394 = mul nsw i32 %392, %393 + %395 = sext i32 %394 to i64 + %396 = getelementptr inbounds float, float* %391, i64 %395 + store float* %396, float** %37, align 8 + %397 = load float*, float** %37, align 8 + %398 = bitcast float* %397 to i8* + %399 = load i32, i32* %15, align 4 + %400 = sext i32 %399 to i64 + %401 = mul i64 %400, 4 + %402 = load float*, float** %37, align 8 + %403 = bitcast float* %402 to i8* + %404 = call i64 @llvm.objectsize.i64.p0i8(i8* %403, i1 false, i1 true, i1 false) + %405 = call i8* @__memset_chk(i8* noundef %398, i32 noundef 0, i64 noundef %401, i64 noundef %404) #13 + store i32 0, i32* %38, align 4 + br label %406 + +406: ; preds = %455, %385 + %407 = load i32, i32* %38, align 4 + %408 = load i32, i32* %6, align 4 + %409 = icmp sle i32 %407, %408 + br i1 %409, label %410, label %458 + +410: ; preds = %406 + %411 = load %struct.RunState*, %struct.RunState** %9, align 8 + %412 = getelementptr inbounds %struct.RunState, %struct.RunState* %411, i32 0, i32 11 + %413 = load float*, float** %412, align 8 + %414 = load i32, i32* %18, align 4 + %415 = sext i32 %414 to i64 + %416 = getelementptr inbounds float, float* %413, i64 %415 + %417 = load i32, i32* %38, align 4 + %418 = load i32, i32* %12, align 4 + %419 = mul nsw i32 %417, %418 + %420 = sext i32 %419 to i64 + %421 = getelementptr inbounds float, float* %416, i64 %420 + %422 = load i32, i32* %30, align 4 + %423 = load i32, i32* %13, align 4 + %424 = sdiv i32 %422, %423 + %425 = load i32, i32* %15, align 4 + %426 = mul nsw i32 %424, %425 + %427 = sext i32 %426 to i64 + %428 = getelementptr inbounds float, float* %421, i64 %427 + store float* %428, float** %39, align 8 + %429 = load float*, float** %32, align 8 + %430 = load i32, i32* %38, align 4 + %431 = sext i32 %430 to i64 + %432 = getelementptr inbounds float, float* %429, i64 %431 + %433 = load float, float* %432, align 4 + store float %433, float* %40, align 4 + store i32 0, i32* %41, align 4 + br label %434 + +434: ; preds = %451, %410 + %435 = load i32, i32* %41, align 4 + %436 = load i32, i32* %15, align 4 + %437 = icmp slt i32 %435, %436 + br i1 %437, label %438, label %454 + +438: ; preds = %434 + %439 = load float, float* %40, align 4 + %440 = load float*, float** %39, align 8 + %441 = load i32, i32* %41, align 4 + %442 = sext i32 %441 to i64 + %443 = getelementptr inbounds float, float* %440, i64 %442 + %444 = load float, float* %443, align 4 + %445 = load float*, float** %37, align 8 + %446 = load i32, i32* %41, align 4 + %447 = sext i32 %446 to i64 + %448 = getelementptr inbounds float, float* %445, i64 %447 + %449 = load float, float* %448, align 4 + %450 = call float @llvm.fmuladd.f32(float %439, float %444, float %449) + store float %450, float* %448, align 4 + br label %451 + +451: ; preds = %438 + %452 = load i32, i32* %41, align 4 + %453 = add nsw i32 %452, 1 + store i32 %453, i32* %41, align 4 + br label %434, !llvm.loop !22 + +454: ; preds = %434 + br label %455 + +455: ; preds = %454 + %456 = load i32, i32* %38, align 4 + %457 = add nsw i32 %456, 1 + store i32 %457, i32* %38, align 4 + br label %406, !llvm.loop !23 + +458: ; preds = %406 + br label %459 + +459: ; preds = %458 + %460 = load i32, i32* %30, align 4 + %461 = add nsw i32 %460, 1 + store i32 %461, i32* %30, align 4 + br label %303, !llvm.loop !24 + +462: ; preds = %303 + %463 = load %struct.RunState*, %struct.RunState** %9, align 8 + %464 = getelementptr inbounds %struct.RunState, %struct.RunState* %463, i32 0, i32 2 + %465 = load float*, float** %464, align 8 + %466 = load %struct.RunState*, %struct.RunState** %9, align 8 + %467 = getelementptr inbounds %struct.RunState, %struct.RunState* %466, i32 0, i32 1 + %468 = load float*, float** %467, align 8 + %469 = load %struct.TransformerWeights*, %struct.TransformerWeights** %8, align 8 + %470 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %469, i32 0, i32 6 + %471 = load float*, float** %470, align 8 + %472 = load i64, i64* %17, align 8 + %473 = load i32, i32* %11, align 4 + %474 = sext i32 %473 to i64 + %475 = mul i64 %472, %474 + %476 = load i32, i32* %11, align 4 + %477 = sext i32 %476 to i64 + %478 = mul i64 %475, %477 + %479 = getelementptr inbounds float, float* %471, i64 %478 + %480 = load i32, i32* %11, align 4 + %481 = load i32, i32* %11, align 4 + call void @matmul(float* noundef %465, float* noundef %468, float* noundef %479, i32 noundef %480, i32 noundef %481) + store i32 0, i32* %42, align 4 + br label %482 + +482: ; preds = %500, %462 + %483 = load i32, i32* %42, align 4 + %484 = load i32, i32* %11, align 4 + %485 = icmp slt i32 %483, %484 + br i1 %485, label %486, label %503 + +486: ; preds = %482 + %487 = load %struct.RunState*, %struct.RunState** %9, align 8 + %488 = getelementptr inbounds %struct.RunState, %struct.RunState* %487, i32 0, i32 2 + %489 = load float*, float** %488, align 8 + %490 = load i32, i32* %42, align 4 + %491 = sext i32 %490 to i64 + %492 = getelementptr inbounds float, float* %489, i64 %491 + %493 = load float, float* %492, align 4 + %494 = load float*, float** %10, align 8 + %495 = load i32, i32* %42, align 4 + %496 = sext i32 %495 to i64 + %497 = getelementptr inbounds float, float* %494, i64 %496 + %498 = load float, float* %497, align 4 + %499 = fadd float %498, %493 + store float %499, float* %497, align 4 + br label %500 + +500: ; preds = %486 + %501 = load i32, i32* %42, align 4 + %502 = add nsw i32 %501, 1 + store i32 %502, i32* %42, align 4 + br label %482, !llvm.loop !25 + +503: ; preds = %482 + %504 = load %struct.RunState*, %struct.RunState** %9, align 8 + %505 = getelementptr inbounds %struct.RunState, %struct.RunState* %504, i32 0, i32 1 + %506 = load float*, float** %505, align 8 + %507 = load float*, float** %10, align 8 + %508 = load %struct.TransformerWeights*, %struct.TransformerWeights** %8, align 8 + %509 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %508, i32 0, i32 2 + %510 = load float*, float** %509, align 8 + %511 = load i64, i64* %17, align 8 + %512 = load i32, i32* %11, align 4 + %513 = sext i32 %512 to i64 + %514 = mul i64 %511, %513 + %515 = getelementptr inbounds float, float* %510, i64 %514 + %516 = load i32, i32* %11, align 4 + call void @rmsnorm(float* noundef %506, float* noundef %507, float* noundef %515, i32 noundef %516) + %517 = load %struct.RunState*, %struct.RunState** %9, align 8 + %518 = getelementptr inbounds %struct.RunState, %struct.RunState* %517, i32 0, i32 3 + %519 = load float*, float** %518, align 8 + %520 = load %struct.RunState*, %struct.RunState** %9, align 8 + %521 = getelementptr inbounds %struct.RunState, %struct.RunState* %520, i32 0, i32 1 + %522 = load float*, float** %521, align 8 + %523 = load %struct.TransformerWeights*, %struct.TransformerWeights** %8, align 8 + %524 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %523, i32 0, i32 7 + %525 = load float*, float** %524, align 8 + %526 = load i64, i64* %17, align 8 + %527 = load i32, i32* %11, align 4 + %528 = sext i32 %527 to i64 + %529 = mul i64 %526, %528 + %530 = load i32, i32* %14, align 4 + %531 = sext i32 %530 to i64 + %532 = mul i64 %529, %531 + %533 = getelementptr inbounds float, float* %525, i64 %532 + %534 = load i32, i32* %11, align 4 + %535 = load i32, i32* %14, align 4 + call void @matmul(float* noundef %519, float* noundef %522, float* noundef %533, i32 noundef %534, i32 noundef %535) + %536 = load %struct.RunState*, %struct.RunState** %9, align 8 + %537 = getelementptr inbounds %struct.RunState, %struct.RunState* %536, i32 0, i32 4 + %538 = load float*, float** %537, align 8 + %539 = load %struct.RunState*, %struct.RunState** %9, align 8 + %540 = getelementptr inbounds %struct.RunState, %struct.RunState* %539, i32 0, i32 1 + %541 = load float*, float** %540, align 8 + %542 = load %struct.TransformerWeights*, %struct.TransformerWeights** %8, align 8 + %543 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %542, i32 0, i32 9 + %544 = load float*, float** %543, align 8 + %545 = load i64, i64* %17, align 8 + %546 = load i32, i32* %11, align 4 + %547 = sext i32 %546 to i64 + %548 = mul i64 %545, %547 + %549 = load i32, i32* %14, align 4 + %550 = sext i32 %549 to i64 + %551 = mul i64 %548, %550 + %552 = getelementptr inbounds float, float* %544, i64 %551 + %553 = load i32, i32* %11, align 4 + %554 = load i32, i32* %14, align 4 + call void @matmul(float* noundef %538, float* noundef %541, float* noundef %552, i32 noundef %553, i32 noundef %554) + store i32 0, i32* %43, align 4 + br label %555 + +555: ; preds = %590, %503 + %556 = load i32, i32* %43, align 4 + %557 = load i32, i32* %14, align 4 + %558 = icmp slt i32 %556, %557 + br i1 %558, label %559, label %593 + +559: ; preds = %555 + %560 = load %struct.RunState*, %struct.RunState** %9, align 8 + %561 = getelementptr inbounds %struct.RunState, %struct.RunState* %560, i32 0, i32 3 + %562 = load float*, float** %561, align 8 + %563 = load i32, i32* %43, align 4 + %564 = sext i32 %563 to i64 + %565 = getelementptr inbounds float, float* %562, i64 %564 + %566 = load float, float* %565, align 4 + store float %566, float* %44, align 4 + %567 = load float, float* %44, align 4 + %568 = fneg float %567 + %569 = call float @llvm.exp.f32(float %568) + %570 = fadd float 1.000000e+00, %569 + %571 = fdiv float 1.000000e+00, %570 + %572 = load float, float* %44, align 4 + %573 = fmul float %572, %571 + store float %573, float* %44, align 4 + %574 = load %struct.RunState*, %struct.RunState** %9, align 8 + %575 = getelementptr inbounds %struct.RunState, %struct.RunState* %574, i32 0, i32 4 + %576 = load float*, float** %575, align 8 + %577 = load i32, i32* %43, align 4 + %578 = sext i32 %577 to i64 + %579 = getelementptr inbounds float, float* %576, i64 %578 + %580 = load float, float* %579, align 4 + %581 = load float, float* %44, align 4 + %582 = fmul float %581, %580 + store float %582, float* %44, align 4 + %583 = load float, float* %44, align 4 + %584 = load %struct.RunState*, %struct.RunState** %9, align 8 + %585 = getelementptr inbounds %struct.RunState, %struct.RunState* %584, i32 0, i32 3 + %586 = load float*, float** %585, align 8 + %587 = load i32, i32* %43, align 4 + %588 = sext i32 %587 to i64 + %589 = getelementptr inbounds float, float* %586, i64 %588 + store float %583, float* %589, align 4 + br label %590 + +590: ; preds = %559 + %591 = load i32, i32* %43, align 4 + %592 = add nsw i32 %591, 1 + store i32 %592, i32* %43, align 4 + br label %555, !llvm.loop !26 + +593: ; preds = %555 + %594 = load %struct.RunState*, %struct.RunState** %9, align 8 + %595 = getelementptr inbounds %struct.RunState, %struct.RunState* %594, i32 0, i32 1 + %596 = load float*, float** %595, align 8 + %597 = load %struct.RunState*, %struct.RunState** %9, align 8 + %598 = getelementptr inbounds %struct.RunState, %struct.RunState* %597, i32 0, i32 3 + %599 = load float*, float** %598, align 8 + %600 = load %struct.TransformerWeights*, %struct.TransformerWeights** %8, align 8 + %601 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %600, i32 0, i32 8 + %602 = load float*, float** %601, align 8 + %603 = load i64, i64* %17, align 8 + %604 = load i32, i32* %11, align 4 + %605 = sext i32 %604 to i64 + %606 = mul i64 %603, %605 + %607 = load i32, i32* %14, align 4 + %608 = sext i32 %607 to i64 + %609 = mul i64 %606, %608 + %610 = getelementptr inbounds float, float* %602, i64 %609 + %611 = load i32, i32* %14, align 4 + %612 = load i32, i32* %11, align 4 + call void @matmul(float* noundef %596, float* noundef %599, float* noundef %610, i32 noundef %611, i32 noundef %612) + store i32 0, i32* %45, align 4 + br label %613 + +613: ; preds = %631, %593 + %614 = load i32, i32* %45, align 4 + %615 = load i32, i32* %11, align 4 + %616 = icmp slt i32 %614, %615 + br i1 %616, label %617, label %634 + +617: ; preds = %613 + %618 = load %struct.RunState*, %struct.RunState** %9, align 8 + %619 = getelementptr inbounds %struct.RunState, %struct.RunState* %618, i32 0, i32 1 + %620 = load float*, float** %619, align 8 + %621 = load i32, i32* %45, align 4 + %622 = sext i32 %621 to i64 + %623 = getelementptr inbounds float, float* %620, i64 %622 + %624 = load float, float* %623, align 4 + %625 = load float*, float** %10, align 8 + %626 = load i32, i32* %45, align 4 + %627 = sext i32 %626 to i64 + %628 = getelementptr inbounds float, float* %625, i64 %627 + %629 = load float, float* %628, align 4 + %630 = fadd float %629, %624 + store float %630, float* %628, align 4 + br label %631 + +631: ; preds = %617 + %632 = load i32, i32* %45, align 4 + %633 = add nsw i32 %632, 1 + store i32 %633, i32* %45, align 4 + br label %613, !llvm.loop !27 + +634: ; preds = %613 + br label %635 + +635: ; preds = %634 + %636 = load i64, i64* %17, align 8 + %637 = add i64 %636, 1 + store i64 %637, i64* %17, align 8 + br label %103, !llvm.loop !28 + +638: ; preds = %103 + %639 = load float*, float** %10, align 8 + %640 = load float*, float** %10, align 8 + %641 = load %struct.TransformerWeights*, %struct.TransformerWeights** %8, align 8 + %642 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %641, i32 0, i32 10 + %643 = load float*, float** %642, align 8 + %644 = load i32, i32* %11, align 4 + call void @rmsnorm(float* noundef %639, float* noundef %640, float* noundef %643, i32 noundef %644) + %645 = load %struct.RunState*, %struct.RunState** %9, align 8 + %646 = getelementptr inbounds %struct.RunState, %struct.RunState* %645, i32 0, i32 9 + %647 = load float*, float** %646, align 8 + %648 = load float*, float** %10, align 8 + %649 = load %struct.TransformerWeights*, %struct.TransformerWeights** %8, align 8 + %650 = getelementptr inbounds %struct.TransformerWeights, %struct.TransformerWeights* %649, i32 0, i32 11 + %651 = load float*, float** %650, align 8 + %652 = load %struct.Config*, %struct.Config** %7, align 8 + %653 = getelementptr inbounds %struct.Config, %struct.Config* %652, i32 0, i32 0 + %654 = load i32, i32* %653, align 4 + %655 = load %struct.Config*, %struct.Config** %7, align 8 + %656 = getelementptr inbounds %struct.Config, %struct.Config* %655, i32 0, i32 5 + %657 = load i32, i32* %656, align 4 + call void @matmul(float* noundef %647, float* noundef %648, float* noundef %651, i32 noundef %654, i32 noundef %657) + %658 = load %struct.RunState*, %struct.RunState** %9, align 8 + %659 = getelementptr inbounds %struct.RunState, %struct.RunState* %658, i32 0, i32 9 + %660 = load float*, float** %659, align 8 + ret float* %660 +} + +; Function Attrs: nounwind +declare i8* @__memcpy_chk(i8* noundef, i8* noundef, i64 noundef, i64 noundef) #6 + +; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn +declare i64 @llvm.objectsize.i64.p0i8(i8*, i1 immarg, i1 immarg, i1 immarg) #5 + +; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn +declare float @llvm.pow.f32(float, float) #5 + +; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn +declare float @llvm.cos.f32(float) #5 + +; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn +declare float @llvm.sin.f32(float) #5 + +; Function Attrs: nounwind +declare i8* @__memset_chk(i8* noundef, i32 noundef, i64 noundef, i64 noundef) #6 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define i32 @compare_tokens(i8* noundef %0, i8* noundef %1) #0 { + %3 = alloca i8*, align 8 + %4 = alloca i8*, align 8 + store i8* %0, i8** %3, align 8 + store i8* %1, i8** %4, align 8 + %5 = load i8*, i8** %3, align 8 + %6 = bitcast i8* %5 to %struct.TokenIndex* + %7 = getelementptr inbounds %struct.TokenIndex, %struct.TokenIndex* %6, i32 0, i32 0 + %8 = load i8*, i8** %7, align 8 + %9 = load i8*, i8** %4, align 8 + %10 = bitcast i8* %9 to %struct.TokenIndex* + %11 = getelementptr inbounds %struct.TokenIndex, %struct.TokenIndex* %10, i32 0, i32 0 + %12 = load i8*, i8** %11, align 8 + %13 = call i32 @strcmp(i8* noundef %8, i8* noundef %12) + ret i32 %13 +} + +declare i32 @strcmp(i8* noundef, i8* noundef) #2 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @build_tokenizer(%struct.Tokenizer* noundef %0, i8* noundef %1, i32 noundef %2) #0 { + %4 = alloca %struct.Tokenizer*, align 8 + %5 = alloca i8*, align 8 + %6 = alloca i32, align 4 + %7 = alloca i32, align 4 + %8 = alloca %struct.__sFILE*, align 8 + %9 = alloca i32, align 4 + %10 = alloca i32, align 4 + store %struct.Tokenizer* %0, %struct.Tokenizer** %4, align 8 + store i8* %1, i8** %5, align 8 + store i32 %2, i32* %6, align 4 + %11 = load i32, i32* %6, align 4 + %12 = load %struct.Tokenizer*, %struct.Tokenizer** %4, align 8 + %13 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %12, i32 0, i32 3 + store i32 %11, i32* %13, align 8 + %14 = load i32, i32* %6, align 4 + %15 = sext i32 %14 to i64 + %16 = mul i64 %15, 8 + %17 = call i8* @malloc(i64 noundef %16) #14 + %18 = bitcast i8* %17 to i8** + %19 = load %struct.Tokenizer*, %struct.Tokenizer** %4, align 8 + %20 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %19, i32 0, i32 0 + store i8** %18, i8*** %20, align 8 + %21 = load i32, i32* %6, align 4 + %22 = sext i32 %21 to i64 + %23 = mul i64 %22, 4 + %24 = call i8* @malloc(i64 noundef %23) #14 + %25 = bitcast i8* %24 to float* + %26 = load %struct.Tokenizer*, %struct.Tokenizer** %4, align 8 + %27 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %26, i32 0, i32 1 + store float* %25, float** %27, align 8 + %28 = load %struct.Tokenizer*, %struct.Tokenizer** %4, align 8 + %29 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %28, i32 0, i32 2 + store %struct.TokenIndex* null, %struct.TokenIndex** %29, align 8 + store i32 0, i32* %7, align 4 + br label %30 + +30: ; preds = %49, %3 + %31 = load i32, i32* %7, align 4 + %32 = icmp slt i32 %31, 256 + br i1 %32, label %33, label %52 + +33: ; preds = %30 + %34 = load i32, i32* %7, align 4 + %35 = trunc i32 %34 to i8 + %36 = load %struct.Tokenizer*, %struct.Tokenizer** %4, align 8 + %37 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %36, i32 0, i32 5 + %38 = load i32, i32* %7, align 4 + %39 = mul nsw i32 %38, 2 + %40 = sext i32 %39 to i64 + %41 = getelementptr inbounds [512 x i8], [512 x i8]* %37, i64 0, i64 %40 + store i8 %35, i8* %41, align 1 + %42 = load %struct.Tokenizer*, %struct.Tokenizer** %4, align 8 + %43 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %42, i32 0, i32 5 + %44 = load i32, i32* %7, align 4 + %45 = mul nsw i32 %44, 2 + %46 = add nsw i32 %45, 1 + %47 = sext i32 %46 to i64 + %48 = getelementptr inbounds [512 x i8], [512 x i8]* %43, i64 0, i64 %47 + store i8 0, i8* %48, align 1 + br label %49 + +49: ; preds = %33 + %50 = load i32, i32* %7, align 4 + %51 = add nsw i32 %50, 1 + store i32 %51, i32* %7, align 4 + br label %30, !llvm.loop !29 + +52: ; preds = %30 + %53 = load i8*, i8** %5, align 8 + %54 = call %struct.__sFILE* @"\01_fopen"(i8* noundef %53, i8* noundef getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i64 0, i64 0)) + store %struct.__sFILE* %54, %struct.__sFILE** %8, align 8 + %55 = load %struct.__sFILE*, %struct.__sFILE** %8, align 8 + %56 = icmp ne %struct.__sFILE* %55, null + br i1 %56, label %61, label %57 + +57: ; preds = %52 + %58 = load %struct.__sFILE*, %struct.__sFILE** @__stderrp, align 8 + %59 = load i8*, i8** %5, align 8 + %60 = call i32 (%struct.__sFILE*, i8*, ...) @fprintf(%struct.__sFILE* noundef %58, i8* noundef getelementptr inbounds ([18 x i8], [18 x i8]* @.str.5, i64 0, i64 0), i8* noundef %59) + call void @exit(i32 noundef 1) #11 + unreachable + +61: ; preds = %52 + %62 = load %struct.Tokenizer*, %struct.Tokenizer** %4, align 8 + %63 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %62, i32 0, i32 4 + %64 = bitcast i32* %63 to i8* + %65 = load %struct.__sFILE*, %struct.__sFILE** %8, align 8 + %66 = call i64 @fread(i8* noundef %64, i64 noundef 4, i64 noundef 1, %struct.__sFILE* noundef %65) + %67 = icmp ne i64 %66, 1 + br i1 %67, label %68, label %71 + +68: ; preds = %61 + %69 = load %struct.__sFILE*, %struct.__sFILE** @__stderrp, align 8 + %70 = call i32 (%struct.__sFILE*, i8*, ...) @fprintf(%struct.__sFILE* noundef %69, i8* noundef getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i64 0, i64 0)) + call void @exit(i32 noundef 1) #11 + unreachable + +71: ; preds = %61 + store i32 0, i32* %10, align 4 + br label %72 + +72: ; preds = %135, %71 + %73 = load i32, i32* %10, align 4 + %74 = load i32, i32* %6, align 4 + %75 = icmp slt i32 %73, %74 + br i1 %75, label %76, label %138 + +76: ; preds = %72 + %77 = load %struct.Tokenizer*, %struct.Tokenizer** %4, align 8 + %78 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %77, i32 0, i32 1 + %79 = load float*, float** %78, align 8 + %80 = load i32, i32* %10, align 4 + %81 = sext i32 %80 to i64 + %82 = getelementptr inbounds float, float* %79, i64 %81 + %83 = bitcast float* %82 to i8* + %84 = load %struct.__sFILE*, %struct.__sFILE** %8, align 8 + %85 = call i64 @fread(i8* noundef %83, i64 noundef 4, i64 noundef 1, %struct.__sFILE* noundef %84) + %86 = icmp ne i64 %85, 1 + br i1 %86, label %87, label %90 + +87: ; preds = %76 + %88 = load %struct.__sFILE*, %struct.__sFILE** @__stderrp, align 8 + %89 = call i32 (%struct.__sFILE*, i8*, ...) @fprintf(%struct.__sFILE* noundef %88, i8* noundef getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i64 0, i64 0)) + call void @exit(i32 noundef 1) #11 + unreachable + +90: ; preds = %76 + %91 = bitcast i32* %9 to i8* + %92 = load %struct.__sFILE*, %struct.__sFILE** %8, align 8 + %93 = call i64 @fread(i8* noundef %91, i64 noundef 4, i64 noundef 1, %struct.__sFILE* noundef %92) + %94 = icmp ne i64 %93, 1 + br i1 %94, label %95, label %98 + +95: ; preds = %90 + %96 = load %struct.__sFILE*, %struct.__sFILE** @__stderrp, align 8 + %97 = call i32 (%struct.__sFILE*, i8*, ...) @fprintf(%struct.__sFILE* noundef %96, i8* noundef getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i64 0, i64 0)) + call void @exit(i32 noundef 1) #11 + unreachable + +98: ; preds = %90 + %99 = load i32, i32* %9, align 4 + %100 = add nsw i32 %99, 1 + %101 = sext i32 %100 to i64 + %102 = call i8* @malloc(i64 noundef %101) #14 + %103 = load %struct.Tokenizer*, %struct.Tokenizer** %4, align 8 + %104 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %103, i32 0, i32 0 + %105 = load i8**, i8*** %104, align 8 + %106 = load i32, i32* %10, align 4 + %107 = sext i32 %106 to i64 + %108 = getelementptr inbounds i8*, i8** %105, i64 %107 + store i8* %102, i8** %108, align 8 + %109 = load %struct.Tokenizer*, %struct.Tokenizer** %4, align 8 + %110 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %109, i32 0, i32 0 + %111 = load i8**, i8*** %110, align 8 + %112 = load i32, i32* %10, align 4 + %113 = sext i32 %112 to i64 + %114 = getelementptr inbounds i8*, i8** %111, i64 %113 + %115 = load i8*, i8** %114, align 8 + %116 = load i32, i32* %9, align 4 + %117 = sext i32 %116 to i64 + %118 = load %struct.__sFILE*, %struct.__sFILE** %8, align 8 + %119 = call i64 @fread(i8* noundef %115, i64 noundef %117, i64 noundef 1, %struct.__sFILE* noundef %118) + %120 = icmp ne i64 %119, 1 + br i1 %120, label %121, label %124 + +121: ; preds = %98 + %122 = load %struct.__sFILE*, %struct.__sFILE** @__stderrp, align 8 + %123 = call i32 (%struct.__sFILE*, i8*, ...) @fprintf(%struct.__sFILE* noundef %122, i8* noundef getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i64 0, i64 0)) + call void @exit(i32 noundef 1) #11 + unreachable + +124: ; preds = %98 + %125 = load %struct.Tokenizer*, %struct.Tokenizer** %4, align 8 + %126 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %125, i32 0, i32 0 + %127 = load i8**, i8*** %126, align 8 + %128 = load i32, i32* %10, align 4 + %129 = sext i32 %128 to i64 + %130 = getelementptr inbounds i8*, i8** %127, i64 %129 + %131 = load i8*, i8** %130, align 8 + %132 = load i32, i32* %9, align 4 + %133 = sext i32 %132 to i64 + %134 = getelementptr inbounds i8, i8* %131, i64 %133 + store i8 0, i8* %134, align 1 + br label %135 + +135: ; preds = %124 + %136 = load i32, i32* %10, align 4 + %137 = add nsw i32 %136, 1 + store i32 %137, i32* %10, align 4 + br label %72, !llvm.loop !30 + +138: ; preds = %72 + %139 = load %struct.__sFILE*, %struct.__sFILE** %8, align 8 + %140 = call i32 @fclose(%struct.__sFILE* noundef %139) + ret void +} + +; Function Attrs: allocsize(0) +declare i8* @malloc(i64 noundef) #7 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @free_tokenizer(%struct.Tokenizer* noundef %0) #0 { + %2 = alloca %struct.Tokenizer*, align 8 + %3 = alloca i32, align 4 + store %struct.Tokenizer* %0, %struct.Tokenizer** %2, align 8 + store i32 0, i32* %3, align 4 + br label %4 + +4: ; preds = %18, %1 + %5 = load i32, i32* %3, align 4 + %6 = load %struct.Tokenizer*, %struct.Tokenizer** %2, align 8 + %7 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %6, i32 0, i32 3 + %8 = load i32, i32* %7, align 8 + %9 = icmp slt i32 %5, %8 + br i1 %9, label %10, label %21 + +10: ; preds = %4 + %11 = load %struct.Tokenizer*, %struct.Tokenizer** %2, align 8 + %12 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %11, i32 0, i32 0 + %13 = load i8**, i8*** %12, align 8 + %14 = load i32, i32* %3, align 4 + %15 = sext i32 %14 to i64 + %16 = getelementptr inbounds i8*, i8** %13, i64 %15 + %17 = load i8*, i8** %16, align 8 + call void @free(i8* noundef %17) + br label %18 + +18: ; preds = %10 + %19 = load i32, i32* %3, align 4 + %20 = add nsw i32 %19, 1 + store i32 %20, i32* %3, align 4 + br label %4, !llvm.loop !31 + +21: ; preds = %4 + %22 = load %struct.Tokenizer*, %struct.Tokenizer** %2, align 8 + %23 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %22, i32 0, i32 0 + %24 = load i8**, i8*** %23, align 8 + %25 = bitcast i8** %24 to i8* + call void @free(i8* noundef %25) + %26 = load %struct.Tokenizer*, %struct.Tokenizer** %2, align 8 + %27 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %26, i32 0, i32 1 + %28 = load float*, float** %27, align 8 + %29 = bitcast float* %28 to i8* + call void @free(i8* noundef %29) + %30 = load %struct.Tokenizer*, %struct.Tokenizer** %2, align 8 + %31 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %30, i32 0, i32 2 + %32 = load %struct.TokenIndex*, %struct.TokenIndex** %31, align 8 + %33 = bitcast %struct.TokenIndex* %32 to i8* + call void @free(i8* noundef %33) + ret void +} + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define i8* @decode(%struct.Tokenizer* noundef %0, i32 noundef %1, i32 noundef %2) #0 { + %4 = alloca %struct.Tokenizer*, align 8 + %5 = alloca i32, align 4 + %6 = alloca i32, align 4 + %7 = alloca i8*, align 8 + %8 = alloca i8, align 1 + store %struct.Tokenizer* %0, %struct.Tokenizer** %4, align 8 + store i32 %1, i32* %5, align 4 + store i32 %2, i32* %6, align 4 + %9 = load %struct.Tokenizer*, %struct.Tokenizer** %4, align 8 + %10 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %9, i32 0, i32 0 + %11 = load i8**, i8*** %10, align 8 + %12 = load i32, i32* %6, align 4 + %13 = sext i32 %12 to i64 + %14 = getelementptr inbounds i8*, i8** %11, i64 %13 + %15 = load i8*, i8** %14, align 8 + store i8* %15, i8** %7, align 8 + %16 = load i32, i32* %5, align 4 + %17 = icmp eq i32 %16, 1 + br i1 %17, label %18, label %27 + +18: ; preds = %3 + %19 = load i8*, i8** %7, align 8 + %20 = getelementptr inbounds i8, i8* %19, i64 0 + %21 = load i8, i8* %20, align 1 + %22 = sext i8 %21 to i32 + %23 = icmp eq i32 %22, 32 + br i1 %23, label %24, label %27 + +24: ; preds = %18 + %25 = load i8*, i8** %7, align 8 + %26 = getelementptr inbounds i8, i8* %25, i32 1 + store i8* %26, i8** %7, align 8 + br label %27 + +27: ; preds = %24, %18, %3 + %28 = load i8*, i8** %7, align 8 + %29 = call i32 (i8*, i8*, ...) @sscanf(i8* noundef %28, i8* noundef getelementptr inbounds ([11 x i8], [11 x i8]* @.str.7, i64 0, i64 0), i8* noundef %8) + %30 = icmp eq i32 %29, 1 + br i1 %30, label %31, label %40 + +31: ; preds = %27 + %32 = load %struct.Tokenizer*, %struct.Tokenizer** %4, align 8 + %33 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %32, i32 0, i32 5 + %34 = getelementptr inbounds [512 x i8], [512 x i8]* %33, i64 0, i64 0 + %35 = load i8, i8* %8, align 1 + %36 = zext i8 %35 to i32 + %37 = mul nsw i32 %36, 2 + %38 = sext i32 %37 to i64 + %39 = getelementptr inbounds i8, i8* %34, i64 %38 + store i8* %39, i8** %7, align 8 + br label %40 + +40: ; preds = %31, %27 + %41 = load i8*, i8** %7, align 8 + ret i8* %41 +} + +declare i32 @sscanf(i8* noundef, i8* noundef, ...) #2 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @safe_printf(i8* noundef %0) #0 { + %2 = alloca i8*, align 8 + %3 = alloca i8, align 1 + store i8* %0, i8** %2, align 8 + %4 = load i8*, i8** %2, align 8 + %5 = icmp eq i8* %4, null + br i1 %5, label %6, label %7 + +6: ; preds = %1 + br label %38 + +7: ; preds = %1 + %8 = load i8*, i8** %2, align 8 + %9 = getelementptr inbounds i8, i8* %8, i64 0 + %10 = load i8, i8* %9, align 1 + %11 = sext i8 %10 to i32 + %12 = icmp eq i32 %11, 0 + br i1 %12, label %13, label %14 + +13: ; preds = %7 + br label %38 + +14: ; preds = %7 + %15 = load i8*, i8** %2, align 8 + %16 = getelementptr inbounds i8, i8* %15, i64 1 + %17 = load i8, i8* %16, align 1 + %18 = sext i8 %17 to i32 + %19 = icmp eq i32 %18, 0 + br i1 %19, label %20, label %35 + +20: ; preds = %14 + %21 = load i8*, i8** %2, align 8 + %22 = getelementptr inbounds i8, i8* %21, i64 0 + %23 = load i8, i8* %22, align 1 + store i8 %23, i8* %3, align 1 + %24 = load i8, i8* %3, align 1 + %25 = zext i8 %24 to i32 + %26 = call i32 @isprint(i32 noundef %25) #15 + %27 = icmp ne i32 %26, 0 + br i1 %27, label %34, label %28 + +28: ; preds = %20 + %29 = load i8, i8* %3, align 1 + %30 = zext i8 %29 to i32 + %31 = call i32 @isspace(i32 noundef %30) #15 + %32 = icmp ne i32 %31, 0 + br i1 %32, label %34, label %33 + +33: ; preds = %28 + br label %38 + +34: ; preds = %28, %20 + br label %35 + +35: ; preds = %34, %14 + %36 = load i8*, i8** %2, align 8 + %37 = call i32 (i8*, ...) @printf(i8* noundef getelementptr inbounds ([3 x i8], [3 x i8]* @.str.8, i64 0, i64 0), i8* noundef %36) + br label %38 + +38: ; preds = %35, %33, %13, %6 + ret void +} + +; Function Attrs: nounwind readonly willreturn +declare i32 @isprint(i32 noundef) #8 + +; Function Attrs: nounwind readonly willreturn +declare i32 @isspace(i32 noundef) #8 + +declare i32 @printf(i8* noundef, ...) #2 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define i32 @str_lookup(i8* noundef %0, %struct.TokenIndex* noundef %1, i32 noundef %2) #0 { + %4 = alloca i8*, align 8 + %5 = alloca %struct.TokenIndex*, align 8 + %6 = alloca i32, align 4 + %7 = alloca %struct.TokenIndex, align 8 + %8 = alloca %struct.TokenIndex*, align 8 + store i8* %0, i8** %4, align 8 + store %struct.TokenIndex* %1, %struct.TokenIndex** %5, align 8 + store i32 %2, i32* %6, align 4 + %9 = getelementptr inbounds %struct.TokenIndex, %struct.TokenIndex* %7, i32 0, i32 0 + %10 = load i8*, i8** %4, align 8 + store i8* %10, i8** %9, align 8 + %11 = getelementptr inbounds %struct.TokenIndex, %struct.TokenIndex* %7, i32 0, i32 1 + store i32 0, i32* %11, align 8 + %12 = bitcast %struct.TokenIndex* %7 to i8* + %13 = load %struct.TokenIndex*, %struct.TokenIndex** %5, align 8 + %14 = bitcast %struct.TokenIndex* %13 to i8* + %15 = load i32, i32* %6, align 4 + %16 = sext i32 %15 to i64 + %17 = call i8* @bsearch(i8* noundef %12, i8* noundef %14, i64 noundef %16, i64 noundef 16, i32 (i8*, i8*)* noundef @compare_tokens) + %18 = bitcast i8* %17 to %struct.TokenIndex* + store %struct.TokenIndex* %18, %struct.TokenIndex** %8, align 8 + %19 = load %struct.TokenIndex*, %struct.TokenIndex** %8, align 8 + %20 = icmp ne %struct.TokenIndex* %19, null + br i1 %20, label %21, label %25 + +21: ; preds = %3 + %22 = load %struct.TokenIndex*, %struct.TokenIndex** %8, align 8 + %23 = getelementptr inbounds %struct.TokenIndex, %struct.TokenIndex* %22, i32 0, i32 1 + %24 = load i32, i32* %23, align 8 + br label %26 + +25: ; preds = %3 + br label %26 + +26: ; preds = %25, %21 + %27 = phi i32 [ %24, %21 ], [ -1, %25 ] + ret i32 %27 +} + +declare i8* @bsearch(i8* noundef, i8* noundef, i64 noundef, i64 noundef, i32 (i8*, i8*)* noundef) #2 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @encode(%struct.Tokenizer* noundef %0, i8* noundef %1, i8 noundef signext %2, i8 noundef signext %3, i32* noundef %4, i32* noundef %5) #0 { + %7 = alloca %struct.Tokenizer*, align 8 + %8 = alloca i8*, align 8 + %9 = alloca i8, align 1 + %10 = alloca i8, align 1 + %11 = alloca i32*, align 8 + %12 = alloca i32*, align 8 + %13 = alloca i32, align 4 + %14 = alloca i8*, align 8 + %15 = alloca i64, align 8 + %16 = alloca i32, align 4 + %17 = alloca i8*, align 8 + %18 = alloca i32, align 4 + %19 = alloca i32, align 4 + %20 = alloca float, align 4 + %21 = alloca i32, align 4 + %22 = alloca i32, align 4 + %23 = alloca i32, align 4 + %24 = alloca i32, align 4 + %25 = alloca i32, align 4 + store %struct.Tokenizer* %0, %struct.Tokenizer** %7, align 8 + store i8* %1, i8** %8, align 8 + store i8 %2, i8* %9, align 1 + store i8 %3, i8* %10, align 1 + store i32* %4, i32** %11, align 8 + store i32* %5, i32** %12, align 8 + %26 = load i8*, i8** %8, align 8 + %27 = icmp eq i8* %26, null + br i1 %27, label %28, label %31 + +28: ; preds = %6 + %29 = load %struct.__sFILE*, %struct.__sFILE** @__stderrp, align 8 + %30 = call i32 (%struct.__sFILE*, i8*, ...) @fprintf(%struct.__sFILE* noundef %29, i8* noundef getelementptr inbounds ([25 x i8], [25 x i8]* @.str.9, i64 0, i64 0)) + call void @exit(i32 noundef 1) #11 + unreachable + +31: ; preds = %6 + %32 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %33 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %32, i32 0, i32 2 + %34 = load %struct.TokenIndex*, %struct.TokenIndex** %33, align 8 + %35 = icmp eq %struct.TokenIndex* %34, null + br i1 %35, label %36, label %87 + +36: ; preds = %31 + %37 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %38 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %37, i32 0, i32 3 + %39 = load i32, i32* %38, align 8 + %40 = sext i32 %39 to i64 + %41 = mul i64 %40, 16 + %42 = call i8* @malloc(i64 noundef %41) #14 + %43 = bitcast i8* %42 to %struct.TokenIndex* + %44 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %45 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %44, i32 0, i32 2 + store %struct.TokenIndex* %43, %struct.TokenIndex** %45, align 8 + store i32 0, i32* %13, align 4 + br label %46 + +46: ; preds = %75, %36 + %47 = load i32, i32* %13, align 4 + %48 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %49 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %48, i32 0, i32 3 + %50 = load i32, i32* %49, align 8 + %51 = icmp slt i32 %47, %50 + br i1 %51, label %52, label %78 + +52: ; preds = %46 + %53 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %54 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %53, i32 0, i32 0 + %55 = load i8**, i8*** %54, align 8 + %56 = load i32, i32* %13, align 4 + %57 = sext i32 %56 to i64 + %58 = getelementptr inbounds i8*, i8** %55, i64 %57 + %59 = load i8*, i8** %58, align 8 + %60 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %61 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %60, i32 0, i32 2 + %62 = load %struct.TokenIndex*, %struct.TokenIndex** %61, align 8 + %63 = load i32, i32* %13, align 4 + %64 = sext i32 %63 to i64 + %65 = getelementptr inbounds %struct.TokenIndex, %struct.TokenIndex* %62, i64 %64 + %66 = getelementptr inbounds %struct.TokenIndex, %struct.TokenIndex* %65, i32 0, i32 0 + store i8* %59, i8** %66, align 8 + %67 = load i32, i32* %13, align 4 + %68 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %69 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %68, i32 0, i32 2 + %70 = load %struct.TokenIndex*, %struct.TokenIndex** %69, align 8 + %71 = load i32, i32* %13, align 4 + %72 = sext i32 %71 to i64 + %73 = getelementptr inbounds %struct.TokenIndex, %struct.TokenIndex* %70, i64 %72 + %74 = getelementptr inbounds %struct.TokenIndex, %struct.TokenIndex* %73, i32 0, i32 1 + store i32 %67, i32* %74, align 8 + br label %75 + +75: ; preds = %52 + %76 = load i32, i32* %13, align 4 + %77 = add nsw i32 %76, 1 + store i32 %77, i32* %13, align 4 + br label %46, !llvm.loop !32 + +78: ; preds = %46 + %79 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %80 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %79, i32 0, i32 2 + %81 = load %struct.TokenIndex*, %struct.TokenIndex** %80, align 8 + %82 = bitcast %struct.TokenIndex* %81 to i8* + %83 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %84 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %83, i32 0, i32 3 + %85 = load i32, i32* %84, align 8 + %86 = sext i32 %85 to i64 + call void @qsort(i8* noundef %82, i64 noundef %86, i64 noundef 16, i32 (i8*, i8*)* noundef @compare_tokens) + br label %87 + +87: ; preds = %78, %31 + %88 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %89 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %88, i32 0, i32 4 + %90 = load i32, i32* %89, align 4 + %91 = mul i32 %90, 2 + %92 = add i32 %91, 1 + %93 = add i32 %92, 2 + %94 = zext i32 %93 to i64 + %95 = mul i64 %94, 1 + %96 = call i8* @malloc(i64 noundef %95) #14 + store i8* %96, i8** %14, align 8 + store i64 0, i64* %15, align 8 + %97 = load i32*, i32** %12, align 8 + store i32 0, i32* %97, align 4 + %98 = load i8, i8* %9, align 1 + %99 = icmp ne i8 %98, 0 + br i1 %99, label %100, label %107 + +100: ; preds = %87 + %101 = load i32*, i32** %11, align 8 + %102 = load i32*, i32** %12, align 8 + %103 = load i32, i32* %102, align 4 + %104 = add nsw i32 %103, 1 + store i32 %104, i32* %102, align 4 + %105 = sext i32 %103 to i64 + %106 = getelementptr inbounds i32, i32* %101, i64 %105 + store i32 1, i32* %106, align 4 + br label %107 + +107: ; preds = %100, %87 + %108 = load i8*, i8** %8, align 8 + %109 = getelementptr inbounds i8, i8* %108, i64 0 + %110 = load i8, i8* %109, align 1 + %111 = sext i8 %110 to i32 + %112 = icmp ne i32 %111, 0 + br i1 %112, label %113, label %128 + +113: ; preds = %107 + %114 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %115 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %114, i32 0, i32 2 + %116 = load %struct.TokenIndex*, %struct.TokenIndex** %115, align 8 + %117 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %118 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %117, i32 0, i32 3 + %119 = load i32, i32* %118, align 8 + %120 = call i32 @str_lookup(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @.str.10, i64 0, i64 0), %struct.TokenIndex* noundef %116, i32 noundef %119) + store i32 %120, i32* %16, align 4 + %121 = load i32, i32* %16, align 4 + %122 = load i32*, i32** %11, align 8 + %123 = load i32*, i32** %12, align 8 + %124 = load i32, i32* %123, align 4 + %125 = add nsw i32 %124, 1 + store i32 %125, i32* %123, align 4 + %126 = sext i32 %124 to i64 + %127 = getelementptr inbounds i32, i32* %122, i64 %126 + store i32 %121, i32* %127, align 4 + br label %128 + +128: ; preds = %113, %107 + %129 = load i8*, i8** %8, align 8 + store i8* %129, i8** %17, align 8 + br label %130 + +130: ; preds = %206, %128 + %131 = load i8*, i8** %17, align 8 + %132 = load i8, i8* %131, align 1 + %133 = sext i8 %132 to i32 + %134 = icmp ne i32 %133, 0 + br i1 %134, label %135, label %209 + +135: ; preds = %130 + %136 = load i8*, i8** %17, align 8 + %137 = load i8, i8* %136, align 1 + %138 = sext i8 %137 to i32 + %139 = and i32 %138, 192 + %140 = icmp ne i32 %139, 128 + br i1 %140, label %141, label %142 + +141: ; preds = %135 + store i64 0, i64* %15, align 8 + br label %142 + +142: ; preds = %141, %135 + %143 = load i8*, i8** %17, align 8 + %144 = load i8, i8* %143, align 1 + %145 = load i8*, i8** %14, align 8 + %146 = load i64, i64* %15, align 8 + %147 = add i64 %146, 1 + store i64 %147, i64* %15, align 8 + %148 = getelementptr inbounds i8, i8* %145, i64 %146 + store i8 %144, i8* %148, align 1 + %149 = load i8*, i8** %14, align 8 + %150 = load i64, i64* %15, align 8 + %151 = getelementptr inbounds i8, i8* %149, i64 %150 + store i8 0, i8* %151, align 1 + %152 = load i8*, i8** %17, align 8 + %153 = getelementptr inbounds i8, i8* %152, i64 1 + %154 = load i8, i8* %153, align 1 + %155 = sext i8 %154 to i32 + %156 = and i32 %155, 192 + %157 = icmp eq i32 %156, 128 + br i1 %157, label %158, label %162 + +158: ; preds = %142 + %159 = load i64, i64* %15, align 8 + %160 = icmp ult i64 %159, 4 + br i1 %160, label %161, label %162 + +161: ; preds = %158 + br label %206 + +162: ; preds = %158, %142 + %163 = load i8*, i8** %14, align 8 + %164 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %165 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %164, i32 0, i32 2 + %166 = load %struct.TokenIndex*, %struct.TokenIndex** %165, align 8 + %167 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %168 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %167, i32 0, i32 3 + %169 = load i32, i32* %168, align 8 + %170 = call i32 @str_lookup(i8* noundef %163, %struct.TokenIndex* noundef %166, i32 noundef %169) + store i32 %170, i32* %18, align 4 + %171 = load i32, i32* %18, align 4 + %172 = icmp ne i32 %171, -1 + br i1 %172, label %173, label %181 + +173: ; preds = %162 + %174 = load i32, i32* %18, align 4 + %175 = load i32*, i32** %11, align 8 + %176 = load i32*, i32** %12, align 8 + %177 = load i32, i32* %176, align 4 + %178 = add nsw i32 %177, 1 + store i32 %178, i32* %176, align 4 + %179 = sext i32 %177 to i64 + %180 = getelementptr inbounds i32, i32* %175, i64 %179 + store i32 %174, i32* %180, align 4 + br label %205 + +181: ; preds = %162 + store i32 0, i32* %19, align 4 + br label %182 + +182: ; preds = %201, %181 + %183 = load i32, i32* %19, align 4 + %184 = sext i32 %183 to i64 + %185 = load i64, i64* %15, align 8 + %186 = icmp ult i64 %184, %185 + br i1 %186, label %187, label %204 + +187: ; preds = %182 + %188 = load i8*, i8** %14, align 8 + %189 = load i32, i32* %19, align 4 + %190 = sext i32 %189 to i64 + %191 = getelementptr inbounds i8, i8* %188, i64 %190 + %192 = load i8, i8* %191, align 1 + %193 = zext i8 %192 to i32 + %194 = add nsw i32 %193, 3 + %195 = load i32*, i32** %11, align 8 + %196 = load i32*, i32** %12, align 8 + %197 = load i32, i32* %196, align 4 + %198 = add nsw i32 %197, 1 + store i32 %198, i32* %196, align 4 + %199 = sext i32 %197 to i64 + %200 = getelementptr inbounds i32, i32* %195, i64 %199 + store i32 %194, i32* %200, align 4 + br label %201 + +201: ; preds = %187 + %202 = load i32, i32* %19, align 4 + %203 = add nsw i32 %202, 1 + store i32 %203, i32* %19, align 4 + br label %182, !llvm.loop !33 + +204: ; preds = %182 + br label %205 + +205: ; preds = %204, %173 + store i64 0, i64* %15, align 8 + br label %206 + +206: ; preds = %205, %161 + %207 = load i8*, i8** %17, align 8 + %208 = getelementptr inbounds i8, i8* %207, i32 1 + store i8* %208, i8** %17, align 8 + br label %130, !llvm.loop !34 + +209: ; preds = %130 + br label %210 + +210: ; preds = %209, %311 + store float -1.000000e+10, float* %20, align 4 + store i32 -1, i32* %21, align 4 + store i32 -1, i32* %22, align 4 + store i32 0, i32* %23, align 4 + br label %211 + +211: ; preds = %276, %210 + %212 = load i32, i32* %23, align 4 + %213 = load i32*, i32** %12, align 8 + %214 = load i32, i32* %213, align 4 + %215 = sub nsw i32 %214, 1 + %216 = icmp slt i32 %212, %215 + br i1 %216, label %217, label %279 + +217: ; preds = %211 + %218 = load i8*, i8** %14, align 8 + %219 = load i8*, i8** %14, align 8 + %220 = call i64 @llvm.objectsize.i64.p0i8(i8* %219, i1 false, i1 true, i1 false) + %221 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %222 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %221, i32 0, i32 0 + %223 = load i8**, i8*** %222, align 8 + %224 = load i32*, i32** %11, align 8 + %225 = load i32, i32* %23, align 4 + %226 = sext i32 %225 to i64 + %227 = getelementptr inbounds i32, i32* %224, i64 %226 + %228 = load i32, i32* %227, align 4 + %229 = sext i32 %228 to i64 + %230 = getelementptr inbounds i8*, i8** %223, i64 %229 + %231 = load i8*, i8** %230, align 8 + %232 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %233 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %232, i32 0, i32 0 + %234 = load i8**, i8*** %233, align 8 + %235 = load i32*, i32** %11, align 8 + %236 = load i32, i32* %23, align 4 + %237 = add nsw i32 %236, 1 + %238 = sext i32 %237 to i64 + %239 = getelementptr inbounds i32, i32* %235, i64 %238 + %240 = load i32, i32* %239, align 4 + %241 = sext i32 %240 to i64 + %242 = getelementptr inbounds i8*, i8** %234, i64 %241 + %243 = load i8*, i8** %242, align 8 + %244 = call i32 (i8*, i32, i64, i8*, ...) @__sprintf_chk(i8* noundef %218, i32 noundef 0, i64 noundef %220, i8* noundef getelementptr inbounds ([5 x i8], [5 x i8]* @.str.11, i64 0, i64 0), i8* noundef %231, i8* noundef %243) + %245 = load i8*, i8** %14, align 8 + %246 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %247 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %246, i32 0, i32 2 + %248 = load %struct.TokenIndex*, %struct.TokenIndex** %247, align 8 + %249 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %250 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %249, i32 0, i32 3 + %251 = load i32, i32* %250, align 8 + %252 = call i32 @str_lookup(i8* noundef %245, %struct.TokenIndex* noundef %248, i32 noundef %251) + store i32 %252, i32* %24, align 4 + %253 = load i32, i32* %24, align 4 + %254 = icmp ne i32 %253, -1 + br i1 %254, label %255, label %275 + +255: ; preds = %217 + %256 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %257 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %256, i32 0, i32 1 + %258 = load float*, float** %257, align 8 + %259 = load i32, i32* %24, align 4 + %260 = sext i32 %259 to i64 + %261 = getelementptr inbounds float, float* %258, i64 %260 + %262 = load float, float* %261, align 4 + %263 = load float, float* %20, align 4 + %264 = fcmp ogt float %262, %263 + br i1 %264, label %265, label %275 + +265: ; preds = %255 + %266 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %267 = getelementptr inbounds %struct.Tokenizer, %struct.Tokenizer* %266, i32 0, i32 1 + %268 = load float*, float** %267, align 8 + %269 = load i32, i32* %24, align 4 + %270 = sext i32 %269 to i64 + %271 = getelementptr inbounds float, float* %268, i64 %270 + %272 = load float, float* %271, align 4 + store float %272, float* %20, align 4 + %273 = load i32, i32* %24, align 4 + store i32 %273, i32* %21, align 4 + %274 = load i32, i32* %23, align 4 + store i32 %274, i32* %22, align 4 + br label %275 + +275: ; preds = %265, %255, %217 + br label %276 + +276: ; preds = %275 + %277 = load i32, i32* %23, align 4 + %278 = add nsw i32 %277, 1 + store i32 %278, i32* %23, align 4 + br label %211, !llvm.loop !35 + +279: ; preds = %211 + %280 = load i32, i32* %22, align 4 + %281 = icmp eq i32 %280, -1 + br i1 %281, label %282, label %283 + +282: ; preds = %279 + br label %315 + +283: ; preds = %279 + %284 = load i32, i32* %21, align 4 + %285 = load i32*, i32** %11, align 8 + %286 = load i32, i32* %22, align 4 + %287 = sext i32 %286 to i64 + %288 = getelementptr inbounds i32, i32* %285, i64 %287 + store i32 %284, i32* %288, align 4 + %289 = load i32, i32* %22, align 4 + %290 = add nsw i32 %289, 1 + store i32 %290, i32* %25, align 4 + br label %291 + +291: ; preds = %308, %283 + %292 = load i32, i32* %25, align 4 + %293 = load i32*, i32** %12, align 8 + %294 = load i32, i32* %293, align 4 + %295 = sub nsw i32 %294, 1 + %296 = icmp slt i32 %292, %295 + br i1 %296, label %297, label %311 + +297: ; preds = %291 + %298 = load i32*, i32** %11, align 8 + %299 = load i32, i32* %25, align 4 + %300 = add nsw i32 %299, 1 + %301 = sext i32 %300 to i64 + %302 = getelementptr inbounds i32, i32* %298, i64 %301 + %303 = load i32, i32* %302, align 4 + %304 = load i32*, i32** %11, align 8 + %305 = load i32, i32* %25, align 4 + %306 = sext i32 %305 to i64 + %307 = getelementptr inbounds i32, i32* %304, i64 %306 + store i32 %303, i32* %307, align 4 + br label %308 + +308: ; preds = %297 + %309 = load i32, i32* %25, align 4 + %310 = add nsw i32 %309, 1 + store i32 %310, i32* %25, align 4 + br label %291, !llvm.loop !36 + +311: ; preds = %291 + %312 = load i32*, i32** %12, align 8 + %313 = load i32, i32* %312, align 4 + %314 = add nsw i32 %313, -1 + store i32 %314, i32* %312, align 4 + br label %210 + +315: ; preds = %282 + %316 = load i8, i8* %10, align 1 + %317 = icmp ne i8 %316, 0 + br i1 %317, label %318, label %325 + +318: ; preds = %315 + %319 = load i32*, i32** %11, align 8 + %320 = load i32*, i32** %12, align 8 + %321 = load i32, i32* %320, align 4 + %322 = add nsw i32 %321, 1 + store i32 %322, i32* %320, align 4 + %323 = sext i32 %321 to i64 + %324 = getelementptr inbounds i32, i32* %319, i64 %323 + store i32 2, i32* %324, align 4 + br label %325 + +325: ; preds = %318, %315 + %326 = load i8*, i8** %14, align 8 + call void @free(i8* noundef %326) + ret void +} + +declare void @qsort(i8* noundef, i64 noundef, i64 noundef, i32 (i8*, i8*)* noundef) #2 + +declare i32 @__sprintf_chk(i8* noundef, i32 noundef, i64 noundef, i8* noundef, ...) #2 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define i32 @sample_argmax(float* noundef %0, i32 noundef %1) #0 { + %3 = alloca float*, align 8 + %4 = alloca i32, align 4 + %5 = alloca i32, align 4 + %6 = alloca float, align 4 + %7 = alloca i32, align 4 + store float* %0, float** %3, align 8 + store i32 %1, i32* %4, align 4 + store i32 0, i32* %5, align 4 + %8 = load float*, float** %3, align 8 + %9 = getelementptr inbounds float, float* %8, i64 0 + %10 = load float, float* %9, align 4 + store float %10, float* %6, align 4 + store i32 1, i32* %7, align 4 + br label %11 + +11: ; preds = %31, %2 + %12 = load i32, i32* %7, align 4 + %13 = load i32, i32* %4, align 4 + %14 = icmp slt i32 %12, %13 + br i1 %14, label %15, label %34 + +15: ; preds = %11 + %16 = load float*, float** %3, align 8 + %17 = load i32, i32* %7, align 4 + %18 = sext i32 %17 to i64 + %19 = getelementptr inbounds float, float* %16, i64 %18 + %20 = load float, float* %19, align 4 + %21 = load float, float* %6, align 4 + %22 = fcmp ogt float %20, %21 + br i1 %22, label %23, label %30 + +23: ; preds = %15 + %24 = load i32, i32* %7, align 4 + store i32 %24, i32* %5, align 4 + %25 = load float*, float** %3, align 8 + %26 = load i32, i32* %7, align 4 + %27 = sext i32 %26 to i64 + %28 = getelementptr inbounds float, float* %25, i64 %27 + %29 = load float, float* %28, align 4 + store float %29, float* %6, align 4 + br label %30 + +30: ; preds = %23, %15 + br label %31 + +31: ; preds = %30 + %32 = load i32, i32* %7, align 4 + %33 = add nsw i32 %32, 1 + store i32 %33, i32* %7, align 4 + br label %11, !llvm.loop !37 + +34: ; preds = %11 + %35 = load i32, i32* %5, align 4 + ret i32 %35 +} + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define i32 @sample_mult(float* noundef %0, i32 noundef %1, float noundef %2) #0 { + %4 = alloca i32, align 4 + %5 = alloca float*, align 8 + %6 = alloca i32, align 4 + %7 = alloca float, align 4 + %8 = alloca float, align 4 + %9 = alloca i32, align 4 + store float* %0, float** %5, align 8 + store i32 %1, i32* %6, align 4 + store float %2, float* %7, align 4 + store float 0.000000e+00, float* %8, align 4 + store i32 0, i32* %9, align 4 + br label %10 + +10: ; preds = %28, %3 + %11 = load i32, i32* %9, align 4 + %12 = load i32, i32* %6, align 4 + %13 = icmp slt i32 %11, %12 + br i1 %13, label %14, label %31 + +14: ; preds = %10 + %15 = load float*, float** %5, align 8 + %16 = load i32, i32* %9, align 4 + %17 = sext i32 %16 to i64 + %18 = getelementptr inbounds float, float* %15, i64 %17 + %19 = load float, float* %18, align 4 + %20 = load float, float* %8, align 4 + %21 = fadd float %20, %19 + store float %21, float* %8, align 4 + %22 = load float, float* %7, align 4 + %23 = load float, float* %8, align 4 + %24 = fcmp olt float %22, %23 + br i1 %24, label %25, label %27 + +25: ; preds = %14 + %26 = load i32, i32* %9, align 4 + store i32 %26, i32* %4, align 4 + br label %34 + +27: ; preds = %14 + br label %28 + +28: ; preds = %27 + %29 = load i32, i32* %9, align 4 + %30 = add nsw i32 %29, 1 + store i32 %30, i32* %9, align 4 + br label %10, !llvm.loop !38 + +31: ; preds = %10 + %32 = load i32, i32* %6, align 4 + %33 = sub nsw i32 %32, 1 + store i32 %33, i32* %4, align 4 + br label %34 + +34: ; preds = %31, %25 + %35 = load i32, i32* %4, align 4 + ret i32 %35 +} + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define i32 @compare(i8* noundef %0, i8* noundef %1) #0 { + %3 = alloca i32, align 4 + %4 = alloca i8*, align 8 + %5 = alloca i8*, align 8 + %6 = alloca %struct.ProbIndex*, align 8 + %7 = alloca %struct.ProbIndex*, align 8 + store i8* %0, i8** %4, align 8 + store i8* %1, i8** %5, align 8 + %8 = load i8*, i8** %4, align 8 + %9 = bitcast i8* %8 to %struct.ProbIndex* + store %struct.ProbIndex* %9, %struct.ProbIndex** %6, align 8 + %10 = load i8*, i8** %5, align 8 + %11 = bitcast i8* %10 to %struct.ProbIndex* + store %struct.ProbIndex* %11, %struct.ProbIndex** %7, align 8 + %12 = load %struct.ProbIndex*, %struct.ProbIndex** %6, align 8 + %13 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %12, i32 0, i32 0 + %14 = load float, float* %13, align 4 + %15 = load %struct.ProbIndex*, %struct.ProbIndex** %7, align 8 + %16 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %15, i32 0, i32 0 + %17 = load float, float* %16, align 4 + %18 = fcmp ogt float %14, %17 + br i1 %18, label %19, label %20 + +19: ; preds = %2 + store i32 -1, i32* %3, align 4 + br label %30 + +20: ; preds = %2 + %21 = load %struct.ProbIndex*, %struct.ProbIndex** %6, align 8 + %22 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %21, i32 0, i32 0 + %23 = load float, float* %22, align 4 + %24 = load %struct.ProbIndex*, %struct.ProbIndex** %7, align 8 + %25 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %24, i32 0, i32 0 + %26 = load float, float* %25, align 4 + %27 = fcmp olt float %23, %26 + br i1 %27, label %28, label %29 + +28: ; preds = %20 + store i32 1, i32* %3, align 4 + br label %30 + +29: ; preds = %20 + store i32 0, i32* %3, align 4 + br label %30 + +30: ; preds = %29, %28, %19 + %31 = load i32, i32* %3, align 4 + ret i32 %31 +} + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define i32 @sample_topp(float* noundef %0, i32 noundef %1, float noundef %2, %struct.ProbIndex* noundef %3, float noundef %4) #0 { + %6 = alloca i32, align 4 + %7 = alloca float*, align 8 + %8 = alloca i32, align 4 + %9 = alloca float, align 4 + %10 = alloca %struct.ProbIndex*, align 8 + %11 = alloca float, align 4 + %12 = alloca i32, align 4 + %13 = alloca float, align 4 + %14 = alloca i32, align 4 + %15 = alloca float, align 4 + %16 = alloca i32, align 4 + %17 = alloca i32, align 4 + %18 = alloca float, align 4 + %19 = alloca float, align 4 + %20 = alloca i32, align 4 + store float* %0, float** %7, align 8 + store i32 %1, i32* %8, align 4 + store float %2, float* %9, align 4 + store %struct.ProbIndex* %3, %struct.ProbIndex** %10, align 8 + store float %4, float* %11, align 4 + store i32 0, i32* %12, align 4 + %21 = load float, float* %9, align 4 + %22 = fsub float 1.000000e+00, %21 + %23 = load i32, i32* %8, align 4 + %24 = sub nsw i32 %23, 1 + %25 = sitofp i32 %24 to float + %26 = fdiv float %22, %25 + store float %26, float* %13, align 4 + store i32 0, i32* %14, align 4 + br label %27 + +27: ; preds = %59, %5 + %28 = load i32, i32* %14, align 4 + %29 = load i32, i32* %8, align 4 + %30 = icmp slt i32 %28, %29 + br i1 %30, label %31, label %62 + +31: ; preds = %27 + %32 = load float*, float** %7, align 8 + %33 = load i32, i32* %14, align 4 + %34 = sext i32 %33 to i64 + %35 = getelementptr inbounds float, float* %32, i64 %34 + %36 = load float, float* %35, align 4 + %37 = load float, float* %13, align 4 + %38 = fcmp oge float %36, %37 + br i1 %38, label %39, label %58 + +39: ; preds = %31 + %40 = load i32, i32* %14, align 4 + %41 = load %struct.ProbIndex*, %struct.ProbIndex** %10, align 8 + %42 = load i32, i32* %12, align 4 + %43 = sext i32 %42 to i64 + %44 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %41, i64 %43 + %45 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %44, i32 0, i32 1 + store i32 %40, i32* %45, align 4 + %46 = load float*, float** %7, align 8 + %47 = load i32, i32* %14, align 4 + %48 = sext i32 %47 to i64 + %49 = getelementptr inbounds float, float* %46, i64 %48 + %50 = load float, float* %49, align 4 + %51 = load %struct.ProbIndex*, %struct.ProbIndex** %10, align 8 + %52 = load i32, i32* %12, align 4 + %53 = sext i32 %52 to i64 + %54 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %51, i64 %53 + %55 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %54, i32 0, i32 0 + store float %50, float* %55, align 4 + %56 = load i32, i32* %12, align 4 + %57 = add nsw i32 %56, 1 + store i32 %57, i32* %12, align 4 + br label %58 + +58: ; preds = %39, %31 + br label %59 + +59: ; preds = %58 + %60 = load i32, i32* %14, align 4 + %61 = add nsw i32 %60, 1 + store i32 %61, i32* %14, align 4 + br label %27, !llvm.loop !39 + +62: ; preds = %27 + %63 = load %struct.ProbIndex*, %struct.ProbIndex** %10, align 8 + %64 = bitcast %struct.ProbIndex* %63 to i8* + %65 = load i32, i32* %12, align 4 + %66 = sext i32 %65 to i64 + call void @qsort(i8* noundef %64, i64 noundef %66, i64 noundef 8, i32 (i8*, i8*)* noundef @compare) + store float 0.000000e+00, float* %15, align 4 + %67 = load i32, i32* %12, align 4 + %68 = sub nsw i32 %67, 1 + store i32 %68, i32* %16, align 4 + store i32 0, i32* %17, align 4 + br label %69 + +69: ; preds = %88, %62 + %70 = load i32, i32* %17, align 4 + %71 = load i32, i32* %12, align 4 + %72 = icmp slt i32 %70, %71 + br i1 %72, label %73, label %91 + +73: ; preds = %69 + %74 = load %struct.ProbIndex*, %struct.ProbIndex** %10, align 8 + %75 = load i32, i32* %17, align 4 + %76 = sext i32 %75 to i64 + %77 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %74, i64 %76 + %78 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %77, i32 0, i32 0 + %79 = load float, float* %78, align 4 + %80 = load float, float* %15, align 4 + %81 = fadd float %80, %79 + store float %81, float* %15, align 4 + %82 = load float, float* %15, align 4 + %83 = load float, float* %9, align 4 + %84 = fcmp ogt float %82, %83 + br i1 %84, label %85, label %87 + +85: ; preds = %73 + %86 = load i32, i32* %17, align 4 + store i32 %86, i32* %16, align 4 + br label %91 + +87: ; preds = %73 + br label %88 + +88: ; preds = %87 + %89 = load i32, i32* %17, align 4 + %90 = add nsw i32 %89, 1 + store i32 %90, i32* %17, align 4 + br label %69, !llvm.loop !40 + +91: ; preds = %85, %69 + %92 = load float, float* %11, align 4 + %93 = load float, float* %15, align 4 + %94 = fmul float %92, %93 + store float %94, float* %18, align 4 + store float 0.000000e+00, float* %19, align 4 + store i32 0, i32* %20, align 4 + br label %95 + +95: ; preds = %119, %91 + %96 = load i32, i32* %20, align 4 + %97 = load i32, i32* %16, align 4 + %98 = icmp sle i32 %96, %97 + br i1 %98, label %99, label %122 + +99: ; preds = %95 + %100 = load %struct.ProbIndex*, %struct.ProbIndex** %10, align 8 + %101 = load i32, i32* %20, align 4 + %102 = sext i32 %101 to i64 + %103 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %100, i64 %102 + %104 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %103, i32 0, i32 0 + %105 = load float, float* %104, align 4 + %106 = load float, float* %19, align 4 + %107 = fadd float %106, %105 + store float %107, float* %19, align 4 + %108 = load float, float* %18, align 4 + %109 = load float, float* %19, align 4 + %110 = fcmp olt float %108, %109 + br i1 %110, label %111, label %118 + +111: ; preds = %99 + %112 = load %struct.ProbIndex*, %struct.ProbIndex** %10, align 8 + %113 = load i32, i32* %20, align 4 + %114 = sext i32 %113 to i64 + %115 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %112, i64 %114 + %116 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %115, i32 0, i32 1 + %117 = load i32, i32* %116, align 4 + store i32 %117, i32* %6, align 4 + br label %129 + +118: ; preds = %99 + br label %119 + +119: ; preds = %118 + %120 = load i32, i32* %20, align 4 + %121 = add nsw i32 %120, 1 + store i32 %121, i32* %20, align 4 + br label %95, !llvm.loop !41 + +122: ; preds = %95 + %123 = load %struct.ProbIndex*, %struct.ProbIndex** %10, align 8 + %124 = load i32, i32* %16, align 4 + %125 = sext i32 %124 to i64 + %126 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %123, i64 %125 + %127 = getelementptr inbounds %struct.ProbIndex, %struct.ProbIndex* %126, i32 0, i32 1 + %128 = load i32, i32* %127, align 4 + store i32 %128, i32* %6, align 4 + br label %129 + +129: ; preds = %122, %111 + %130 = load i32, i32* %6, align 4 + ret i32 %130 +} + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @build_sampler(%struct.Sampler* noundef %0, i32 noundef %1, float noundef %2, float noundef %3, i64 noundef %4) #0 { + %6 = alloca %struct.Sampler*, align 8 + %7 = alloca i32, align 4 + %8 = alloca float, align 4 + %9 = alloca float, align 4 + %10 = alloca i64, align 8 + store %struct.Sampler* %0, %struct.Sampler** %6, align 8 + store i32 %1, i32* %7, align 4 + store float %2, float* %8, align 4 + store float %3, float* %9, align 4 + store i64 %4, i64* %10, align 8 + %11 = load i32, i32* %7, align 4 + %12 = load %struct.Sampler*, %struct.Sampler** %6, align 8 + %13 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %12, i32 0, i32 0 + store i32 %11, i32* %13, align 8 + %14 = load float, float* %8, align 4 + %15 = load %struct.Sampler*, %struct.Sampler** %6, align 8 + %16 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %15, i32 0, i32 2 + store float %14, float* %16, align 8 + %17 = load float, float* %9, align 4 + %18 = load %struct.Sampler*, %struct.Sampler** %6, align 8 + %19 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %18, i32 0, i32 3 + store float %17, float* %19, align 4 + %20 = load i64, i64* %10, align 8 + %21 = load %struct.Sampler*, %struct.Sampler** %6, align 8 + %22 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %21, i32 0, i32 4 + store i64 %20, i64* %22, align 8 + %23 = load %struct.Sampler*, %struct.Sampler** %6, align 8 + %24 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %23, i32 0, i32 0 + %25 = load i32, i32* %24, align 8 + %26 = sext i32 %25 to i64 + %27 = mul i64 %26, 8 + %28 = call i8* @malloc(i64 noundef %27) #14 + %29 = bitcast i8* %28 to %struct.ProbIndex* + %30 = load %struct.Sampler*, %struct.Sampler** %6, align 8 + %31 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %30, i32 0, i32 1 + store %struct.ProbIndex* %29, %struct.ProbIndex** %31, align 8 + ret void +} + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @free_sampler(%struct.Sampler* noundef %0) #0 { + %2 = alloca %struct.Sampler*, align 8 + store %struct.Sampler* %0, %struct.Sampler** %2, align 8 + %3 = load %struct.Sampler*, %struct.Sampler** %2, align 8 + %4 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %3, i32 0, i32 1 + %5 = load %struct.ProbIndex*, %struct.ProbIndex** %4, align 8 + %6 = bitcast %struct.ProbIndex* %5 to i8* + call void @free(i8* noundef %6) + ret void +} + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define i32 @random_u32(i64* noundef %0) #0 { + %2 = alloca i64*, align 8 + store i64* %0, i64** %2, align 8 + %3 = load i64*, i64** %2, align 8 + %4 = load i64, i64* %3, align 8 + %5 = lshr i64 %4, 12 + %6 = load i64*, i64** %2, align 8 + %7 = load i64, i64* %6, align 8 + %8 = xor i64 %7, %5 + store i64 %8, i64* %6, align 8 + %9 = load i64*, i64** %2, align 8 + %10 = load i64, i64* %9, align 8 + %11 = shl i64 %10, 25 + %12 = load i64*, i64** %2, align 8 + %13 = load i64, i64* %12, align 8 + %14 = xor i64 %13, %11 + store i64 %14, i64* %12, align 8 + %15 = load i64*, i64** %2, align 8 + %16 = load i64, i64* %15, align 8 + %17 = lshr i64 %16, 27 + %18 = load i64*, i64** %2, align 8 + %19 = load i64, i64* %18, align 8 + %20 = xor i64 %19, %17 + store i64 %20, i64* %18, align 8 + %21 = load i64*, i64** %2, align 8 + %22 = load i64, i64* %21, align 8 + %23 = mul i64 %22, 2685821657736338717 + %24 = lshr i64 %23, 32 + %25 = trunc i64 %24 to i32 + ret i32 %25 +} + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define float @random_f32(i64* noundef %0) #0 { + %2 = alloca i64*, align 8 + store i64* %0, i64** %2, align 8 + %3 = load i64*, i64** %2, align 8 + %4 = call i32 @random_u32(i64* noundef %3) + %5 = lshr i32 %4, 8 + %6 = uitofp i32 %5 to float + %7 = fdiv float %6, 0x4170000000000000 + ret float %7 +} + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define i32 @sample(%struct.Sampler* noundef %0, float* noundef %1) #0 { + %3 = alloca %struct.Sampler*, align 8 + %4 = alloca float*, align 8 + %5 = alloca i32, align 4 + %6 = alloca i32, align 4 + %7 = alloca float, align 4 + store %struct.Sampler* %0, %struct.Sampler** %3, align 8 + store float* %1, float** %4, align 8 + %8 = load %struct.Sampler*, %struct.Sampler** %3, align 8 + %9 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %8, i32 0, i32 2 + %10 = load float, float* %9, align 8 + %11 = fcmp oeq float %10, 0.000000e+00 + br i1 %11, label %12, label %18 + +12: ; preds = %2 + %13 = load float*, float** %4, align 8 + %14 = load %struct.Sampler*, %struct.Sampler** %3, align 8 + %15 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %14, i32 0, i32 0 + %16 = load i32, i32* %15, align 8 + %17 = call i32 @sample_argmax(float* noundef %13, i32 noundef %16) + store i32 %17, i32* %5, align 4 + br label %76 + +18: ; preds = %2 + store i32 0, i32* %6, align 4 + br label %19 + +19: ; preds = %35, %18 + %20 = load i32, i32* %6, align 4 + %21 = load %struct.Sampler*, %struct.Sampler** %3, align 8 + %22 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %21, i32 0, i32 0 + %23 = load i32, i32* %22, align 8 + %24 = icmp slt i32 %20, %23 + br i1 %24, label %25, label %38 + +25: ; preds = %19 + %26 = load %struct.Sampler*, %struct.Sampler** %3, align 8 + %27 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %26, i32 0, i32 2 + %28 = load float, float* %27, align 8 + %29 = load float*, float** %4, align 8 + %30 = load i32, i32* %6, align 4 + %31 = sext i32 %30 to i64 + %32 = getelementptr inbounds float, float* %29, i64 %31 + %33 = load float, float* %32, align 4 + %34 = fdiv float %33, %28 + store float %34, float* %32, align 4 + br label %35 + +35: ; preds = %25 + %36 = load i32, i32* %6, align 4 + %37 = add nsw i32 %36, 1 + store i32 %37, i32* %6, align 4 + br label %19, !llvm.loop !42 + +38: ; preds = %19 + %39 = load float*, float** %4, align 8 + %40 = load %struct.Sampler*, %struct.Sampler** %3, align 8 + %41 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %40, i32 0, i32 0 + %42 = load i32, i32* %41, align 8 + call void @softmax(float* noundef %39, i32 noundef %42) + %43 = load %struct.Sampler*, %struct.Sampler** %3, align 8 + %44 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %43, i32 0, i32 4 + %45 = call float @random_f32(i64* noundef %44) + store float %45, float* %7, align 4 + %46 = load %struct.Sampler*, %struct.Sampler** %3, align 8 + %47 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %46, i32 0, i32 3 + %48 = load float, float* %47, align 4 + %49 = fcmp ole float %48, 0.000000e+00 + br i1 %49, label %55, label %50 + +50: ; preds = %38 + %51 = load %struct.Sampler*, %struct.Sampler** %3, align 8 + %52 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %51, i32 0, i32 3 + %53 = load float, float* %52, align 4 + %54 = fcmp oge float %53, 1.000000e+00 + br i1 %54, label %55, label %62 + +55: ; preds = %50, %38 + %56 = load float*, float** %4, align 8 + %57 = load %struct.Sampler*, %struct.Sampler** %3, align 8 + %58 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %57, i32 0, i32 0 + %59 = load i32, i32* %58, align 8 + %60 = load float, float* %7, align 4 + %61 = call i32 @sample_mult(float* noundef %56, i32 noundef %59, float noundef %60) + store i32 %61, i32* %5, align 4 + br label %75 + +62: ; preds = %50 + %63 = load float*, float** %4, align 8 + %64 = load %struct.Sampler*, %struct.Sampler** %3, align 8 + %65 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %64, i32 0, i32 0 + %66 = load i32, i32* %65, align 8 + %67 = load %struct.Sampler*, %struct.Sampler** %3, align 8 + %68 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %67, i32 0, i32 3 + %69 = load float, float* %68, align 4 + %70 = load %struct.Sampler*, %struct.Sampler** %3, align 8 + %71 = getelementptr inbounds %struct.Sampler, %struct.Sampler* %70, i32 0, i32 1 + %72 = load %struct.ProbIndex*, %struct.ProbIndex** %71, align 8 + %73 = load float, float* %7, align 4 + %74 = call i32 @sample_topp(float* noundef %63, i32 noundef %66, float noundef %69, %struct.ProbIndex* noundef %72, float noundef %73) + store i32 %74, i32* %5, align 4 + br label %75 + +75: ; preds = %62, %55 + br label %76 + +76: ; preds = %75, %12 + %77 = load i32, i32* %5, align 4 + ret i32 %77 +} + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define i64 @time_in_ms() #0 { + %1 = alloca %struct.timespec, align 8 + %2 = call i32 @clock_gettime(i32 noundef 0, %struct.timespec* noundef %1) + %3 = getelementptr inbounds %struct.timespec, %struct.timespec* %1, i32 0, i32 0 + %4 = load i64, i64* %3, align 8 + %5 = mul nsw i64 %4, 1000 + %6 = getelementptr inbounds %struct.timespec, %struct.timespec* %1, i32 0, i32 1 + %7 = load i64, i64* %6, align 8 + %8 = sdiv i64 %7, 1000000 + %9 = add nsw i64 %5, %8 + ret i64 %9 +} + +declare i32 @clock_gettime(i32 noundef, %struct.timespec* noundef) #2 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @generate(%struct.Transformer* noundef %0, %struct.Tokenizer* noundef %1, %struct.Sampler* noundef %2, i8* noundef %3, i32 noundef %4) #0 { + %6 = alloca %struct.Transformer*, align 8 + %7 = alloca %struct.Tokenizer*, align 8 + %8 = alloca %struct.Sampler*, align 8 + %9 = alloca i8*, align 8 + %10 = alloca i32, align 4 + %11 = alloca i8*, align 8 + %12 = alloca i32, align 4 + %13 = alloca i32*, align 8 + %14 = alloca i64, align 8 + %15 = alloca i32, align 4 + %16 = alloca i32, align 4 + %17 = alloca i32, align 4 + %18 = alloca float*, align 8 + %19 = alloca i8*, align 8 + %20 = alloca i64, align 8 + store %struct.Transformer* %0, %struct.Transformer** %6, align 8 + store %struct.Tokenizer* %1, %struct.Tokenizer** %7, align 8 + store %struct.Sampler* %2, %struct.Sampler** %8, align 8 + store i8* %3, i8** %9, align 8 + store i32 %4, i32* %10, align 4 + store i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.12, i64 0, i64 0), i8** %11, align 8 + %21 = load i8*, i8** %9, align 8 + %22 = icmp eq i8* %21, null + br i1 %22, label %23, label %25 + +23: ; preds = %5 + %24 = load i8*, i8** %11, align 8 + store i8* %24, i8** %9, align 8 + br label %25 + +25: ; preds = %23, %5 + store i32 0, i32* %12, align 4 + %26 = load i8*, i8** %9, align 8 + %27 = call i64 @strlen(i8* noundef %26) + %28 = add i64 %27, 3 + %29 = mul i64 %28, 4 + %30 = call i8* @malloc(i64 noundef %29) #14 + %31 = bitcast i8* %30 to i32* + store i32* %31, i32** %13, align 8 + %32 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %33 = load i8*, i8** %9, align 8 + %34 = load i32*, i32** %13, align 8 + call void @encode(%struct.Tokenizer* noundef %32, i8* noundef %33, i8 noundef signext 1, i8 noundef signext 0, i32* noundef %34, i32* noundef %12) + %35 = load i32, i32* %12, align 4 + %36 = icmp slt i32 %35, 1 + br i1 %36, label %37, label %40 + +37: ; preds = %25 + %38 = load %struct.__sFILE*, %struct.__sFILE** @__stderrp, align 8 + %39 = call i32 (%struct.__sFILE*, i8*, ...) @fprintf(%struct.__sFILE* noundef %38, i8* noundef getelementptr inbounds ([54 x i8], [54 x i8]* @.str.13, i64 0, i64 0)) + call void @exit(i32 noundef 1) #11 + unreachable + +40: ; preds = %25 + store i64 0, i64* %14, align 8 + %41 = load i32*, i32** %13, align 8 + %42 = getelementptr inbounds i32, i32* %41, i64 0 + %43 = load i32, i32* %42, align 4 + store i32 %43, i32* %16, align 4 + store i32 0, i32* %17, align 4 + br label %44 + +44: ; preds = %87, %40 + %45 = load i32, i32* %17, align 4 + %46 = load i32, i32* %10, align 4 + %47 = icmp slt i32 %45, %46 + br i1 %47, label %48, label %88 + +48: ; preds = %44 + %49 = load %struct.Transformer*, %struct.Transformer** %6, align 8 + %50 = load i32, i32* %16, align 4 + %51 = load i32, i32* %17, align 4 + %52 = call float* @forward(%struct.Transformer* noundef %49, i32 noundef %50, i32 noundef %51) + store float* %52, float** %18, align 8 + %53 = load i32, i32* %17, align 4 + %54 = load i32, i32* %12, align 4 + %55 = sub nsw i32 %54, 1 + %56 = icmp slt i32 %53, %55 + br i1 %56, label %57, label %64 + +57: ; preds = %48 + %58 = load i32*, i32** %13, align 8 + %59 = load i32, i32* %17, align 4 + %60 = add nsw i32 %59, 1 + %61 = sext i32 %60 to i64 + %62 = getelementptr inbounds i32, i32* %58, i64 %61 + %63 = load i32, i32* %62, align 4 + store i32 %63, i32* %15, align 4 + br label %68 + +64: ; preds = %48 + %65 = load %struct.Sampler*, %struct.Sampler** %8, align 8 + %66 = load float*, float** %18, align 8 + %67 = call i32 @sample(%struct.Sampler* noundef %65, float* noundef %66) + store i32 %67, i32* %15, align 4 + br label %68 + +68: ; preds = %64, %57 + %69 = load i32, i32* %17, align 4 + %70 = add nsw i32 %69, 1 + store i32 %70, i32* %17, align 4 + %71 = load i32, i32* %15, align 4 + %72 = icmp eq i32 %71, 1 + br i1 %72, label %73, label %74 + +73: ; preds = %68 + br label %88 + +74: ; preds = %68 + %75 = load %struct.Tokenizer*, %struct.Tokenizer** %7, align 8 + %76 = load i32, i32* %16, align 4 + %77 = load i32, i32* %15, align 4 + %78 = call i8* @decode(%struct.Tokenizer* noundef %75, i32 noundef %76, i32 noundef %77) + store i8* %78, i8** %19, align 8 + %79 = load i8*, i8** %19, align 8 + call void @safe_printf(i8* noundef %79) + %80 = load %struct.__sFILE*, %struct.__sFILE** @__stdoutp, align 8 + %81 = call i32 @fflush(%struct.__sFILE* noundef %80) + %82 = load i32, i32* %15, align 4 + store i32 %82, i32* %16, align 4 + %83 = load i64, i64* %14, align 8 + %84 = icmp eq i64 %83, 0 + br i1 %84, label %85, label %87 + +85: ; preds = %74 + %86 = call i64 @time_in_ms() + store i64 %86, i64* %14, align 8 + br label %87 + +87: ; preds = %85, %74 + br label %44, !llvm.loop !43 + +88: ; preds = %73, %44 + %89 = call i32 (i8*, ...) @printf(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @.str.14, i64 0, i64 0)) + %90 = load i32, i32* %17, align 4 + %91 = icmp sgt i32 %90, 1 + br i1 %91, label %92, label %105 + +92: ; preds = %88 + %93 = call i64 @time_in_ms() + store i64 %93, i64* %20, align 8 + %94 = load %struct.__sFILE*, %struct.__sFILE** @__stderrp, align 8 + %95 = load i32, i32* %17, align 4 + %96 = sub nsw i32 %95, 1 + %97 = sitofp i32 %96 to double + %98 = load i64, i64* %20, align 8 + %99 = load i64, i64* %14, align 8 + %100 = sub nsw i64 %98, %99 + %101 = sitofp i64 %100 to double + %102 = fdiv double %97, %101 + %103 = fmul double %102, 1.000000e+03 + %104 = call i32 (%struct.__sFILE*, i8*, ...) @fprintf(%struct.__sFILE* noundef %94, i8* noundef getelementptr inbounds ([20 x i8], [20 x i8]* @.str.15, i64 0, i64 0), double noundef %103) + br label %105 + +105: ; preds = %92, %88 + %106 = load i32*, i32** %13, align 8 + %107 = bitcast i32* %106 to i8* + call void @free(i8* noundef %107) + ret void +} + +declare i64 @strlen(i8* noundef) #2 + +declare i32 @fflush(%struct.__sFILE* noundef) #2 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @read_stdin(i8* noundef %0, i8* noundef %1, i64 noundef %2) #0 { + %4 = alloca i8*, align 8 + %5 = alloca i8*, align 8 + %6 = alloca i64, align 8 + %7 = alloca i64, align 8 + store i8* %0, i8** %4, align 8 + store i8* %1, i8** %5, align 8 + store i64 %2, i64* %6, align 8 + %8 = load i8*, i8** %4, align 8 + %9 = call i32 (i8*, ...) @printf(i8* noundef getelementptr inbounds ([3 x i8], [3 x i8]* @.str.8, i64 0, i64 0), i8* noundef %8) + %10 = load i8*, i8** %5, align 8 + %11 = load i64, i64* %6, align 8 + %12 = trunc i64 %11 to i32 + %13 = load %struct.__sFILE*, %struct.__sFILE** @__stdinp, align 8 + %14 = call i8* @fgets(i8* noundef %10, i32 noundef %12, %struct.__sFILE* noundef %13) + %15 = icmp ne i8* %14, null + br i1 %15, label %16, label %35 + +16: ; preds = %3 + %17 = load i8*, i8** %5, align 8 + %18 = call i64 @strlen(i8* noundef %17) + store i64 %18, i64* %7, align 8 + %19 = load i64, i64* %7, align 8 + %20 = icmp ugt i64 %19, 0 + br i1 %20, label %21, label %34 + +21: ; preds = %16 + %22 = load i8*, i8** %5, align 8 + %23 = load i64, i64* %7, align 8 + %24 = sub i64 %23, 1 + %25 = getelementptr inbounds i8, i8* %22, i64 %24 + %26 = load i8, i8* %25, align 1 + %27 = sext i8 %26 to i32 + %28 = icmp eq i32 %27, 10 + br i1 %28, label %29, label %34 + +29: ; preds = %21 + %30 = load i8*, i8** %5, align 8 + %31 = load i64, i64* %7, align 8 + %32 = sub i64 %31, 1 + %33 = getelementptr inbounds i8, i8* %30, i64 %32 + store i8 0, i8* %33, align 1 + br label %34 + +34: ; preds = %29, %21, %16 + br label %35 + +35: ; preds = %34, %3 + ret void +} + +declare i8* @fgets(i8* noundef, i32 noundef, %struct.__sFILE* noundef) #2 + +; Function Attrs: noinline nounwind optnone ssp uwtable(sync) +define void @chat(%struct.Transformer* noundef %0, %struct.Tokenizer* noundef %1, %struct.Sampler* noundef %2, i8* noundef %3, i8* noundef %4, i32 noundef %5) #0 { + %7 = alloca %struct.Transformer*, align 8 + %8 = alloca %struct.Tokenizer*, align 8 + %9 = alloca %struct.Sampler*, align 8 + %10 = alloca i8*, align 8 + %11 = alloca i8*, align 8 + %12 = alloca i32, align 4 + %13 = alloca [512 x i8], align 1 + %14 = alloca [512 x i8], align 1 + %15 = alloca [1152 x i8], align 1 + %16 = alloca i32, align 4 + %17 = alloca i32*, align 8 + %18 = alloca i32, align 4 + %19 = alloca i8, align 1 + %20 = alloca i32, align 4 + %21 = alloca i32, align 4 + %22 = alloca i32, align 4 + %23 = alloca i32, align 4 + %24 = alloca [39 x i8], align 1 + %25 = alloca [18 x i8], align 1 + %26 = alloca float*, align 8 + %27 = alloca i8*, align 8 + store %struct.Transformer* %0, %struct.Transformer** %7, align 8 + store %struct.Tokenizer* %1, %struct.Tokenizer** %8, align 8 + store %struct.Sampler* %2, %struct.Sampler** %9, align 8 + store i8* %3, i8** %10, align 8 + store i8* %4, i8** %11, align 8 + store i32 %5, i32* %12, align 4 + store i32 0, i32* %16, align 4 + %28 = call i8* @malloc(i64 noundef 4608) #14 + %29 = bitcast i8* %28 to i32* + store i32* %29, i32** %17, align 8 + store i8 1, i8* %19, align 1 + store i32 0, i32* %23, align 4 + br label %30 + +30: ; preds = %134, %6 + %31 = load i32, i32* %23, align 4 + %32 = load i32, i32* %12, align 4 + %33 = icmp slt i32 %31, %32 + br i1 %33, label %34, label %135 + +34: ; preds = %30 + %35 = load i8, i8* %19, align 1 + %36 = icmp ne i8 %35, 0 + br i1 %36, label %37, label %88 + +37: ; preds = %34 + %38 = load i32, i32* %23, align 4 + %39 = icmp eq i32 %38, 0 + br i1 %39, label %40, label %50 + +40: ; preds = %37 + %41 = load i8*, i8** %11, align 8 + %42 = icmp eq i8* %41, null + br i1 %42, label %43, label %45 + +43: ; preds = %40 + %44 = getelementptr inbounds [512 x i8], [512 x i8]* %13, i64 0, i64 0 + call void @read_stdin(i8* noundef getelementptr inbounds ([33 x i8], [33 x i8]* @.str.16, i64 0, i64 0), i8* noundef %44, i64 noundef 512) + br label %49 + +45: ; preds = %40 + %46 = getelementptr inbounds [512 x i8], [512 x i8]* %13, i64 0, i64 0 + %47 = load i8*, i8** %11, align 8 + %48 = call i8* @__strcpy_chk(i8* noundef %46, i8* noundef %47, i64 noundef 512) #13 + br label %49 + +49: ; preds = %45, %43 + br label %50 + +50: ; preds = %49, %37 + %51 = load i32, i32* %23, align 4 + %52 = icmp eq i32 %51, 0 + br i1 %52, label %53, label %60 + +53: ; preds = %50 + %54 = load i8*, i8** %10, align 8 + %55 = icmp ne i8* %54, null + br i1 %55, label %56, label %60 + +56: ; preds = %53 + %57 = getelementptr inbounds [512 x i8], [512 x i8]* %14, i64 0, i64 0 + %58 = load i8*, i8** %10, align 8 + %59 = call i8* @__strcpy_chk(i8* noundef %57, i8* noundef %58, i64 noundef 512) #13 + br label %62 + +60: ; preds = %53, %50 + %61 = getelementptr inbounds [512 x i8], [512 x i8]* %14, i64 0, i64 0 + call void @read_stdin(i8* noundef getelementptr inbounds ([7 x i8], [7 x i8]* @.str.17, i64 0, i64 0), i8* noundef %61, i64 noundef 512) + br label %62 + +62: ; preds = %60, %56 + %63 = load i32, i32* %23, align 4 + %64 = icmp eq i32 %63, 0 + br i1 %64, label %65, label %77 + +65: ; preds = %62 + %66 = getelementptr inbounds [512 x i8], [512 x i8]* %13, i64 0, i64 0 + %67 = load i8, i8* %66, align 1 + %68 = sext i8 %67 to i32 + %69 = icmp ne i32 %68, 0 + br i1 %69, label %70, label %77 + +70: ; preds = %65 + %71 = bitcast [39 x i8]* %24 to i8* + call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %71, i8* align 1 getelementptr inbounds ([39 x i8], [39 x i8]* @__const.chat.system_template, i32 0, i32 0), i64 39, i1 false) + %72 = getelementptr inbounds [1152 x i8], [1152 x i8]* %15, i64 0, i64 0 + %73 = getelementptr inbounds [39 x i8], [39 x i8]* %24, i64 0, i64 0 + %74 = getelementptr inbounds [512 x i8], [512 x i8]* %13, i64 0, i64 0 + %75 = getelementptr inbounds [512 x i8], [512 x i8]* %14, i64 0, i64 0 + %76 = call i32 (i8*, i32, i64, i8*, ...) @__sprintf_chk(i8* noundef %72, i32 noundef 0, i64 noundef 1152, i8* noundef %73, i8* noundef %74, i8* noundef %75) + br label %83 + +77: ; preds = %65, %62 + %78 = bitcast [18 x i8]* %25 to i8* + call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %78, i8* align 1 getelementptr inbounds ([18 x i8], [18 x i8]* @__const.chat.user_template, i32 0, i32 0), i64 18, i1 false) + %79 = getelementptr inbounds [1152 x i8], [1152 x i8]* %15, i64 0, i64 0 + %80 = getelementptr inbounds [18 x i8], [18 x i8]* %25, i64 0, i64 0 + %81 = getelementptr inbounds [512 x i8], [512 x i8]* %14, i64 0, i64 0 + %82 = call i32 (i8*, i32, i64, i8*, ...) @__sprintf_chk(i8* noundef %79, i32 noundef 0, i64 noundef 1152, i8* noundef %80, i8* noundef %81) + br label %83 + +83: ; preds = %77, %70 + %84 = load %struct.Tokenizer*, %struct.Tokenizer** %8, align 8 + %85 = getelementptr inbounds [1152 x i8], [1152 x i8]* %15, i64 0, i64 0 + %86 = load i32*, i32** %17, align 8 + call void @encode(%struct.Tokenizer* noundef %84, i8* noundef %85, i8 noundef signext 1, i8 noundef signext 0, i32* noundef %86, i32* noundef %16) + store i32 0, i32* %18, align 4 + store i8 0, i8* %19, align 1 + %87 = call i32 (i8*, ...) @printf(i8* noundef getelementptr inbounds ([12 x i8], [12 x i8]* @.str.18, i64 0, i64 0)) + br label %88 + +88: ; preds = %83, %34 + %89 = load i32, i32* %18, align 4 + %90 = load i32, i32* %16, align 4 + %91 = icmp slt i32 %89, %90 + br i1 %91, label %92, label %99 + +92: ; preds = %88 + %93 = load i32*, i32** %17, align 8 + %94 = load i32, i32* %18, align 4 + %95 = add nsw i32 %94, 1 + store i32 %95, i32* %18, align 4 + %96 = sext i32 %94 to i64 + %97 = getelementptr inbounds i32, i32* %93, i64 %96 + %98 = load i32, i32* %97, align 4 + store i32 %98, i32* %21, align 4 + br label %101 + +99: ; preds = %88 + %100 = load i32, i32* %20, align 4 + store i32 %100, i32* %21, align 4 + br label %101 + +101: ; preds = %99, %92 + %102 = load i32, i32* %21, align 4 + %103 = icmp eq i32 %102, 2 + br i1 %103, label %104, label %105 + +104: ; preds = %101 + store i8 1, i8* %19, align 1 + br label %105 + +105: ; preds = %104, %101 + %106 = load %struct.Transformer*, %struct.Transformer** %7, align 8 + %107 = load i32, i32* %21, align 4 + %108 = load i32, i32* %23, align 4 + %109 = call float* @forward(%struct.Transformer* noundef %106, i32 noundef %107, i32 noundef %108) + store float* %109, float** %26, align 8 + %110 = load %struct.Sampler*, %struct.Sampler** %9, align 8 + %111 = load float*, float** %26, align 8 + %112 = call i32 @sample(%struct.Sampler* noundef %110, float* noundef %111) + store i32 %112, i32* %20, align 4 + %113 = load i32, i32* %23, align 4 + %114 = add nsw i32 %113, 1 + store i32 %114, i32* %23, align 4 + %115 = load i32, i32* %18, align 4 + %116 = load i32, i32* %16, align 4 + %117 = icmp sge i32 %115, %116 + br i1 %117, label %118, label %129 + +118: ; preds = %105 + %119 = load i32, i32* %20, align 4 + %120 = icmp ne i32 %119, 2 + br i1 %120, label %121, label %129 + +121: ; preds = %118 + %122 = load %struct.Tokenizer*, %struct.Tokenizer** %8, align 8 + %123 = load i32, i32* %21, align 4 + %124 = load i32, i32* %20, align 4 + %125 = call i8* @decode(%struct.Tokenizer* noundef %122, i32 noundef %123, i32 noundef %124) + store i8* %125, i8** %27, align 8 + %126 = load i8*, i8** %27, align 8 + call void @safe_printf(i8* noundef %126) + %127 = load %struct.__sFILE*, %struct.__sFILE** @__stdoutp, align 8 + %128 = call i32 @fflush(%struct.__sFILE* noundef %127) + br label %129 + +129: ; preds = %121, %118, %105 + %130 = load i32, i32* %20, align 4 + %131 = icmp eq i32 %130, 2 + br i1 %131, label %132, label %134 + +132: ; preds = %129 + %133 = call i32 (i8*, ...) @printf(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @.str.14, i64 0, i64 0)) + br label %134 + +134: ; preds = %132, %129 + br label %30, !llvm.loop !44 + +135: ; preds = %30 + %136 = call i32 (i8*, ...) @printf(i8* noundef getelementptr inbounds ([2 x i8], [2 x i8]* @.str.14, i64 0, i64 0)) + %137 = load i32*, i32** %17, align 8 + %138 = bitcast i32* %137 to i8* + call void @free(i8* noundef %138) + ret void +} + +; Function Attrs: nounwind +declare i8* @__strcpy_chk(i8* noundef, i8* noundef, i64 noundef) #6 + +; Function Attrs: argmemonly nofree nounwind willreturn +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg) #9 + +attributes #0 = { noinline nounwind optnone ssp uwtable(sync) "frame-pointer"="non-leaf" "min-legal-vector-width"="0" "no-trapping-math"="true" "probe-stack"="__chkstk_darwin" "stack-protector-buffer-size"="8" "target-cpu"="apple-m1" "target-features"="+aes,+crc,+crypto,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+lse,+neon,+ras,+rcpc,+rdm,+sha2,+sha3,+sm4,+v8.5a,+zcm,+zcz" } +attributes #1 = { allocsize(0,1) "frame-pointer"="non-leaf" "no-trapping-math"="true" "probe-stack"="__chkstk_darwin" "stack-protector-buffer-size"="8" "target-cpu"="apple-m1" "target-features"="+aes,+crc,+crypto,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+lse,+neon,+ras,+rcpc,+rdm,+sha2,+sha3,+sm4,+v8.5a,+zcm,+zcz" } +attributes #2 = { "frame-pointer"="non-leaf" "no-trapping-math"="true" "probe-stack"="__chkstk_darwin" "stack-protector-buffer-size"="8" "target-cpu"="apple-m1" "target-features"="+aes,+crc,+crypto,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+lse,+neon,+ras,+rcpc,+rdm,+sha2,+sha3,+sm4,+v8.5a,+zcm,+zcz" } +attributes #3 = { noreturn "frame-pointer"="non-leaf" "no-trapping-math"="true" "probe-stack"="__chkstk_darwin" "stack-protector-buffer-size"="8" "target-cpu"="apple-m1" "target-features"="+aes,+crc,+crypto,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+lse,+neon,+ras,+rcpc,+rdm,+sha2,+sha3,+sm4,+v8.5a,+zcm,+zcz" } +attributes #4 = { nounwind readnone willreturn "frame-pointer"="non-leaf" "no-trapping-math"="true" "probe-stack"="__chkstk_darwin" "stack-protector-buffer-size"="8" "target-cpu"="apple-m1" "target-features"="+aes,+crc,+crypto,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+lse,+neon,+ras,+rcpc,+rdm,+sha2,+sha3,+sm4,+v8.5a,+zcm,+zcz" } +attributes #5 = { nocallback nofree nosync nounwind readnone speculatable willreturn } +attributes #6 = { nounwind "frame-pointer"="non-leaf" "no-trapping-math"="true" "probe-stack"="__chkstk_darwin" "stack-protector-buffer-size"="8" "target-cpu"="apple-m1" "target-features"="+aes,+crc,+crypto,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+lse,+neon,+ras,+rcpc,+rdm,+sha2,+sha3,+sm4,+v8.5a,+zcm,+zcz" } +attributes #7 = { allocsize(0) "frame-pointer"="non-leaf" "no-trapping-math"="true" "probe-stack"="__chkstk_darwin" "stack-protector-buffer-size"="8" "target-cpu"="apple-m1" "target-features"="+aes,+crc,+crypto,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+lse,+neon,+ras,+rcpc,+rdm,+sha2,+sha3,+sm4,+v8.5a,+zcm,+zcz" } +attributes #8 = { nounwind readonly willreturn "frame-pointer"="non-leaf" "no-trapping-math"="true" "probe-stack"="__chkstk_darwin" "stack-protector-buffer-size"="8" "target-cpu"="apple-m1" "target-features"="+aes,+crc,+crypto,+dotprod,+fp-armv8,+fp16fml,+fullfp16,+lse,+neon,+ras,+rcpc,+rdm,+sha2,+sha3,+sm4,+v8.5a,+zcm,+zcz" } +attributes #9 = { argmemonly nofree nounwind willreturn } +attributes #10 = { allocsize(0,1) } +attributes #11 = { noreturn } +attributes #12 = { nounwind readnone willreturn } +attributes #13 = { nounwind } +attributes #14 = { allocsize(0) } +attributes #15 = { nounwind readonly willreturn } + +!llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !6, !7, !8} +!llvm.ident = !{!9} + +!0 = !{i32 2, !"SDK Version", [2 x i32] [i32 13, i32 3]} +!1 = !{i32 1, !"wchar_size", i32 4} +!2 = !{i32 8, !"branch-target-enforcement", i32 0} +!3 = !{i32 8, !"sign-return-address", i32 0} +!4 = !{i32 8, !"sign-return-address-all", i32 0} +!5 = !{i32 8, !"sign-return-address-with-bkey", i32 0} +!6 = !{i32 7, !"PIC Level", i32 2} +!7 = !{i32 7, !"uwtable", i32 1} +!8 = !{i32 7, !"frame-pointer", i32 1} +!9 = !{!"Apple clang version 14.0.3 (clang-1403.0.22.14.1)"} +!10 = distinct !{!10, !11} +!11 = !{!"llvm.loop.mustprogress"} +!12 = distinct !{!12, !11} +!13 = distinct !{!13, !11} +!14 = distinct !{!14, !11} +!15 = distinct !{!15, !11} +!16 = distinct !{!16, !11} +!17 = distinct !{!17, !11} +!18 = distinct !{!18, !11} +!19 = distinct !{!19, !11} +!20 = distinct !{!20, !11} +!21 = distinct !{!21, !11} +!22 = distinct !{!22, !11} +!23 = distinct !{!23, !11} +!24 = distinct !{!24, !11} +!25 = distinct !{!25, !11} +!26 = distinct !{!26, !11} +!27 = distinct !{!27, !11} +!28 = distinct !{!28, !11} +!29 = distinct !{!29, !11} +!30 = distinct !{!30, !11} +!31 = distinct !{!31, !11} +!32 = distinct !{!32, !11} +!33 = distinct !{!33, !11} +!34 = distinct !{!34, !11} +!35 = distinct !{!35, !11} +!36 = distinct !{!36, !11} +!37 = distinct !{!37, !11} +!38 = distinct !{!38, !11} +!39 = distinct !{!39, !11} +!40 = distinct !{!40, !11} +!41 = distinct !{!41, !11} +!42 = distinct !{!42, !11} +!43 = distinct !{!43, !11} +!44 = distinct !{!44, !11}