#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
struct mls_conf {
  int dummy;
};

/* Variables and functions */
int /*<<< orphan*/ abort();
int /*<<< orphan*/ mls_conf_fin(struct mls_conf *);
char *mls_conf_get(struct mls_conf *, char *);
struct mls_conf *mls_conf_ini(char *);
int /*<<< orphan*/ mls_conf_load(struct mls_conf *);
int mls_conf_set(struct mls_conf *, char *, char *);
int /*<<< orphan*/ mls_conf_store(struct mls_conf *);
int /*<<< orphan*/ mls_fatal_perror(char *, ...);
int /*<<< orphan*/ printf(char *, char *, char *);
int main(int ac, char *argv[]) {
  struct mls_conf *conf;
  conf = mls_conf_ini("./test.ini");
  if (NULL == conf) {
    do {
      mls_fatal_perror("mls_conf_ini");
      abort();
    } while (0);
  }
  mls_conf_load(conf);
  {
    ({
      char *val;
      val = mls_conf_get((conf), ("key1"));
      printf("GET: %s = %s\n", ("key1"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("key2"));
      printf("GET: %s = %s\n", ("key2"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("ckey1"));
      printf("GET: %s = %s\n", ("ckey1"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("undef"));
      printf("GET: %s = %s\n", ("undef"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("keyX"));
      printf("GET: %s = %s\n", ("keyX"), (NULL != val) ? val : "NOTFOUND");
    });
  }
  {
    ({
      int ret = 0;
      ret = mls_conf_set((conf), ("key2"), ("modify-val2"));
      if (0 != ret) {
        do {
          mls_fatal_perror("Set error %s:%s", ("key2"), ("modify-val2"));
          abort();
        } while (0);
      }
      printf("SET: %s = %s\n", ("key2"), ("modify-val2"));
    });
    ({
      int ret = 0;
      ret = mls_conf_set((conf), ("key3"), ("val3"));
      if (0 != ret) {
        do {
          mls_fatal_perror("Set error %s:%s", ("key3"), ("val3"));
          abort();
        } while (0);
      }
      printf("SET: %s = %s\n", ("key3"), ("val3"));
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("key2"));
      printf("GET: %s = %s\n", ("key2"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("key3"));
      printf("GET: %s = %s\n", ("key3"), (NULL != val) ? val : "NOTFOUND");
    });
    ({
      char *val;
      val = mls_conf_get((conf), ("keyX"));
      printf("GET: %s = %s\n", ("keyX"), (NULL != val) ? val : "NOTFOUND");
    });
  }
  mls_conf_store(conf);
  mls_conf_fin(conf);
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0xf0,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
lea    0xe50(%rip),%rdi
call   1090 <mls_conf_ini@plt>
mov    %rax,-0x18(%rbp)
xor    %eax,%eax
cmp    -0x18(%rbp),%rax
jne    11df <main+0x4f>
jmp    11ca <main+0x3a>
lea    0xe3a(%rip),%rdi
mov    $0x0,%al
call   1060 <mls_fatal_perror@plt>
mov    $0x0,%al
call   1030 <abort@plt>
mov    -0x18(%rbp),%rdi
call   1040 <mls_conf_load@plt>
mov    -0x18(%rbp),%rdi
lea    0xe42(%rip),%rsi
call   1050 <mls_conf_get@plt>
mov    %rax,-0x20(%rbp)
xor    %eax,%eax
cmp    -0x20(%rbp),%rax
je     1218 <main+0x88>
mov    -0x20(%rbp),%rax
mov    %rax,-0xb0(%rbp)
jmp    122b <main+0x9b>
lea    0xe07(%rip),%rax
mov    %rax,-0xb0(%rbp)
jmp    122b <main+0x9b>
mov    -0xb0(%rbp),%rdx
lea    0xddf(%rip),%rdi
lea    0xdf5(%rip),%rsi
call   1080 <printf@plt>
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%rdi
lea    0xddc(%rip),%rsi
call   1050 <mls_conf_get@plt>
mov    %rax,-0x30(%rbp)
xor    %eax,%eax
cmp    -0x30(%rbp),%rax
je     1278 <main+0xe8>
mov    -0x30(%rbp),%rax
mov    %rax,-0xb8(%rbp)
jmp    128b <main+0xfb>
lea    0xda7(%rip),%rax
mov    %rax,-0xb8(%rbp)
jmp    128b <main+0xfb>
mov    -0xb8(%rbp),%rdx
lea    0xd7f(%rip),%rdi
lea    0xd8f(%rip),%rsi
call   1080 <printf@plt>
mov    %eax,-0x34(%rbp)
mov    -0x18(%rbp),%rdi
lea    0xd81(%rip),%rsi
call   1050 <mls_conf_get@plt>
mov    %rax,-0x40(%rbp)
xor    %eax,%eax
cmp    -0x40(%rbp),%rax
je     12d8 <main+0x148>
mov    -0x40(%rbp),%rax
mov    %rax,-0xc0(%rbp)
jmp    12eb <main+0x15b>
lea    0xd47(%rip),%rax
mov    %rax,-0xc0(%rbp)
jmp    12eb <main+0x15b>
mov    -0xc0(%rbp),%rdx
lea    0xd1f(%rip),%rdi
lea    0xd34(%rip),%rsi
call   1080 <printf@plt>
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rdi
lea    0xd27(%rip),%rsi
call   1050 <mls_conf_get@plt>
mov    %rax,-0x50(%rbp)
xor    %eax,%eax
cmp    -0x50(%rbp),%rax
je     1338 <main+0x1a8>
mov    -0x50(%rbp),%rax
mov    %rax,-0xc8(%rbp)
jmp    134b <main+0x1bb>
lea    0xce7(%rip),%rax
mov    %rax,-0xc8(%rbp)
jmp    134b <main+0x1bb>
mov    -0xc8(%rbp),%rdx
lea    0xcbf(%rip),%rdi
lea    0xcda(%rip),%rsi
call   1080 <printf@plt>
mov    %eax,-0x54(%rbp)
mov    -0x18(%rbp),%rdi
lea    0xccd(%rip),%rsi
call   1050 <mls_conf_get@plt>
mov    %rax,-0x60(%rbp)
xor    %eax,%eax
cmp    -0x60(%rbp),%rax
je     1398 <main+0x208>
mov    -0x60(%rbp),%rax
mov    %rax,-0xd0(%rbp)
jmp    13ab <main+0x21b>
lea    0xc87(%rip),%rax
mov    %rax,-0xd0(%rbp)
jmp    13ab <main+0x21b>
mov    -0xd0(%rbp),%rdx
lea    0xc5f(%rip),%rdi
lea    0xc80(%rip),%rsi
call   1080 <printf@plt>
mov    %eax,-0x64(%rbp)
movl   $0x0,-0x68(%rbp)
mov    -0x18(%rbp),%rdi
lea    0xc55(%rip),%rsi
lea    0xc64(%rip),%rdx
call   10a0 <mls_conf_set@plt>
mov    %eax,-0x68(%rbp)
xor    %eax,%eax
cmp    -0x68(%rbp),%eax
je     141c <main+0x28c>
jmp    13f9 <main+0x269>
lea    0xc51(%rip),%rdi
lea    0xc28(%rip),%rsi
lea    0xc37(%rip),%rdx
mov    $0x0,%al
call   1060 <mls_fatal_perror@plt>
mov    $0x0,%al
call   1030 <abort@plt>
lea    0xc3e(%rip),%rdi
lea    0xc05(%rip),%rsi
lea    0xc14(%rip),%rdx
call   1080 <printf@plt>
mov    %eax,-0x6c(%rbp)
movl   $0x0,-0x70(%rbp)
mov    -0x18(%rbp),%rdi
lea    0xc24(%rip),%rsi
lea    0xc22(%rip),%rdx
call   10a0 <mls_conf_set@plt>
mov    %eax,-0x70(%rbp)
xor    %eax,%eax
cmp    -0x70(%rbp),%eax
je     148d <main+0x2fd>
jmp    146a <main+0x2da>
lea    0xbe0(%rip),%rdi
lea    0xbf7(%rip),%rsi
lea    0xbf5(%rip),%rdx
mov    $0x0,%al
call   1060 <mls_fatal_perror@plt>
mov    $0x0,%al
call   1030 <abort@plt>
lea    0xbcd(%rip),%rdi
lea    0xbd4(%rip),%rsi
lea    0xbd2(%rip),%rdx
call   1080 <printf@plt>
mov    %eax,-0x74(%rbp)
mov    -0x18(%rbp),%rdi
lea    0xb7a(%rip),%rsi
call   1050 <mls_conf_get@plt>
mov    %rax,-0x80(%rbp)
xor    %eax,%eax
cmp    -0x80(%rbp),%rax
je     14da <main+0x34a>
mov    -0x80(%rbp),%rax
mov    %rax,-0xd8(%rbp)
jmp    14ed <main+0x35d>
lea    0xb45(%rip),%rax
mov    %rax,-0xd8(%rbp)
jmp    14ed <main+0x35d>
mov    -0xd8(%rbp),%rdx
lea    0xb1d(%rip),%rdi
lea    0xb2d(%rip),%rsi
call   1080 <printf@plt>
mov    %eax,-0x84(%rbp)
mov    -0x18(%rbp),%rdi
lea    0xb57(%rip),%rsi
call   1050 <mls_conf_get@plt>
mov    %rax,-0x90(%rbp)
xor    %eax,%eax
cmp    -0x90(%rbp),%rax
je     1546 <main+0x3b6>
mov    -0x90(%rbp),%rax
mov    %rax,-0xe0(%rbp)
jmp    1559 <main+0x3c9>
lea    0xad9(%rip),%rax
mov    %rax,-0xe0(%rbp)
jmp    1559 <main+0x3c9>
mov    -0xe0(%rbp),%rdx
lea    0xab1(%rip),%rdi
lea    0xb01(%rip),%rsi
call   1080 <printf@plt>
mov    %eax,-0x94(%rbp)
mov    -0x18(%rbp),%rdi
lea    0xabc(%rip),%rsi
call   1050 <mls_conf_get@plt>
mov    %rax,-0xa0(%rbp)
xor    %eax,%eax
cmp    -0xa0(%rbp),%rax
je     15b2 <main+0x422>
mov    -0xa0(%rbp),%rax
mov    %rax,-0xe8(%rbp)
jmp    15c5 <main+0x435>
lea    0xa6d(%rip),%rax
mov    %rax,-0xe8(%rbp)
jmp    15c5 <main+0x435>
mov    -0xe8(%rbp),%rdx
lea    0xa45(%rip),%rdi
lea    0xa66(%rip),%rsi
call   1080 <printf@plt>
mov    %eax,-0xa4(%rbp)
mov    -0x18(%rbp),%rdi
call   1070 <mls_conf_store@plt>
mov    -0x18(%rbp),%rdi
call   10b0 <mls_conf_fin@plt>
xor    %eax,%eax
add    $0xf0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
lea    0xe60(%rip),%rdi
call   1090 <mls_conf_ini@plt>
test   %rax,%rax
je     138a <main+0x1fa>
mov    %rax,%rbx
mov    %rax,%rdi
call   1040 <mls_conf_load@plt>
lea    0xe75(%rip),%r15
mov    %rbx,%rdi
mov    %r15,%rsi
call   1050 <mls_conf_get@plt>
test   %rax,%rax
lea    0xe51(%rip),%r14
cmove  %r14,%rax
lea    0xe38(%rip),%r12
mov    %r12,%rdi
mov    %r15,%rsi
mov    %rax,%rdx
call   1080 <printf@plt>
lea    0xe3a(%rip),%r15
mov    %rbx,%rdi
mov    %r15,%rsi
call   1050 <mls_conf_get@plt>
test   %rax,%rax
cmove  %r14,%rax
mov    %r12,%rdi
mov    %r15,%rsi
mov    %rax,%rdx
call   1080 <printf@plt>
lea    0xe18(%rip),%r13
mov    %rbx,%rdi
mov    %r13,%rsi
call   1050 <mls_conf_get@plt>
test   %rax,%rax
cmove  %r14,%rax
mov    %r12,%rdi
mov    %r13,%rsi
mov    %rax,%rdx
call   1080 <printf@plt>
lea    0xdf7(%rip),%r13
mov    %rbx,%rdi
mov    %r13,%rsi
call   1050 <mls_conf_get@plt>
test   %rax,%rax
cmove  %r14,%rax
mov    %r12,%rdi
mov    %r13,%rsi
mov    %rax,%rdx
call   1080 <printf@plt>
lea    0xdd6(%rip),%r13
mov    %rbx,%rdi
mov    %r13,%rsi
call   1050 <mls_conf_get@plt>
test   %rax,%rax
cmove  %r14,%rax
mov    %r12,%rdi
mov    %r13,%rsi
mov    %rax,%rdx
call   1080 <printf@plt>
lea    0xdb4(%rip),%rdx
mov    %rbx,%rdi
mov    %r15,%rsi
call   10a0 <mls_conf_set@plt>
test   %eax,%eax
jne    139f <main+0x20f>
lea    0xdb6(%rip),%rdi
lea    0xd7d(%rip),%rsi
lea    0xd8c(%rip),%rdx
call   1080 <printf@plt>
lea    0xdaa(%rip),%rsi
lea    0xda8(%rip),%rdx
mov    %rbx,%rdi
call   10a0 <mls_conf_set@plt>
test   %eax,%eax
jne    13b6 <main+0x226>
lea    0xd7e(%rip),%rdi
lea    0xd85(%rip),%r15
lea    0xd83(%rip),%rdx
mov    %r15,%rsi
call   1080 <printf@plt>
lea    0xd2f(%rip),%r13
mov    %rbx,%rdi
mov    %r13,%rsi
call   1050 <mls_conf_get@plt>
test   %rax,%rax
cmove  %r14,%rax
lea    0xcff(%rip),%r12
mov    %r12,%rdi
mov    %r13,%rsi
mov    %rax,%rdx
call   1080 <printf@plt>
mov    %rbx,%rdi
mov    %r15,%rsi
call   1050 <mls_conf_get@plt>
test   %rax,%rax
cmove  %r14,%rax
mov    %r12,%rdi
mov    %r15,%rsi
mov    %rax,%rdx
call   1080 <printf@plt>
lea    0xcf2(%rip),%r15
mov    %rbx,%rdi
mov    %r15,%rsi
call   1050 <mls_conf_get@plt>
test   %rax,%rax
cmovne %rax,%r14
mov    %r12,%rdi
mov    %r15,%rsi
mov    %r14,%rdx
call   1080 <printf@plt>
mov    %rbx,%rdi
call   1070 <mls_conf_store@plt>
mov    %rbx,%rdi
call   10b0 <mls_conf_fin@plt>
xor    %eax,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret
lea    0xc7a(%rip),%rdi
xor    %eax,%eax
call   1060 <mls_fatal_perror@plt>
xor    %eax,%eax
call   1030 <abort@plt>
lea    0xcab(%rip),%rdi
lea    0xc82(%rip),%rsi
lea    0xc91(%rip),%rdx
jmp    13cb <main+0x23b>
lea    0xc94(%rip),%rdi
lea    0xcab(%rip),%rsi
lea    0xca9(%rip),%rdx
xor    %eax,%eax
call   1060 <mls_fatal_perror@plt>
xor    %eax,%eax
call   1030 <abort@plt>

LLVM IR (-O0):
%struct.mls_conf = type { i32 }
@.str = [11 x i8] c"./test.ini\00"
@.str.1 = [13 x i8] c"mls_conf_ini\00"
@.str.2 = [5 x i8] c"key1\00"
@.str.3 = [14 x i8] c"GET: %s = %s\0A\00"
@.str.4 = [9 x i8] c"NOTFOUND\00"
@.str.5 = [5 x i8] c"key2\00"
@.str.6 = [6 x i8] c"ckey1\00"
@.str.7 = [6 x i8] c"undef\00"
@.str.8 = [5 x i8] c"keyX\00"
@.str.9 = [12 x i8] c"modify-val2\00"
@.str.10 = [16 x i8] c"Set error %s:%s\00"
@.str.11 = [14 x i8] c"SET: %s = %s\0A\00"
@.str.12 = [5 x i8] c"key3\00"
@.str.13 = [5 x i8] c"val3\00"
define i32 @main(i32 %0, i8** %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i8**
%6 = alloca %struct.mls_conf*
%7 = alloca i8*
%8 = alloca i32
%9 = alloca i8*
%10 = alloca i32
%11 = alloca i8*
%12 = alloca i32
%13 = alloca i8*
%14 = alloca i32
%15 = alloca i8*
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i8*
%22 = alloca i32
%23 = alloca i8*
%24 = alloca i32
%25 = alloca i8*
%26 = alloca i32
store i32 0, i32* %3
store i32 %0, i32* %4
store i8** %1, i8*** %5
%27 = call %struct.mls_conf* @mls_conf_ini(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i64 0, i64 0))
store %struct.mls_conf* %27, %struct.mls_conf** %6
%28 = load %struct.mls_conf*, %struct.mls_conf** %6
%29 = icmp eq %struct.mls_conf* null, %28
br i1 %29, label %30, label %35
30: ; preds = %2
br label %31
31: ; preds = %30
%32 = call i32 (i8*, ...) @mls_fatal_perror(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.1, i64 0, i64 0))
%33 = call i32 (...) @abort()
unreachable
34: ; No predecessors!
br label %35
35: ; preds = %34, %2
%36 = load %struct.mls_conf*, %struct.mls_conf** %6
%37 = call i32 @mls_conf_load(%struct.mls_conf* %36)
%38 = load %struct.mls_conf*, %struct.mls_conf** %6
%39 = call i8* @mls_conf_get(%struct.mls_conf* %38, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0))
store i8* %39, i8** %7
%40 = load i8*, i8** %7
%41 = icmp ne i8* null, %40
br i1 %41, label %42, label %44
42: ; preds = %35
%43 = load i8*, i8** %7
br label %45
44: ; preds = %35
br label %45
45: ; preds = %44, %42
%46 = phi i8* [ %43, %42 ], [ getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), %44 ]
%47 = call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i8* %46)
store i32 %47, i32* %8
%48 = load i32, i32* %8
%49 = load %struct.mls_conf*, %struct.mls_conf** %6
%50 = call i8* @mls_conf_get(%struct.mls_conf* %49, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0))
store i8* %50, i8** %9
%51 = load i8*, i8** %9
%52 = icmp ne i8* null, %51
br i1 %52, label %53, label %55
53: ; preds = %45
%54 = load i8*, i8** %9
br label %56
55: ; preds = %45
br label %56
56: ; preds = %55, %53
%57 = phi i8* [ %54, %53 ], [ getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), %55 ]
%58 = call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0), i8* %57)
store i32 %58, i32* %10
%59 = load i32, i32* %10
%60 = load %struct.mls_conf*, %struct.mls_conf** %6
%61 = call i8* @mls_conf_get(%struct.mls_conf* %60, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i64 0, i64 0))
store i8* %61, i8** %11
%62 = load i8*, i8** %11
%63 = icmp ne i8* null, %62
br i1 %63, label %64, label %66
64: ; preds = %56
%65 = load i8*, i8** %11
br label %67
66: ; preds = %56
br label %67
67: ; preds = %66, %64
%68 = phi i8* [ %65, %64 ], [ getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), %66 ]
%69 = call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i64 0, i64 0), i8* %68)
store i32 %69, i32* %12
%70 = load i32, i32* %12
%71 = load %struct.mls_conf*, %struct.mls_conf** %6
%72 = call i8* @mls_conf_get(%struct.mls_conf* %71, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.7, i64 0, i64 0))
store i8* %72, i8** %13
%73 = load i8*, i8** %13
%74 = icmp ne i8* null, %73
br i1 %74, label %75, label %77
75: ; preds = %67
%76 = load i8*, i8** %13
br label %78
77: ; preds = %67
br label %78
78: ; preds = %77, %75
%79 = phi i8* [ %76, %75 ], [ getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), %77 ]
%80 = call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.7, i64 0, i64 0), i8* %79)
store i32 %80, i32* %14
%81 = load i32, i32* %14
%82 = load %struct.mls_conf*, %struct.mls_conf** %6
%83 = call i8* @mls_conf_get(%struct.mls_conf* %82, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.8, i64 0, i64 0))
store i8* %83, i8** %15
%84 = load i8*, i8** %15
%85 = icmp ne i8* null, %84
br i1 %85, label %86, label %88
86: ; preds = %78
%87 = load i8*, i8** %15
br label %89
88: ; preds = %78
br label %89
89: ; preds = %88, %86
%90 = phi i8* [ %87, %86 ], [ getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), %88 ]
%91 = call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.8, i64 0, i64 0), i8* %90)
store i32 %91, i32* %16
%92 = load i32, i32* %16
store i32 0, i32* %17
%93 = load %struct.mls_conf*, %struct.mls_conf** %6
%94 = call i32 @mls_conf_set(%struct.mls_conf* %93, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.9, i64 0, i64 0))
store i32 %94, i32* %17
%95 = load i32, i32* %17
%96 = icmp ne i32 0, %95
br i1 %96, label %97, label %102
97: ; preds = %89
br label %98
98: ; preds = %97
%99 = call i32 (i8*, ...) @mls_fatal_perror(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.10, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.9, i64 0, i64 0))
%100 = call i32 (...) @abort()
unreachable
101: ; No predecessors!
br label %102
102: ; preds = %101, %89
%103 = call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.11, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.9, i64 0, i64 0))
store i32 %103, i32* %18
%104 = load i32, i32* %18
store i32 0, i32* %19
%105 = load %struct.mls_conf*, %struct.mls_conf** %6
%106 = call i32 @mls_conf_set(%struct.mls_conf* %105, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.13, i64 0, i64 0))
store i32 %106, i32* %19
%107 = load i32, i32* %19
%108 = icmp ne i32 0, %107
br i1 %108, label %109, label %114
109: ; preds = %102
br label %110
110: ; preds = %109
%111 = call i32 (i8*, ...) @mls_fatal_perror(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.10, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.13, i64 0, i64 0))
%112 = call i32 (...) @abort()
unreachable
113: ; No predecessors!
br label %114
114: ; preds = %113, %102
%115 = call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.11, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.13, i64 0, i64 0))
store i32 %115, i32* %20
%116 = load i32, i32* %20
%117 = load %struct.mls_conf*, %struct.mls_conf** %6
%118 = call i8* @mls_conf_get(%struct.mls_conf* %117, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0))
store i8* %118, i8** %21
%119 = load i8*, i8** %21
%120 = icmp ne i8* null, %119
br i1 %120, label %121, label %123
121: ; preds = %114
%122 = load i8*, i8** %21
br label %124
123: ; preds = %114
br label %124
124: ; preds = %123, %121
%125 = phi i8* [ %122, %121 ], [ getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), %123 ]
%126 = call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0), i8* %125)
store i32 %126, i32* %22
%127 = load i32, i32* %22
%128 = load %struct.mls_conf*, %struct.mls_conf** %6
%129 = call i8* @mls_conf_get(%struct.mls_conf* %128, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i64 0, i64 0))
store i8* %129, i8** %23
%130 = load i8*, i8** %23
%131 = icmp ne i8* null, %130
br i1 %131, label %132, label %134
132: ; preds = %124
%133 = load i8*, i8** %23
br label %135
134: ; preds = %124
br label %135
135: ; preds = %134, %132
%136 = phi i8* [ %133, %132 ], [ getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), %134 ]
%137 = call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i64 0, i64 0), i8* %136)
store i32 %137, i32* %24
%138 = load i32, i32* %24
%139 = load %struct.mls_conf*, %struct.mls_conf** %6
%140 = call i8* @mls_conf_get(%struct.mls_conf* %139, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.8, i64 0, i64 0))
store i8* %140, i8** %25
%141 = load i8*, i8** %25
%142 = icmp ne i8* null, %141
br i1 %142, label %143, label %145
143: ; preds = %135
%144 = load i8*, i8** %25
br label %146
145: ; preds = %135
br label %146
146: ; preds = %145, %143
%147 = phi i8* [ %144, %143 ], [ getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), %145 ]
%148 = call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.8, i64 0, i64 0), i8* %147)
store i32 %148, i32* %26
%149 = load i32, i32* %26
%150 = load %struct.mls_conf*, %struct.mls_conf** %6
%151 = call i32 @mls_conf_store(%struct.mls_conf* %150)
%152 = load %struct.mls_conf*, %struct.mls_conf** %6
%153 = call i32 @mls_conf_fin(%struct.mls_conf* %152)
ret i32 0
}

LLVM IR (-O2):
%struct.mls_conf = type { i32 }
@.str = [11 x i8] c"./test.ini\00"
@.str.1 = [13 x i8] c"mls_conf_ini\00"
@.str.2 = [5 x i8] c"key1\00"
@.str.3 = [14 x i8] c"GET: %s = %s\0A\00"
@.str.4 = [9 x i8] c"NOTFOUND\00"
@.str.5 = [5 x i8] c"key2\00"
@.str.6 = [6 x i8] c"ckey1\00"
@.str.7 = [6 x i8] c"undef\00"
@.str.8 = [5 x i8] c"keyX\00"
@.str.9 = [12 x i8] c"modify-val2\00"
@.str.10 = [16 x i8] c"Set error %s:%s\00"
@.str.11 = [14 x i8] c"SET: %s = %s\0A\00"
@.str.12 = [5 x i8] c"key3\00"
@.str.13 = [5 x i8] c"val3\00"
define i32 @main(i32 %0, i8** nocapture readnone %1) {
%3 = tail call %struct.mls_conf* @mls_conf_ini(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i64 0, i64 0))
%4 = icmp eq %struct.mls_conf* %3, null
br i1 %4, label %5, label %8
5: ; preds = %2
%6 = tail call i32 (i8*, ...) @mls_fatal_perror(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.1, i64 0, i64 0))
%7 = tail call i32 (...) @abort()
unreachable
8: ; preds = %2
%9 = tail call i32 @mls_conf_load(%struct.mls_conf* %3)
%10 = tail call i8* @mls_conf_get(%struct.mls_conf* %3, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0))
%11 = icmp eq i8* %10, null
%12 = select i1 %11, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), i8* %10
%13 = tail call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i8* %12)
%14 = tail call i8* @mls_conf_get(%struct.mls_conf* %3, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0))
%15 = icmp eq i8* %14, null
%16 = select i1 %15, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), i8* %14
%17 = tail call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0), i8* %16)
%18 = tail call i8* @mls_conf_get(%struct.mls_conf* %3, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i64 0, i64 0))
%19 = icmp eq i8* %18, null
%20 = select i1 %19, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), i8* %18
%21 = tail call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i64 0, i64 0), i8* %20)
%22 = tail call i8* @mls_conf_get(%struct.mls_conf* %3, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.7, i64 0, i64 0))
%23 = icmp eq i8* %22, null
%24 = select i1 %23, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), i8* %22
%25 = tail call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.7, i64 0, i64 0), i8* %24)
%26 = tail call i8* @mls_conf_get(%struct.mls_conf* %3, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.8, i64 0, i64 0))
%27 = icmp eq i8* %26, null
%28 = select i1 %27, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), i8* %26
%29 = tail call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.8, i64 0, i64 0), i8* %28)
%30 = tail call i32 @mls_conf_set(%struct.mls_conf* %3, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.9, i64 0, i64 0))
%31 = icmp eq i32 %30, 0
br i1 %31, label %35, label %32
32: ; preds = %8
%33 = tail call i32 (i8*, ...) @mls_fatal_perror(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.10, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.9, i64 0, i64 0))
%34 = tail call i32 (...) @abort()
unreachable
35: ; preds = %8
%36 = tail call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.11, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.9, i64 0, i64 0))
%37 = tail call i32 @mls_conf_set(%struct.mls_conf* %3, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.13, i64 0, i64 0))
%38 = icmp eq i32 %37, 0
br i1 %38, label %42, label %39
39: ; preds = %35
%40 = tail call i32 (i8*, ...) @mls_fatal_perror(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.10, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.13, i64 0, i64 0))
%41 = tail call i32 (...) @abort()
unreachable
42: ; preds = %35
%43 = tail call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.11, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.13, i64 0, i64 0))
%44 = tail call i8* @mls_conf_get(%struct.mls_conf* %3, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0))
%45 = icmp eq i8* %44, null
%46 = select i1 %45, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), i8* %44
%47 = tail call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0), i8* %46)
%48 = tail call i8* @mls_conf_get(%struct.mls_conf* %3, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i64 0, i64 0))
%49 = icmp eq i8* %48, null
%50 = select i1 %49, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), i8* %48
%51 = tail call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i64 0, i64 0), i8* %50)
%52 = tail call i8* @mls_conf_get(%struct.mls_conf* %3, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.8, i64 0, i64 0))
%53 = icmp eq i8* %52, null
%54 = select i1 %53, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), i8* %52
%55 = tail call i32 @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.8, i64 0, i64 0), i8* %54)
%56 = tail call i32 @mls_conf_store(%struct.mls_conf* %3)
%57 = tail call i32 @mls_conf_fin(%struct.mls_conf* %3)
ret i32 0
}