; LLVM IR from BrunoLevy/learn-fpga :: LiteX/software/Doom/mc1-doom/src (r_things)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.drawseg_s = type { ptr, i32, i32, i32, i32, i32, i32, i32, i32, ptr, ptr, ptr }
%struct.vissprite_s = type { ptr, ptr, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, i32 }

@mfloorclip = external dso_local global ptr, align 8
@mceilingclip = external dso_local global ptr, align 8
@ds_p = external global ptr, align 8
@drawsegs = external global [256 x %struct.drawseg_s], align 16
@viewheight = external global i32, align 4

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: nounwind uwtable
declare dso_local void @R_DrawVisSprite(ptr noundef, i32 noundef, i32 noundef) #1

; Function Attrs: nounwind uwtable
define dso_local void @R_DrawSprite(ptr noundef %0) #1 {
  %2 = alloca ptr, align 8
  %3 = alloca ptr, align 8
  %4 = alloca [320 x i16], align 16
  %5 = alloca [320 x i16], align 16
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  store ptr %0, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %3) #3
  call void @llvm.lifetime.start.p0(i64 640, ptr %4) #3
  call void @llvm.lifetime.start.p0(i64 640, ptr %5) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #3
  %12 = load ptr, ptr %2, align 8, !tbaa !5
  %13 = getelementptr inbounds %struct.vissprite_s, ptr %12, i32 0, i32 2
  %14 = load i32, ptr %13, align 8, !tbaa !9
  store i32 %14, ptr %6, align 4, !tbaa !12
  br label %15

15:                                               ; preds = %28, %1
  %16 = load i32, ptr %6, align 4, !tbaa !12
  %17 = load ptr, ptr %2, align 8, !tbaa !5
  %18 = getelementptr inbounds %struct.vissprite_s, ptr %17, i32 0, i32 3
  %19 = load i32, ptr %18, align 4, !tbaa !13
  %20 = icmp sle i32 %16, %19
  br i1 %20, label %21, label %31

21:                                               ; preds = %15
  %22 = load i32, ptr %6, align 4, !tbaa !12
  %23 = sext i32 %22 to i64
  %24 = getelementptr inbounds [320 x i16], ptr %5, i64 0, i64 %23
  store i16 -2, ptr %24, align 2, !tbaa !14
  %25 = load i32, ptr %6, align 4, !tbaa !12
  %26 = sext i32 %25 to i64
  %27 = getelementptr inbounds [320 x i16], ptr %4, i64 0, i64 %26
  store i16 -2, ptr %27, align 2, !tbaa !14
  br label %28

28:                                               ; preds = %21
  %29 = load i32, ptr %6, align 4, !tbaa !12
  %30 = add nsw i32 %29, 1
  store i32 %30, ptr %6, align 4, !tbaa !12
  br label %15, !llvm.loop !16

31:                                               ; preds = %15
  %32 = load ptr, ptr @ds_p, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.drawseg_s, ptr %32, i64 -1
  store ptr %33, ptr %3, align 8, !tbaa !5
  br label %34

34:                                               ; preds = %296, %31
  %35 = load ptr, ptr %3, align 8, !tbaa !5
  %36 = icmp uge ptr %35, @drawsegs
  br i1 %36, label %37, label %299

37:                                               ; preds = %34
  %38 = load ptr, ptr %3, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct.drawseg_s, ptr %38, i32 0, i32 1
  %40 = load i32, ptr %39, align 8, !tbaa !18
  %41 = load ptr, ptr %2, align 8, !tbaa !5
  %42 = getelementptr inbounds %struct.vissprite_s, ptr %41, i32 0, i32 3
  %43 = load i32, ptr %42, align 4, !tbaa !13
  %44 = icmp sgt i32 %40, %43
  br i1 %44, label %63, label %45

45:                                               ; preds = %37
  %46 = load ptr, ptr %3, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.drawseg_s, ptr %46, i32 0, i32 2
  %48 = load i32, ptr %47, align 4, !tbaa !20
  %49 = load ptr, ptr %2, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.vissprite_s, ptr %49, i32 0, i32 2
  %51 = load i32, ptr %50, align 8, !tbaa !9
  %52 = icmp slt i32 %48, %51
  br i1 %52, label %63, label %53

53:                                               ; preds = %45
  %54 = load ptr, ptr %3, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct.drawseg_s, ptr %54, i32 0, i32 6
  %56 = load i32, ptr %55, align 4, !tbaa !21
  %57 = icmp ne i32 %56, 0
  br i1 %57, label %64, label %58

58:                                               ; preds = %53
  %59 = load ptr, ptr %3, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.drawseg_s, ptr %59, i32 0, i32 11
  %61 = load ptr, ptr %60, align 8, !tbaa !22
  %62 = icmp ne ptr %61, null
  br i1 %62, label %64, label %63

63:                                               ; preds = %58, %45, %37
  br label %296

64:                                               ; preds = %58, %53
  %65 = load ptr, ptr %3, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct.drawseg_s, ptr %65, i32 0, i32 1
  %67 = load i32, ptr %66, align 8, !tbaa !18
  %68 = load ptr, ptr %2, align 8, !tbaa !5
  %69 = getelementptr inbounds %struct.vissprite_s, ptr %68, i32 0, i32 2
  %70 = load i32, ptr %69, align 8, !tbaa !9
  %71 = icmp slt i32 %67, %70
  br i1 %71, label %72, label %76

72:                                               ; preds = %64
  %73 = load ptr, ptr %2, align 8, !tbaa !5
  %74 = getelementptr inbounds %struct.vissprite_s, ptr %73, i32 0, i32 2
  %75 = load i32, ptr %74, align 8, !tbaa !9
  br label %80

76:                                               ; preds = %64
  %77 = load ptr, ptr %3, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.drawseg_s, ptr %77, i32 0, i32 1
  %79 = load i32, ptr %78, align 8, !tbaa !18
  br label %80

80:                                               ; preds = %76, %72
  %81 = phi i32 [ %75, %72 ], [ %79, %76 ]
  store i32 %81, ptr %7, align 4, !tbaa !12
  %82 = load ptr, ptr %3, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.drawseg_s, ptr %82, i32 0, i32 2
  %84 = load i32, ptr %83, align 4, !tbaa !20
  %85 = load ptr, ptr %2, align 8, !tbaa !5
  %86 = getelementptr inbounds %struct.vissprite_s, ptr %85, i32 0, i32 3
  %87 = load i32, ptr %86, align 4, !tbaa !13
  %88 = icmp sgt i32 %84, %87
  br i1 %88, label %89, label %93

89:                                               ; preds = %80
  %90 = load ptr, ptr %2, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.vissprite_s, ptr %90, i32 0, i32 3
  %92 = load i32, ptr %91, align 4, !tbaa !13
  br label %97

93:                                               ; preds = %80
  %94 = load ptr, ptr %3, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.drawseg_s, ptr %94, i32 0, i32 2
  %96 = load i32, ptr %95, align 4, !tbaa !20
  br label %97

97:                                               ; preds = %93, %89
  %98 = phi i32 [ %92, %89 ], [ %96, %93 ]
  store i32 %98, ptr %8, align 4, !tbaa !12
  %99 = load ptr, ptr %3, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.drawseg_s, ptr %99, i32 0, i32 3
  %101 = load i32, ptr %100, align 8, !tbaa !23
  %102 = load ptr, ptr %3, align 8, !tbaa !5
  %103 = getelementptr inbounds %struct.drawseg_s, ptr %102, i32 0, i32 4
  %104 = load i32, ptr %103, align 4, !tbaa !24
  %105 = icmp sgt i32 %101, %104
  br i1 %105, label %106, label %113

106:                                              ; preds = %97
  %107 = load ptr, ptr %3, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct.drawseg_s, ptr %107, i32 0, i32 4
  %109 = load i32, ptr %108, align 4, !tbaa !24
  store i32 %109, ptr %10, align 4, !tbaa !12
  %110 = load ptr, ptr %3, align 8, !tbaa !5
  %111 = getelementptr inbounds %struct.drawseg_s, ptr %110, i32 0, i32 3
  %112 = load i32, ptr %111, align 8, !tbaa !23
  store i32 %112, ptr %9, align 4, !tbaa !12
  br label %120

113:                                              ; preds = %97
  %114 = load ptr, ptr %3, align 8, !tbaa !5
  %115 = getelementptr inbounds %struct.drawseg_s, ptr %114, i32 0, i32 3
  %116 = load i32, ptr %115, align 8, !tbaa !23
  store i32 %116, ptr %10, align 4, !tbaa !12
  %117 = load ptr, ptr %3, align 8, !tbaa !5
  %118 = getelementptr inbounds %struct.drawseg_s, ptr %117, i32 0, i32 4
  %119 = load i32, ptr %118, align 4, !tbaa !24
  store i32 %119, ptr %9, align 4, !tbaa !12
  br label %120

120:                                              ; preds = %113, %106
  %121 = load i32, ptr %9, align 4, !tbaa !12
  %122 = load ptr, ptr %2, align 8, !tbaa !5
  %123 = getelementptr inbounds %struct.vissprite_s, ptr %122, i32 0, i32 9
  %124 = load i32, ptr %123, align 4, !tbaa !25
  %125 = icmp slt i32 %121, %124
  br i1 %125, label %144, label %126

126:                                              ; preds = %120
  %127 = load i32, ptr %10, align 4, !tbaa !12
  %128 = load ptr, ptr %2, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct.vissprite_s, ptr %128, i32 0, i32 9
  %130 = load i32, ptr %129, align 4, !tbaa !25
  %131 = icmp slt i32 %127, %130
  br i1 %131, label %132, label %154

132:                                              ; preds = %126
  %133 = load ptr, ptr %2, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.vissprite_s, ptr %133, i32 0, i32 4
  %135 = load i32, ptr %134, align 8, !tbaa !26
  %136 = load ptr, ptr %2, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.vissprite_s, ptr %136, i32 0, i32 5
  %138 = load i32, ptr %137, align 4, !tbaa !27
  %139 = load ptr, ptr %3, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct.drawseg_s, ptr %139, i32 0, i32 0
  %141 = load ptr, ptr %140, align 8, !tbaa !28
  %142 = call i32 @R_PointOnSegSide(i32 noundef %135, i32 noundef %138, ptr noundef %141)
  %143 = icmp ne i32 %142, 0
  br i1 %143, label %154, label %144

144:                                              ; preds = %132, %120
  %145 = load ptr, ptr %3, align 8, !tbaa !5
  %146 = getelementptr inbounds %struct.drawseg_s, ptr %145, i32 0, i32 11
  %147 = load ptr, ptr %146, align 8, !tbaa !22
  %148 = icmp ne ptr %147, null
  br i1 %148, label %149, label %153

149:                                              ; preds = %144
  %150 = load ptr, ptr %3, align 8, !tbaa !5
  %151 = load i32, ptr %7, align 4, !tbaa !12
  %152 = load i32, ptr %8, align 4, !tbaa !12
  call void @R_RenderMaskedSegRange(ptr noundef %150, i32 noundef %151, i32 noundef %152)
  br label %153

153:                                              ; preds = %149, %144
  br label %296

154:                                              ; preds = %132, %126
  %155 = load ptr, ptr %3, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.drawseg_s, ptr %155, i32 0, i32 6
  %157 = load i32, ptr %156, align 4, !tbaa !21
  store i32 %157, ptr %11, align 4, !tbaa !12
  %158 = load ptr, ptr %2, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct.vissprite_s, ptr %158, i32 0, i32 6
  %160 = load i32, ptr %159, align 8, !tbaa !29
  %161 = load ptr, ptr %3, align 8, !tbaa !5
  %162 = getelementptr inbounds %struct.drawseg_s, ptr %161, i32 0, i32 7
  %163 = load i32, ptr %162, align 8, !tbaa !30
  %164 = icmp sge i32 %160, %163
  br i1 %164, label %165, label %168

165:                                              ; preds = %154
  %166 = load i32, ptr %11, align 4, !tbaa !12
  %167 = and i32 %166, -2
  store i32 %167, ptr %11, align 4, !tbaa !12
  br label %168

168:                                              ; preds = %165, %154
  %169 = load ptr, ptr %2, align 8, !tbaa !5
  %170 = getelementptr inbounds %struct.vissprite_s, ptr %169, i32 0, i32 7
  %171 = load i32, ptr %170, align 4, !tbaa !31
  %172 = load ptr, ptr %3, align 8, !tbaa !5
  %173 = getelementptr inbounds %struct.drawseg_s, ptr %172, i32 0, i32 8
  %174 = load i32, ptr %173, align 4, !tbaa !32
  %175 = icmp sle i32 %171, %174
  br i1 %175, label %176, label %179

176:                                              ; preds = %168
  %177 = load i32, ptr %11, align 4, !tbaa !12
  %178 = and i32 %177, -3
  store i32 %178, ptr %11, align 4, !tbaa !12
  br label %179

179:                                              ; preds = %176, %168
  %180 = load i32, ptr %11, align 4, !tbaa !12
  %181 = icmp eq i32 %180, 1
  br i1 %181, label %182, label %211

182:                                              ; preds = %179
  %183 = load i32, ptr %7, align 4, !tbaa !12
  store i32 %183, ptr %6, align 4, !tbaa !12
  br label %184

184:                                              ; preds = %207, %182
  %185 = load i32, ptr %6, align 4, !tbaa !12
  %186 = load i32, ptr %8, align 4, !tbaa !12
  %187 = icmp sle i32 %185, %186
  br i1 %187, label %188, label %210

188:                                              ; preds = %184
  %189 = load i32, ptr %6, align 4, !tbaa !12
  %190 = sext i32 %189 to i64
  %191 = getelementptr inbounds [320 x i16], ptr %4, i64 0, i64 %190
  %192 = load i16, ptr %191, align 2, !tbaa !14
  %193 = sext i16 %192 to i32
  %194 = icmp eq i32 %193, -2
  br i1 %194, label %195, label %206

195:                                              ; preds = %188
  %196 = load ptr, ptr %3, align 8, !tbaa !5
  %197 = getelementptr inbounds %struct.drawseg_s, ptr %196, i32 0, i32 10
  %198 = load ptr, ptr %197, align 8, !tbaa !33
  %199 = load i32, ptr %6, align 4, !tbaa !12
  %200 = sext i32 %199 to i64
  %201 = getelementptr inbounds i16, ptr %198, i64 %200
  %202 = load i16, ptr %201, align 2, !tbaa !14
  %203 = load i32, ptr %6, align 4, !tbaa !12
  %204 = sext i32 %203 to i64
  %205 = getelementptr inbounds [320 x i16], ptr %4, i64 0, i64 %204
  store i16 %202, ptr %205, align 2, !tbaa !14
  br label %206

206:                                              ; preds = %195, %188
  br label %207

207:                                              ; preds = %206
  %208 = load i32, ptr %6, align 4, !tbaa !12
  %209 = add nsw i32 %208, 1
  store i32 %209, ptr %6, align 4, !tbaa !12
  br label %184, !llvm.loop !34

210:                                              ; preds = %184
  br label %295

211:                                              ; preds = %179
  %212 = load i32, ptr %11, align 4, !tbaa !12
  %213 = icmp eq i32 %212, 2
  br i1 %213, label %214, label %243

214:                                              ; preds = %211
  %215 = load i32, ptr %7, align 4, !tbaa !12
  store i32 %215, ptr %6, align 4, !tbaa !12
  br label %216

216:                                              ; preds = %239, %214
  %217 = load i32, ptr %6, align 4, !tbaa !12
  %218 = load i32, ptr %8, align 4, !tbaa !12
  %219 = icmp sle i32 %217, %218
  br i1 %219, label %220, label %242

220:                                              ; preds = %216
  %221 = load i32, ptr %6, align 4, !tbaa !12
  %222 = sext i32 %221 to i64
  %223 = getelementptr inbounds [320 x i16], ptr %5, i64 0, i64 %222
  %224 = load i16, ptr %223, align 2, !tbaa !14
  %225 = sext i16 %224 to i32
  %226 = icmp eq i32 %225, -2
  br i1 %226, label %227, label %238

227:                                              ; preds = %220
  %228 = load ptr, ptr %3, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.drawseg_s, ptr %228, i32 0, i32 9
  %230 = load ptr, ptr %229, align 8, !tbaa !35
  %231 = load i32, ptr %6, align 4, !tbaa !12
  %232 = sext i32 %231 to i64
  %233 = getelementptr inbounds i16, ptr %230, i64 %232
  %234 = load i16, ptr %233, align 2, !tbaa !14
  %235 = load i32, ptr %6, align 4, !tbaa !12
  %236 = sext i32 %235 to i64
  %237 = getelementptr inbounds [320 x i16], ptr %5, i64 0, i64 %236
  store i16 %234, ptr %237, align 2, !tbaa !14
  br label %238

238:                                              ; preds = %227, %220
  br label %239

239:                                              ; preds = %238
  %240 = load i32, ptr %6, align 4, !tbaa !12
  %241 = add nsw i32 %240, 1
  store i32 %241, ptr %6, align 4, !tbaa !12
  br label %216, !llvm.loop !36

242:                                              ; preds = %216
  br label %294

243:                                              ; preds = %211
  %244 = load i32, ptr %11, align 4, !tbaa !12
  %245 = icmp eq i32 %244, 3
  br i1 %245, label %246, label %293

246:                                              ; preds = %243
  %247 = load i32, ptr %7, align 4, !tbaa !12
  store i32 %247, ptr %6, align 4, !tbaa !12
  br label %248

248:                                              ; preds = %289, %246
  %249 = load i32, ptr %6, align 4, !tbaa !12
  %250 = load i32, ptr %8, align 4, !tbaa !12
  %251 = icmp sle i32 %249, %250
  br i1 %251, label %252, label %292

252:                                              ; preds = %248
  %253 = load i32, ptr %6, align 4, !tbaa !12
  %254 = sext i32 %253 to i64
  %255 = getelementptr inbounds [320 x i16], ptr %4, i64 0, i64 %254
  %256 = load i16, ptr %255, align 2, !tbaa !14
  %257 = sext i16 %256 to i32
  %258 = icmp eq i32 %257, -2
  br i1 %258, label %259, label %270

259:                                              ; preds = %252
  %260 = load ptr, ptr %3, align 8, !tbaa !5
  %261 = getelementptr inbounds %struct.drawseg_s, ptr %260, i32 0, i32 10
  %262 = load ptr, ptr %261, align 8, !tbaa !33
  %263 = load i32, ptr %6, align 4, !tbaa !12
  %264 = sext i32 %263 to i64
  %265 = getelementptr inbounds i16, ptr %262, i64 %264
  %266 = load i16, ptr %265, align 2, !tbaa !14
  %267 = load i32, ptr %6, align 4, !tbaa !12
  %268 = sext i32 %267 to i64
  %269 = getelementptr inbounds [320 x i16], ptr %4, i64 0, i64 %268
  store i16 %266, ptr %269, align 2, !tbaa !14
  br label %270

270:                                              ; preds = %259, %252
  %271 = load i32, ptr %6, align 4, !tbaa !12
  %272 = sext i32 %271 to i64
  %273 = getelementptr inbounds [320 x i16], ptr %5, i64 0, i64 %272
  %274 = load i16, ptr %273, align 2, !tbaa !14
  %275 = sext i16 %274 to i32
  %276 = icmp eq i32 %275, -2
  br i1 %276, label %277, label %288

277:                                              ; preds = %270
  %278 = load ptr, ptr %3, align 8, !tbaa !5
  %279 = getelementptr inbounds %struct.drawseg_s, ptr %278, i32 0, i32 9
  %280 = load ptr, ptr %279, align 8, !tbaa !35
  %281 = load i32, ptr %6, align 4, !tbaa !12
  %282 = sext i32 %281 to i64
  %283 = getelementptr inbounds i16, ptr %280, i64 %282
  %284 = load i16, ptr %283, align 2, !tbaa !14
  %285 = load i32, ptr %6, align 4, !tbaa !12
  %286 = sext i32 %285 to i64
  %287 = getelementptr inbounds [320 x i16], ptr %5, i64 0, i64 %286
  store i16 %284, ptr %287, align 2, !tbaa !14
  br label %288

288:                                              ; preds = %277, %270
  br label %289

289:                                              ; preds = %288
  %290 = load i32, ptr %6, align 4, !tbaa !12
  %291 = add nsw i32 %290, 1
  store i32 %291, ptr %6, align 4, !tbaa !12
  br label %248, !llvm.loop !37

292:                                              ; preds = %248
  br label %293

293:                                              ; preds = %292, %243
  br label %294

294:                                              ; preds = %293, %242
  br label %295

295:                                              ; preds = %294, %210
  br label %296

296:                                              ; preds = %295, %153, %63
  %297 = load ptr, ptr %3, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct.drawseg_s, ptr %297, i32 -1
  store ptr %298, ptr %3, align 8, !tbaa !5
  br label %34, !llvm.loop !38

299:                                              ; preds = %34
  %300 = load ptr, ptr %2, align 8, !tbaa !5
  %301 = getelementptr inbounds %struct.vissprite_s, ptr %300, i32 0, i32 2
  %302 = load i32, ptr %301, align 8, !tbaa !9
  store i32 %302, ptr %6, align 4, !tbaa !12
  br label %303

303:                                              ; preds = %334, %299
  %304 = load i32, ptr %6, align 4, !tbaa !12
  %305 = load ptr, ptr %2, align 8, !tbaa !5
  %306 = getelementptr inbounds %struct.vissprite_s, ptr %305, i32 0, i32 3
  %307 = load i32, ptr %306, align 4, !tbaa !13
  %308 = icmp sle i32 %304, %307
  br i1 %308, label %309, label %337

309:                                              ; preds = %303
  %310 = load i32, ptr %6, align 4, !tbaa !12
  %311 = sext i32 %310 to i64
  %312 = getelementptr inbounds [320 x i16], ptr %4, i64 0, i64 %311
  %313 = load i16, ptr %312, align 2, !tbaa !14
  %314 = sext i16 %313 to i32
  %315 = icmp eq i32 %314, -2
  br i1 %315, label %316, label %322

316:                                              ; preds = %309
  %317 = load i32, ptr @viewheight, align 4, !tbaa !12
  %318 = trunc i32 %317 to i16
  %319 = load i32, ptr %6, align 4, !tbaa !12
  %320 = sext i32 %319 to i64
  %321 = getelementptr inbounds [320 x i16], ptr %4, i64 0, i64 %320
  store i16 %318, ptr %321, align 2, !tbaa !14
  br label %322

322:                                              ; preds = %316, %309
  %323 = load i32, ptr %6, align 4, !tbaa !12
  %324 = sext i32 %323 to i64
  %325 = getelementptr inbounds [320 x i16], ptr %5, i64 0, i64 %324
  %326 = load i16, ptr %325, align 2, !tbaa !14
  %327 = sext i16 %326 to i32
  %328 = icmp eq i32 %327, -2
  br i1 %328, label %329, label %333

329:                                              ; preds = %322
  %330 = load i32, ptr %6, align 4, !tbaa !12
  %331 = sext i32 %330 to i64
  %332 = getelementptr inbounds [320 x i16], ptr %5, i64 0, i64 %331
  store i16 -1, ptr %332, align 2, !tbaa !14
  br label %333

333:                                              ; preds = %329, %322
  br label %334

334:                                              ; preds = %333
  %335 = load i32, ptr %6, align 4, !tbaa !12
  %336 = add nsw i32 %335, 1
  store i32 %336, ptr %6, align 4, !tbaa !12
  br label %303, !llvm.loop !39

337:                                              ; preds = %303
  %338 = getelementptr inbounds [320 x i16], ptr %4, i64 0, i64 0
  store ptr %338, ptr @mfloorclip, align 8, !tbaa !5
  %339 = getelementptr inbounds [320 x i16], ptr %5, i64 0, i64 0
  store ptr %339, ptr @mceilingclip, align 8, !tbaa !5
  %340 = load ptr, ptr %2, align 8, !tbaa !5
  %341 = load ptr, ptr %2, align 8, !tbaa !5
  %342 = getelementptr inbounds %struct.vissprite_s, ptr %341, i32 0, i32 2
  %343 = load i32, ptr %342, align 8, !tbaa !9
  %344 = load ptr, ptr %2, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.vissprite_s, ptr %344, i32 0, i32 3
  %346 = load i32, ptr %345, align 4, !tbaa !13
  call void @R_DrawVisSprite(ptr noundef %340, i32 noundef %343, i32 noundef %346)
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #3
  call void @llvm.lifetime.end.p0(i64 640, ptr %5) #3
  call void @llvm.lifetime.end.p0(i64 640, ptr %4) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %3) #3
  ret void
}

declare i32 @R_PointOnSegSide(i32 noundef, i32 noundef, ptr noundef) #2

declare void @R_RenderMaskedSegRange(ptr noundef, i32 noundef, i32 noundef) #2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !11, i64 16}
!10 = !{!"vissprite_s", !6, i64 0, !6, i64 8, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !11, i64 40, !11, i64 44, !11, i64 48, !11, i64 52, !11, i64 56, !6, i64 64, !11, i64 72}
!11 = !{!"int", !7, i64 0}
!12 = !{!11, !11, i64 0}
!13 = !{!10, !11, i64 20}
!14 = !{!15, !15, i64 0}
!15 = !{!"short", !7, i64 0}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.mustprogress"}
!18 = !{!19, !11, i64 8}
!19 = !{!"drawseg_s", !6, i64 0, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !6, i64 40, !6, i64 48, !6, i64 56}
!20 = !{!19, !11, i64 12}
!21 = !{!19, !11, i64 28}
!22 = !{!19, !6, i64 56}
!23 = !{!19, !11, i64 16}
!24 = !{!19, !11, i64 20}
!25 = !{!10, !11, i64 44}
!26 = !{!10, !11, i64 24}
!27 = !{!10, !11, i64 28}
!28 = !{!19, !6, i64 0}
!29 = !{!10, !11, i64 32}
!30 = !{!19, !11, i64 32}
!31 = !{!10, !11, i64 36}
!32 = !{!19, !11, i64 36}
!33 = !{!19, !6, i64 48}
!34 = distinct !{!34, !17}
!35 = !{!19, !6, i64 40}
!36 = distinct !{!36, !17}
!37 = distinct !{!37, !17}
!38 = distinct !{!38, !17}
!39 = distinct !{!39, !17}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.drawseg_s = type { ptr, i32, i32, i32, i32, i32, i32, i32, i32, ptr, ptr, ptr }

@mfloorclip = external dso_local local_unnamed_addr global ptr, align 8
@mceilingclip = external dso_local local_unnamed_addr global ptr, align 8
@ds_p = external local_unnamed_addr global ptr, align 8
@drawsegs = external global [256 x %struct.drawseg_s], align 16
@viewheight = external local_unnamed_addr global i32, align 4

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: nounwind uwtable
declare dso_local void @R_DrawVisSprite(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local void @R_DrawSprite(ptr noundef %0) local_unnamed_addr #1 {
  %2 = alloca [320 x i16], align 16
  %3 = alloca [320 x i16], align 16
  call void @llvm.lifetime.start.p0(i64 640, ptr nonnull %2) #4
  call void @llvm.lifetime.start.p0(i64 640, ptr nonnull %3) #4
  %4 = getelementptr inbounds i8, ptr %0, i64 16
  %5 = load i32, ptr %4, align 8, !tbaa !5
  %6 = getelementptr inbounds i8, ptr %0, i64 20
  %7 = load i32, ptr %6, align 4, !tbaa !11
  %.not117 = icmp sgt i32 %5, %7
  br i1 %.not117, label %._crit_edge, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %1
  %8 = sext i32 %5 to i64
  %9 = add i32 %7, 1
  %10 = sub i32 %7, %5
  %11 = zext i32 %10 to i64
  %12 = add nuw nsw i64 %11, 1
  %min.iters.check = icmp ult i32 %10, 15
  br i1 %min.iters.check, label %.lr.ph.preheader171, label %vector.ph

vector.ph:                                        ; preds = %.lr.ph.preheader
  %n.vec = and i64 %12, 8589934576
  %ind.end = add nsw i64 %n.vec, %8
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %offset.idx = add i64 %index, %8
  %13 = getelementptr inbounds [320 x i16], ptr %3, i64 0, i64 %offset.idx
  %14 = getelementptr inbounds i8, ptr %13, i64 16
  store <8 x i16> <i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2>, ptr %13, align 2, !tbaa !12
  store <8 x i16> <i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2>, ptr %14, align 2, !tbaa !12
  %15 = getelementptr inbounds [320 x i16], ptr %2, i64 0, i64 %offset.idx
  %16 = getelementptr inbounds i8, ptr %15, i64 16
  store <8 x i16> <i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2>, ptr %15, align 2, !tbaa !12
  store <8 x i16> <i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2, i16 -2>, ptr %16, align 2, !tbaa !12
  %index.next = add nuw i64 %index, 16
  %17 = icmp eq i64 %index.next, %n.vec
  br i1 %17, label %middle.block, label %vector.body, !llvm.loop !14

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %12, %n.vec
  br i1 %cmp.n, label %._crit_edge, label %.lr.ph.preheader171

.lr.ph.preheader171:                              ; preds = %middle.block, %.lr.ph.preheader
  %indvars.iv.ph = phi i64 [ %8, %.lr.ph.preheader ], [ %ind.end, %middle.block ]
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader171, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ %indvars.iv.ph, %.lr.ph.preheader171 ]
  %18 = getelementptr inbounds [320 x i16], ptr %3, i64 0, i64 %indvars.iv
  store i16 -2, ptr %18, align 2, !tbaa !12
  %19 = getelementptr inbounds [320 x i16], ptr %2, i64 0, i64 %indvars.iv
  store i16 -2, ptr %19, align 2, !tbaa !12
  %indvars.iv.next = add nsw i64 %indvars.iv, 1
  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  %exitcond.not = icmp eq i32 %9, %lftr.wideiv
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph, !llvm.loop !18

._crit_edge:                                      ; preds = %.lr.ph, %middle.block, %1
  %20 = load ptr, ptr @ds_p, align 8, !tbaa !19
  %.089128 = getelementptr inbounds i8, ptr %20, i64 -64
  %.not101129 = icmp ult ptr %.089128, @drawsegs
  br i1 %.not101129, label %._crit_edge134, label %.lr.ph133

.lr.ph133:                                        ; preds = %._crit_edge
  %21 = getelementptr inbounds i8, ptr %0, i64 44
  %22 = getelementptr inbounds i8, ptr %0, i64 24
  %23 = getelementptr inbounds i8, ptr %0, i64 28
  %24 = getelementptr inbounds i8, ptr %0, i64 32
  %25 = getelementptr inbounds i8, ptr %0, i64 36
  br label %26

26:                                               ; preds = %.lr.ph133, %.loopexit
  %.089131 = phi ptr [ %.089128, %.lr.ph133 ], [ %.089, %.loopexit ]
  %.pn130 = phi ptr [ %20, %.lr.ph133 ], [ %.089131, %.loopexit ]
  %27 = getelementptr inbounds i8, ptr %.pn130, i64 -56
  %28 = load i32, ptr %27, align 8, !tbaa !20
  %29 = load i32, ptr %6, align 4, !tbaa !11
  %30 = icmp sgt i32 %28, %29
  br i1 %30, label %.loopexit, label %31

31:                                               ; preds = %26
  %32 = getelementptr inbounds i8, ptr %.pn130, i64 -52
  %33 = load i32, ptr %32, align 4, !tbaa !22
  %34 = load i32, ptr %4, align 8, !tbaa !5
  %35 = icmp slt i32 %33, %34
  br i1 %35, label %.loopexit, label %36

36:                                               ; preds = %31
  %37 = getelementptr inbounds i8, ptr %.pn130, i64 -36
  %38 = load i32, ptr %37, align 4, !tbaa !23
  %.not103 = icmp eq i32 %38, 0
  br i1 %.not103, label %39, label %42

39:                                               ; preds = %36
  %40 = getelementptr inbounds i8, ptr %.pn130, i64 -8
  %41 = load ptr, ptr %40, align 8, !tbaa !24
  %.not104 = icmp eq ptr %41, null
  br i1 %.not104, label %.loopexit, label %42

42:                                               ; preds = %39, %36
  %. = tail call i32 @llvm.smax.i32(i32 %28, i32 %34)
  %43 = tail call i32 @llvm.smin.i32(i32 %33, i32 %29)
  %44 = getelementptr inbounds i8, ptr %.pn130, i64 -48
  %45 = load i32, ptr %44, align 8, !tbaa !25
  %46 = getelementptr inbounds i8, ptr %.pn130, i64 -44
  %47 = load i32, ptr %46, align 4, !tbaa !26
  %.088 = tail call i32 @llvm.smax.i32(i32 %45, i32 %47)
  %48 = load i32, ptr %21, align 4, !tbaa !27
  %49 = icmp slt i32 %.088, %48
  br i1 %49, label %57, label %50

50:                                               ; preds = %42
  %.087 = tail call i32 @llvm.smin.i32(i32 %45, i32 %47)
  %51 = icmp slt i32 %.087, %48
  br i1 %51, label %52, label %61

52:                                               ; preds = %50
  %53 = load i32, ptr %22, align 8, !tbaa !28
  %54 = load i32, ptr %23, align 4, !tbaa !29
  %55 = load ptr, ptr %.089131, align 8, !tbaa !30
  %56 = tail call i32 @R_PointOnSegSide(i32 noundef %53, i32 noundef %54, ptr noundef %55) #4
  %.not105 = icmp eq i32 %56, 0
  br i1 %.not105, label %57, label %._crit_edge162

._crit_edge162:                                   ; preds = %52
  %.pre = load i32, ptr %37, align 4, !tbaa !23
  br label %61

57:                                               ; preds = %52, %42
  %58 = getelementptr inbounds i8, ptr %.pn130, i64 -8
  %59 = load ptr, ptr %58, align 8, !tbaa !24
  %.not111 = icmp eq ptr %59, null
  br i1 %.not111, label %.loopexit, label %60

60:                                               ; preds = %57
  tail call void @R_RenderMaskedSegRange(ptr noundef nonnull %.089131, i32 noundef %., i32 noundef %43) #4
  br label %.loopexit

61:                                               ; preds = %._crit_edge162, %50
  %62 = phi i32 [ %.pre, %._crit_edge162 ], [ %38, %50 ]
  %63 = load i32, ptr %24, align 8, !tbaa !31
  %64 = getelementptr inbounds i8, ptr %.pn130, i64 -32
  %65 = load i32, ptr %64, align 8, !tbaa !32
  %.not106 = icmp slt i32 %63, %65
  %66 = and i32 %62, -2
  %spec.select = select i1 %.not106, i32 %62, i32 %66
  %67 = load i32, ptr %25, align 4, !tbaa !33
  %68 = getelementptr inbounds i8, ptr %.pn130, i64 -28
  %69 = load i32, ptr %68, align 4, !tbaa !34
  %.not107 = icmp sgt i32 %67, %69
  %70 = and i32 %spec.select, -3
  %.1 = select i1 %.not107, i32 %spec.select, i32 %70
  switch i32 %.1, label %.loopexit [
    i32 1, label %.preheader
    i32 2, label %.preheader112
    i32 3, label %.preheader114
  ]

.preheader114:                                    ; preds = %61
  %.not108119 = icmp sgt i32 %., %43
  br i1 %.not108119, label %.loopexit, label %.lr.ph121

.lr.ph121:                                        ; preds = %.preheader114
  %71 = getelementptr inbounds i8, ptr %.pn130, i64 -16
  %72 = getelementptr inbounds i8, ptr %.pn130, i64 -24
  %73 = tail call i32 @llvm.smax.i32(i32 %28, i32 %34)
  %smax = sext i32 %73 to i64
  %74 = add i32 %43, 1
  %75 = add i32 %74, %73
  %76 = sub i32 %75, %.
  br label %137

.preheader112:                                    ; preds = %61
  %.not109122 = icmp sgt i32 %., %43
  br i1 %.not109122, label %.loopexit, label %.lr.ph124

.lr.ph124:                                        ; preds = %.preheader112
  %77 = getelementptr inbounds i8, ptr %.pn130, i64 -24
  %78 = tail call i32 @llvm.smax.i32(i32 %28, i32 %34)
  %smax147 = sext i32 %78 to i64
  %79 = add i32 %43, 1
  %80 = add i32 %79, %78
  %81 = sub i32 %80, %.
  %82 = sub i32 %79, %78
  %xtraiter = and i32 %82, 1
  %lcmp.mod.not = icmp eq i32 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.prol.loopexit, label %.prol.preheader

.prol.preheader:                                  ; preds = %.lr.ph124
  %83 = getelementptr inbounds [320 x i16], ptr %3, i64 0, i64 %smax147
  %84 = load i16, ptr %83, align 2, !tbaa !12
  %85 = icmp eq i16 %84, -2
  br i1 %85, label %86, label %.prol.loopexit.unr-lcssa

86:                                               ; preds = %.prol.preheader
  %87 = load ptr, ptr %77, align 8, !tbaa !35
  %88 = getelementptr inbounds i16, ptr %87, i64 %smax147
  %89 = load i16, ptr %88, align 2, !tbaa !12
  store i16 %89, ptr %83, align 2, !tbaa !12
  br label %.prol.loopexit.unr-lcssa

.prol.loopexit.unr-lcssa:                         ; preds = %86, %.prol.preheader
  %indvars.iv.next149.prol = add nsw i64 %smax147, 1
  br label %.prol.loopexit

.prol.loopexit:                                   ; preds = %.prol.loopexit.unr-lcssa, %.lr.ph124
  %indvars.iv148.unr = phi i64 [ %smax147, %.lr.ph124 ], [ %indvars.iv.next149.prol, %.prol.loopexit.unr-lcssa ]
  %90 = icmp eq i32 %43, %78
  br i1 %90, label %.loopexit, label %.lr.ph124.new

.preheader:                                       ; preds = %61
  %.not110125 = icmp sgt i32 %., %43
  br i1 %.not110125, label %.loopexit, label %.lr.ph127

.lr.ph127:                                        ; preds = %.preheader
  %91 = getelementptr inbounds i8, ptr %.pn130, i64 -16
  %92 = tail call i32 @llvm.smax.i32(i32 %28, i32 %34)
  %smax152 = sext i32 %92 to i64
  %93 = add i32 %43, 1
  %94 = add i32 %93, %92
  %95 = sub i32 %94, %.
  %96 = sub i32 %93, %92
  %xtraiter174 = and i32 %96, 1
  %lcmp.mod175.not = icmp eq i32 %xtraiter174, 0
  br i1 %lcmp.mod175.not, label %.prol.loopexit173, label %.prol.preheader172

.prol.preheader172:                               ; preds = %.lr.ph127
  %97 = getelementptr inbounds [320 x i16], ptr %2, i64 0, i64 %smax152
  %98 = load i16, ptr %97, align 2, !tbaa !12
  %99 = icmp eq i16 %98, -2
  br i1 %99, label %100, label %.prol.loopexit173.unr-lcssa

100:                                              ; preds = %.prol.preheader172
  %101 = load ptr, ptr %91, align 8, !tbaa !36
  %102 = getelementptr inbounds i16, ptr %101, i64 %smax152
  %103 = load i16, ptr %102, align 2, !tbaa !12
  store i16 %103, ptr %97, align 2, !tbaa !12
  br label %.prol.loopexit173.unr-lcssa

.prol.loopexit173.unr-lcssa:                      ; preds = %100, %.prol.preheader172
  %indvars.iv.next154.prol = add nsw i64 %smax152, 1
  br label %.prol.loopexit173

.prol.loopexit173:                                ; preds = %.prol.loopexit173.unr-lcssa, %.lr.ph127
  %indvars.iv153.unr = phi i64 [ %smax152, %.lr.ph127 ], [ %indvars.iv.next154.prol, %.prol.loopexit173.unr-lcssa ]
  %104 = icmp eq i32 %43, %92
  br i1 %104, label %.loopexit, label %.lr.ph127.new

.lr.ph127.new:                                    ; preds = %.prol.loopexit173, %120
  %indvars.iv153 = phi i64 [ %indvars.iv.next154.1, %120 ], [ %indvars.iv153.unr, %.prol.loopexit173 ]
  %105 = getelementptr inbounds [320 x i16], ptr %2, i64 0, i64 %indvars.iv153
  %106 = load i16, ptr %105, align 2, !tbaa !12
  %107 = icmp eq i16 %106, -2
  br i1 %107, label %108, label %112

108:                                              ; preds = %.lr.ph127.new
  %109 = load ptr, ptr %91, align 8, !tbaa !36
  %110 = getelementptr inbounds i16, ptr %109, i64 %indvars.iv153
  %111 = load i16, ptr %110, align 2, !tbaa !12
  store i16 %111, ptr %105, align 2, !tbaa !12
  br label %112

112:                                              ; preds = %.lr.ph127.new, %108
  %indvars.iv.next154 = add nsw i64 %indvars.iv153, 1
  %113 = getelementptr inbounds [320 x i16], ptr %2, i64 0, i64 %indvars.iv.next154
  %114 = load i16, ptr %113, align 2, !tbaa !12
  %115 = icmp eq i16 %114, -2
  br i1 %115, label %116, label %120

116:                                              ; preds = %112
  %117 = load ptr, ptr %91, align 8, !tbaa !36
  %118 = getelementptr inbounds i16, ptr %117, i64 %indvars.iv.next154
  %119 = load i16, ptr %118, align 2, !tbaa !12
  store i16 %119, ptr %113, align 2, !tbaa !12
  br label %120

120:                                              ; preds = %116, %112
  %indvars.iv.next154.1 = add nsw i64 %indvars.iv153, 2
  %lftr.wideiv155.1 = trunc i64 %indvars.iv.next154.1 to i32
  %exitcond156.not.1 = icmp eq i32 %95, %lftr.wideiv155.1
  br i1 %exitcond156.not.1, label %.loopexit, label %.lr.ph127.new, !llvm.loop !37

.lr.ph124.new:                                    ; preds = %.prol.loopexit, %136
  %indvars.iv148 = phi i64 [ %indvars.iv.next149.1, %136 ], [ %indvars.iv148.unr, %.prol.loopexit ]
  %121 = getelementptr inbounds [320 x i16], ptr %3, i64 0, i64 %indvars.iv148
  %122 = load i16, ptr %121, align 2, !tbaa !12
  %123 = icmp eq i16 %122, -2
  br i1 %123, label %124, label %128

124:                                              ; preds = %.lr.ph124.new
  %125 = load ptr, ptr %77, align 8, !tbaa !35
  %126 = getelementptr inbounds i16, ptr %125, i64 %indvars.iv148
  %127 = load i16, ptr %126, align 2, !tbaa !12
  store i16 %127, ptr %121, align 2, !tbaa !12
  br label %128

128:                                              ; preds = %.lr.ph124.new, %124
  %indvars.iv.next149 = add nsw i64 %indvars.iv148, 1
  %129 = getelementptr inbounds [320 x i16], ptr %3, i64 0, i64 %indvars.iv.next149
  %130 = load i16, ptr %129, align 2, !tbaa !12
  %131 = icmp eq i16 %130, -2
  br i1 %131, label %132, label %136

132:                                              ; preds = %128
  %133 = load ptr, ptr %77, align 8, !tbaa !35
  %134 = getelementptr inbounds i16, ptr %133, i64 %indvars.iv.next149
  %135 = load i16, ptr %134, align 2, !tbaa !12
  store i16 %135, ptr %129, align 2, !tbaa !12
  br label %136

136:                                              ; preds = %132, %128
  %indvars.iv.next149.1 = add nsw i64 %indvars.iv148, 2
  %lftr.wideiv150.1 = trunc i64 %indvars.iv.next149.1 to i32
  %exitcond151.not.1 = icmp eq i32 %81, %lftr.wideiv150.1
  br i1 %exitcond151.not.1, label %.loopexit, label %.lr.ph124.new, !llvm.loop !38

137:                                              ; preds = %.lr.ph121, %153
  %indvars.iv143 = phi i64 [ %smax, %.lr.ph121 ], [ %indvars.iv.next144, %153 ]
  %138 = getelementptr inbounds [320 x i16], ptr %2, i64 0, i64 %indvars.iv143
  %139 = load i16, ptr %138, align 2, !tbaa !12
  %140 = icmp eq i16 %139, -2
  br i1 %140, label %141, label %145

141:                                              ; preds = %137
  %142 = load ptr, ptr %71, align 8, !tbaa !36
  %143 = getelementptr inbounds i16, ptr %142, i64 %indvars.iv143
  %144 = load i16, ptr %143, align 2, !tbaa !12
  store i16 %144, ptr %138, align 2, !tbaa !12
  br label %145

145:                                              ; preds = %141, %137
  %146 = getelementptr inbounds [320 x i16], ptr %3, i64 0, i64 %indvars.iv143
  %147 = load i16, ptr %146, align 2, !tbaa !12
  %148 = icmp eq i16 %147, -2
  br i1 %148, label %149, label %153

149:                                              ; preds = %145
  %150 = load ptr, ptr %72, align 8, !tbaa !35
  %151 = getelementptr inbounds i16, ptr %150, i64 %indvars.iv143
  %152 = load i16, ptr %151, align 2, !tbaa !12
  store i16 %152, ptr %146, align 2, !tbaa !12
  br label %153

153:                                              ; preds = %145, %149
  %indvars.iv.next144 = add nsw i64 %indvars.iv143, 1
  %lftr.wideiv145 = trunc i64 %indvars.iv.next144 to i32
  %exitcond146.not = icmp eq i32 %76, %lftr.wideiv145
  br i1 %exitcond146.not, label %.loopexit, label %137, !llvm.loop !39

.loopexit:                                        ; preds = %153, %.prol.loopexit, %136, %.prol.loopexit173, %120, %.preheader114, %.preheader112, %.preheader, %61, %57, %60, %26, %31, %39
  %.089 = getelementptr inbounds i8, ptr %.089131, i64 -64
  %.not101 = icmp ult ptr %.089, @drawsegs
  br i1 %.not101, label %._crit_edge134.loopexit, label %26, !llvm.loop !40

._crit_edge134.loopexit:                          ; preds = %.loopexit
  %.pre163 = load i32, ptr %4, align 8, !tbaa !5
  %.pre164 = load i32, ptr %6, align 4, !tbaa !11
  br label %._crit_edge134

._crit_edge134:                                   ; preds = %._crit_edge134.loopexit, %._crit_edge
  %154 = phi i32 [ %.pre164, %._crit_edge134.loopexit ], [ %7, %._crit_edge ]
  %155 = phi i32 [ %.pre163, %._crit_edge134.loopexit ], [ %5, %._crit_edge ]
  %.not102135 = icmp sgt i32 %155, %154
  br i1 %.not102135, label %._crit_edge139, label %.lr.ph138

.lr.ph138:                                        ; preds = %._crit_edge134
  %156 = load i32, ptr @viewheight, align 4
  %157 = trunc i32 %156 to i16
  %158 = sext i32 %155 to i64
  %159 = add i32 %154, 1
  %160 = sub i32 %159, %155
  %xtraiter178 = and i32 %160, 1
  %lcmp.mod179.not = icmp eq i32 %xtraiter178, 0
  br i1 %lcmp.mod179.not, label %.prol.loopexit177, label %.prol.preheader176

.prol.preheader176:                               ; preds = %.lr.ph138
  %161 = getelementptr inbounds [320 x i16], ptr %2, i64 0, i64 %158
  %162 = load i16, ptr %161, align 2, !tbaa !12
  %163 = icmp eq i16 %162, -2
  br i1 %163, label %164, label %165

164:                                              ; preds = %.prol.preheader176
  store i16 %157, ptr %161, align 2, !tbaa !12
  br label %165

165:                                              ; preds = %164, %.prol.preheader176
  %166 = getelementptr inbounds [320 x i16], ptr %3, i64 0, i64 %158
  %167 = load i16, ptr %166, align 2, !tbaa !12
  %168 = icmp eq i16 %167, -2
  br i1 %168, label %169, label %.prol.loopexit177.unr-lcssa

169:                                              ; preds = %165
  store i16 -1, ptr %166, align 2, !tbaa !12
  br label %.prol.loopexit177.unr-lcssa

.prol.loopexit177.unr-lcssa:                      ; preds = %169, %165
  %indvars.iv.next158.prol = add nsw i64 %158, 1
  br label %.prol.loopexit177

.prol.loopexit177:                                ; preds = %.prol.loopexit177.unr-lcssa, %.lr.ph138
  %indvars.iv157.unr = phi i64 [ %158, %.lr.ph138 ], [ %indvars.iv.next158.prol, %.prol.loopexit177.unr-lcssa ]
  %170 = icmp eq i32 %154, %155
  br i1 %170, label %._crit_edge139, label %.lr.ph138.new

.lr.ph138.new:                                    ; preds = %.prol.loopexit177, %190
  %indvars.iv157 = phi i64 [ %indvars.iv.next158.1, %190 ], [ %indvars.iv157.unr, %.prol.loopexit177 ]
  %171 = getelementptr inbounds [320 x i16], ptr %2, i64 0, i64 %indvars.iv157
  %172 = load i16, ptr %171, align 2, !tbaa !12
  %173 = icmp eq i16 %172, -2
  br i1 %173, label %174, label %175

174:                                              ; preds = %.lr.ph138.new
  store i16 %157, ptr %171, align 2, !tbaa !12
  br label %175

175:                                              ; preds = %174, %.lr.ph138.new
  %176 = getelementptr inbounds [320 x i16], ptr %3, i64 0, i64 %indvars.iv157
  %177 = load i16, ptr %176, align 2, !tbaa !12
  %178 = icmp eq i16 %177, -2
  br i1 %178, label %179, label %180

179:                                              ; preds = %175
  store i16 -1, ptr %176, align 2, !tbaa !12
  br label %180

180:                                              ; preds = %175, %179
  %indvars.iv.next158 = add nsw i64 %indvars.iv157, 1
  %181 = getelementptr inbounds [320 x i16], ptr %2, i64 0, i64 %indvars.iv.next158
  %182 = load i16, ptr %181, align 2, !tbaa !12
  %183 = icmp eq i16 %182, -2
  br i1 %183, label %184, label %185

184:                                              ; preds = %180
  store i16 %157, ptr %181, align 2, !tbaa !12
  br label %185

185:                                              ; preds = %184, %180
  %186 = getelementptr inbounds [320 x i16], ptr %3, i64 0, i64 %indvars.iv.next158
  %187 = load i16, ptr %186, align 2, !tbaa !12
  %188 = icmp eq i16 %187, -2
  br i1 %188, label %189, label %190

189:                                              ; preds = %185
  store i16 -1, ptr %186, align 2, !tbaa !12
  br label %190

190:                                              ; preds = %189, %185
  %indvars.iv.next158.1 = add nsw i64 %indvars.iv157, 2
  %lftr.wideiv160.1 = trunc i64 %indvars.iv.next158.1 to i32
  %exitcond161.not.1 = icmp eq i32 %159, %lftr.wideiv160.1
  br i1 %exitcond161.not.1, label %._crit_edge139, label %.lr.ph138.new, !llvm.loop !41

._crit_edge139:                                   ; preds = %.prol.loopexit177, %190, %._crit_edge134
  store ptr %2, ptr @mfloorclip, align 8, !tbaa !19
  store ptr %3, ptr @mceilingclip, align 8, !tbaa !19
  call void @R_DrawVisSprite(ptr noundef nonnull %0, i32 noundef %155, i32 noundef %154)
  call void @llvm.lifetime.end.p0(i64 640, ptr nonnull %3) #4
  call void @llvm.lifetime.end.p0(i64 640, ptr nonnull %2) #4
  ret void
}

declare i32 @R_PointOnSegSide(i32 noundef, i32 noundef, ptr noundef) local_unnamed_addr #2

declare void @R_RenderMaskedSegRange(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smax.i32(i32, i32) #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smin.i32(i32, i32) #3

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !10, i64 16}
!6 = !{!"vissprite_s", !7, i64 0, !7, i64 8, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !10, i64 48, !10, i64 52, !10, i64 56, !7, i64 64, !10, i64 72}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!6, !10, i64 20}
!12 = !{!13, !13, i64 0}
!13 = !{!"short", !8, i64 0}
!14 = distinct !{!14, !15, !16, !17}
!15 = !{!"llvm.loop.mustprogress"}
!16 = !{!"llvm.loop.isvectorized", i32 1}
!17 = !{!"llvm.loop.unroll.runtime.disable"}
!18 = distinct !{!18, !15, !17, !16}
!19 = !{!7, !7, i64 0}
!20 = !{!21, !10, i64 8}
!21 = !{!"drawseg_s", !7, i64 0, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !7, i64 40, !7, i64 48, !7, i64 56}
!22 = !{!21, !10, i64 12}
!23 = !{!21, !10, i64 28}
!24 = !{!21, !7, i64 56}
!25 = !{!21, !10, i64 16}
!26 = !{!21, !10, i64 20}
!27 = !{!6, !10, i64 44}
!28 = !{!6, !10, i64 24}
!29 = !{!6, !10, i64 28}
!30 = !{!21, !7, i64 0}
!31 = !{!6, !10, i64 32}
!32 = !{!21, !10, i64 32}
!33 = !{!6, !10, i64 36}
!34 = !{!21, !10, i64 36}
!35 = !{!21, !7, i64 40}
!36 = !{!21, !7, i64 48}
!37 = distinct !{!37, !15}
!38 = distinct !{!38, !15}
!39 = distinct !{!39, !15}
!40 = distinct !{!40, !15}
!41 = distinct !{!41, !15}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LCSSAPass,LICMPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass