#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 */

/* Variables and functions */
scalar_t__ isspace(int);
int strlen(char *);
char *jstr_ZotLeadTrailSpace(char *buf, int max) {
  int x, y;
  int len = strlen(buf);
  if (!buf)
    return (buf);
  if (len > max)
    return (buf);
  for ((x = len - 1);
       (x > 0) && (isspace((int)buf[x]) || (buf[x] <= ' ') || (buf[x] > '~'));
       (x--)) {
    buf[x] = '\0';
  }
  for ((x = 0);
       (x < max) && (isspace((int)buf[x]) || (buf[x] <= ' ') || (buf[x] > '~'));
       (x++))
    ;
  y = 0;
  for (; (x < max) && (buf[x] != '\0'); (x++)) {
    buf[y++] = buf[x];
  }
  buf[y] = '\0';
  return (buf);
}


x86 assembly (clang, -O0):
<jstr_ZotLeadTrailSpace>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x20(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    1153 <jstr_ZotLeadTrailSpace+0x33>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1318 <jstr_ZotLeadTrailSpace+0x1f8>
mov    -0x20(%rbp),%eax
cmp    -0x14(%rbp),%eax
jle    116c <jstr_ZotLeadTrailSpace+0x4c>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1318 <jstr_ZotLeadTrailSpace+0x1f8>
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x18(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x18(%rbp)
mov    %al,-0x21(%rbp)
jle    11dc <jstr_ZotLeadTrailSpace+0xbc>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1040 <isspace@plt>
mov    %rax,%rcx
mov    $0x1,%al
cmp    $0x0,%rcx
mov    %al,-0x22(%rbp)
jne    11d6 <jstr_ZotLeadTrailSpace+0xb6>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x22(%rbp)
jle    11d6 <jstr_ZotLeadTrailSpace+0xb6>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7e,%eax
setg   %al
mov    %al,-0x22(%rbp)
mov    -0x22(%rbp),%al
mov    %al,-0x21(%rbp)
mov    -0x21(%rbp),%al
test   $0x1,%al
jne    11ec <jstr_ZotLeadTrailSpace+0xcc>
jmp    1206 <jstr_ZotLeadTrailSpace+0xe6>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    1175 <jstr_ZotLeadTrailSpace+0x55>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%ecx
xor    %eax,%eax
cmp    -0x14(%rbp),%ecx
mov    %al,-0x23(%rbp)
jge    1276 <jstr_ZotLeadTrailSpace+0x156>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1040 <isspace@plt>
mov    %rax,%rcx
mov    $0x1,%al
cmp    $0x0,%rcx
mov    %al,-0x24(%rbp)
jne    1270 <jstr_ZotLeadTrailSpace+0x150>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x24(%rbp)
jle    1270 <jstr_ZotLeadTrailSpace+0x150>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7e,%eax
setg   %al
mov    %al,-0x24(%rbp)
mov    -0x24(%rbp),%al
mov    %al,-0x23(%rbp)
mov    -0x23(%rbp),%al
test   $0x1,%al
jne    1286 <jstr_ZotLeadTrailSpace+0x166>
jmp    1299 <jstr_ZotLeadTrailSpace+0x179>
jmp    128b <jstr_ZotLeadTrailSpace+0x16b>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    120d <jstr_ZotLeadTrailSpace+0xed>
movl   $0x0,-0x1c(%rbp)
mov    -0x18(%rbp),%ecx
xor    %eax,%eax
cmp    -0x14(%rbp),%ecx
mov    %al,-0x25(%rbp)
jge    12c6 <jstr_ZotLeadTrailSpace+0x1a6>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x25(%rbp)
mov    -0x25(%rbp),%al
test   $0x1,%al
jne    12d6 <jstr_ZotLeadTrailSpace+0x1b6>
jmp    1304 <jstr_ZotLeadTrailSpace+0x1e4>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x1c(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    12a0 <jstr_ZotLeadTrailSpace+0x180>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<jstr_ZotLeadTrailSpace>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %esi,%r14d
mov    %rdi,%r15
call   1030 <strlen@plt>
test   %r15,%r15
je     1216 <jstr_ZotLeadTrailSpace+0xf6>
cmp    %r14d,%eax
jg     1216 <jstr_ZotLeadTrailSpace+0xf6>
cmp    $0x2,%eax
jl     118d <jstr_ZotLeadTrailSpace+0x6d>
mov    %eax,%ebx
add    $0x1,%rbx
jmp    116f <jstr_ZotLeadTrailSpace+0x4f>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movb   $0x0,(%r15,%r12,1)
add    $0xffffffffffffffff,%rbx
cmp    $0x2,%rbx
jbe    118d <jstr_ZotLeadTrailSpace+0x6d>
lea    -0x2(%rbx),%r12d
movsbl (%r15,%r12,1),%edi
call   1040 <isspace@plt>
test   %rax,%rax
jne    1160 <jstr_ZotLeadTrailSpace+0x40>
movzbl (%r15,%r12,1),%eax
add    $0x81,%al
cmp    $0xa1,%al
jbe    1160 <jstr_ZotLeadTrailSpace+0x40>
xor    %r12d,%r12d
mov    $0x0,%ebx
test   %r14d,%r14d
jle    11d3 <jstr_ZotLeadTrailSpace+0xb3>
mov    %r14d,%r13d
xor    %ebx,%ebx
jmp    11b9 <jstr_ZotLeadTrailSpace+0x99>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%rbx
cmp    %rbx,%r13
je     120b <jstr_ZotLeadTrailSpace+0xeb>
movsbl (%r15,%rbx,1),%edi
call   1040 <isspace@plt>
test   %rax,%rax
jne    11b0 <jstr_ZotLeadTrailSpace+0x90>
movzbl (%r15,%rbx,1),%eax
add    $0x81,%al
cmp    $0xa1,%al
jbe    11b0 <jstr_ZotLeadTrailSpace+0x90>
cmp    %r14d,%ebx
jge    120e <jstr_ZotLeadTrailSpace+0xee>
mov    %ebx,%eax
sub    %ebx,%r14d
add    %r15,%rax
xor    %r12d,%r12d
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl (%rax,%r12,1),%ecx
test   %cl,%cl
je     120e <jstr_ZotLeadTrailSpace+0xee>
mov    %cl,(%r15,%r12,1)
add    $0x1,%r12
cmp    %r12,%r14
jne    11f0 <jstr_ZotLeadTrailSpace+0xd0>
mov    %r14d,%r12d
jmp    120e <jstr_ZotLeadTrailSpace+0xee>
xor    %r12d,%r12d
mov    %r12d,%eax
movb   $0x0,(%r15,%rax,1)
mov    %r15,%rax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define i8* @jstr_ZotLeadTrailSpace(i8* %0, i32 %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i8* %0, i8** %4
store i32 %1, i32* %5
%9 = load i8*, i8** %4
%10 = call i32 @strlen(i8* %9)
store i32 %10, i32* %8
%11 = load i8*, i8** %4
%12 = icmp ne i8* %11, null
br i1 %12, label %15, label %13
13: ; preds = %2
%14 = load i8*, i8** %4
store i8* %14, i8** %3
br label %137
15: ; preds = %2
%16 = load i32, i32* %8
%17 = load i32, i32* %5
%18 = icmp sgt i32 %16, %17
br i1 %18, label %19, label %21
19: ; preds = %15
%20 = load i8*, i8** %4
store i8* %20, i8** %3
br label %137
21: ; preds = %15
%22 = load i32, i32* %8
%23 = sub nsw i32 %22, 1
store i32 %23, i32* %6
br label %24
24: ; preds = %61, %21
%25 = load i32, i32* %6
%26 = icmp sgt i32 %25, 0
br i1 %26, label %27, label %54
27: ; preds = %24
%28 = load i8*, i8** %4
%29 = load i32, i32* %6
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds i8, i8* %28, i64 %30
%32 = load i8, i8* %31
%33 = sext i8 %32 to i32
%34 = call i64 @isspace(i32 %33)
%35 = icmp ne i64 %34, 0
br i1 %35, label %52, label %36
36: ; preds = %27
%37 = load i8*, i8** %4
%38 = load i32, i32* %6
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i8, i8* %37, i64 %39
%41 = load i8, i8* %40
%42 = sext i8 %41 to i32
%43 = icmp sle i32 %42, 32
br i1 %43, label %52, label %44
44: ; preds = %36
%45 = load i8*, i8** %4
%46 = load i32, i32* %6
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i8, i8* %45, i64 %47
%49 = load i8, i8* %48
%50 = sext i8 %49 to i32
%51 = icmp sgt i32 %50, 126
br label %52
52: ; preds = %44, %36, %27
%53 = phi i1 [ true, %36 ], [ true, %27 ], [ %51, %44 ]
br label %54
54: ; preds = %52, %24
%55 = phi i1 [ false, %24 ], [ %53, %52 ]
br i1 %55, label %56, label %64
56: ; preds = %54
%57 = load i8*, i8** %4
%58 = load i32, i32* %6
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i8, i8* %57, i64 %59
store i8 0, i8* %60
br label %61
61: ; preds = %56
%62 = load i32, i32* %6
%63 = add nsw i32 %62, -1
store i32 %63, i32* %6
br label %24
64: ; preds = %54
store i32 0, i32* %6
br label %65
65: ; preds = %99, %64
%66 = load i32, i32* %6
%67 = load i32, i32* %5
%68 = icmp slt i32 %66, %67
br i1 %68, label %69, label %96
69: ; preds = %65
%70 = load i8*, i8** %4
%71 = load i32, i32* %6
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds i8, i8* %70, i64 %72
%74 = load i8, i8* %73
%75 = sext i8 %74 to i32
%76 = call i64 @isspace(i32 %75)
%77 = icmp ne i64 %76, 0
br i1 %77, label %94, label %78
78: ; preds = %69
%79 = load i8*, i8** %4
%80 = load i32, i32* %6
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds i8, i8* %79, i64 %81
%83 = load i8, i8* %82
%84 = sext i8 %83 to i32
%85 = icmp sle i32 %84, 32
br i1 %85, label %94, label %86
86: ; preds = %78
%87 = load i8*, i8** %4
%88 = load i32, i32* %6
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds i8, i8* %87, i64 %89
%91 = load i8, i8* %90
%92 = sext i8 %91 to i32
%93 = icmp sgt i32 %92, 126
br label %94
94: ; preds = %86, %78, %69
%95 = phi i1 [ true, %78 ], [ true, %69 ], [ %93, %86 ]
br label %96
96: ; preds = %94, %65
%97 = phi i1 [ false, %65 ], [ %95, %94 ]
br i1 %97, label %98, label %102
98: ; preds = %96
br label %99
99: ; preds = %98
%100 = load i32, i32* %6
%101 = add nsw i32 %100, 1
store i32 %101, i32* %6
br label %65
102: ; preds = %96
store i32 0, i32* %7
br label %103
103: ; preds = %128, %102
%104 = load i32, i32* %6
%105 = load i32, i32* %5
%106 = icmp slt i32 %104, %105
br i1 %106, label %107, label %115
107: ; preds = %103
%108 = load i8*, i8** %4
%109 = load i32, i32* %6
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds i8, i8* %108, i64 %110
%112 = load i8, i8* %111
%113 = sext i8 %112 to i32
%114 = icmp ne i32 %113, 0
br label %115
115: ; preds = %107, %103
%116 = phi i1 [ false, %103 ], [ %114, %107 ]
br i1 %116, label %117, label %131
117: ; preds = %115
%118 = load i8*, i8** %4
%119 = load i32, i32* %6
%120 = sext i32 %119 to i64
%121 = getelementptr inbounds i8, i8* %118, i64 %120
%122 = load i8, i8* %121
%123 = load i8*, i8** %4
%124 = load i32, i32* %7
%125 = add nsw i32 %124, 1
store i32 %125, i32* %7
%126 = sext i32 %124 to i64
%127 = getelementptr inbounds i8, i8* %123, i64 %126
store i8 %122, i8* %127
br label %128
128: ; preds = %117
%129 = load i32, i32* %6
%130 = add nsw i32 %129, 1
store i32 %130, i32* %6
br label %103
131: ; preds = %115
%132 = load i8*, i8** %4
%133 = load i32, i32* %7
%134 = sext i32 %133 to i64
%135 = getelementptr inbounds i8, i8* %132, i64 %134
store i8 0, i8* %135
%136 = load i8*, i8** %4
store i8* %136, i8** %3
br label %137
137: ; preds = %131, %19, %13
%138 = load i8*, i8** %3
ret i8* %138
}

LLVM IR (-O2):
define i8* @jstr_ZotLeadTrailSpace(i8* returned %0, i32 %1) {
%3 = tail call i32 @strlen(i8* %0)
%4 = icmp eq i8* %0, null
%5 = icmp sgt i32 %3, %1
%6 = select i1 %4, i1 true, i1 %5
br i1 %6, label %70, label %7
7: ; preds = %2
%8 = icmp sgt i32 %3, 1
br i1 %8, label %9, label %26
9: ; preds = %7
%10 = zext i32 %3 to i64
br label %11
11: ; preds = %9, %24
%12 = phi i64 [ %10, %9 ], [ %13, %24 ]
%13 = add nsw i64 %12, -1
%14 = and i64 %13, 4294967295
%15 = getelementptr inbounds i8, i8* %0, i64 %14
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = tail call i64 @isspace(i32 %17)
%19 = icmp eq i64 %18, 0
br i1 %19, label %20, label %24
20: ; preds = %11
%21 = load i8, i8* %15
%22 = add i8 %21, -127
%23 = icmp ult i8 %22, -94
br i1 %23, label %24, label %26
24: ; preds = %11, %20
store i8 0, i8* %15
%25 = icmp ugt i64 %12, 2
br i1 %25, label %11, label %26
26: ; preds = %24, %20, %7
%27 = icmp sgt i32 %1, 0
br i1 %27, label %28, label %46
28: ; preds = %26
%29 = zext i32 %1 to i64
br label %30
30: ; preds = %28, %41
%31 = phi i64 [ 0, %28 ], [ %42, %41 ]
%32 = getelementptr inbounds i8, i8* %0, i64 %31
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
%35 = tail call i64 @isspace(i32 %34)
%36 = icmp eq i64 %35, 0
br i1 %36, label %37, label %41
37: ; preds = %30
%38 = load i8, i8* %32
%39 = add i8 %38, -127
%40 = icmp ult i8 %39, -94
br i1 %40, label %41, label %44
41: ; preds = %30, %37
%42 = add nuw nsw i64 %31, 1
%43 = icmp eq i64 %42, %29
br i1 %43, label %66, label %30
44: ; preds = %37
%45 = trunc i64 %31 to i32
br label %46
46: ; preds = %44, %26
%47 = phi i32 [ 0, %26 ], [ %45, %44 ]
%48 = icmp slt i32 %47, %1
br i1 %48, label %49, label %66
49: ; preds = %46
%50 = zext i32 %47 to i64
%51 = sub i32 %1, %47
%52 = zext i32 %51 to i64
br label %53
53: ; preds = %49, %59
%54 = phi i64 [ %50, %49 ], [ %62, %59 ]
%55 = phi i64 [ 0, %49 ], [ %60, %59 ]
%56 = getelementptr inbounds i8, i8* %0, i64 %54
%57 = load i8, i8* %56
%58 = icmp eq i8 %57, 0
br i1 %58, label %64, label %59
59: ; preds = %53
%60 = add nuw nsw i64 %55, 1
%61 = getelementptr inbounds i8, i8* %0, i64 %55
store i8 %57, i8* %61
%62 = add nuw nsw i64 %54, 1
%63 = icmp eq i64 %60, %52
br i1 %63, label %66, label %53
64: ; preds = %53
%65 = trunc i64 %55 to i32
br label %66
66: ; preds = %41, %59, %64, %46
%67 = phi i32 [ 0, %46 ], [ %65, %64 ], [ %51, %59 ], [ 0, %41 ]
%68 = zext i32 %67 to i64
%69 = getelementptr inbounds i8, i8* %0, i64 %68
store i8 0, i8* %69
br label %70
70: ; preds = %2, %66
ret i8* %0
}