; LLVM IR from BrunoLevy/learn-fpga :: FemtoRV/FIRMWARE/LIBFEMTOGL (femtoGLline)

; 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"

@GL_width = external global i16, align 2
@GL_height = external global i16, align 2

; Function Attrs: nounwind uwtable
define dso_local void @GL_line(i32 noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3, i16 noundef zeroext %4) #0 {
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i16, align 2
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  store i32 %0, ptr %6, align 4, !tbaa !5
  store i32 %1, ptr %7, align 4, !tbaa !5
  store i32 %2, ptr %8, align 4, !tbaa !5
  store i32 %3, ptr %9, align 4, !tbaa !5
  store i16 %4, ptr %10, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #3
  %25 = load i32, ptr %6, align 4, !tbaa !5
  %26 = icmp slt i32 %25, 0
  %27 = zext i1 %26 to i32
  %28 = load i32, ptr %6, align 4, !tbaa !5
  %29 = load i16, ptr @GL_width, align 2, !tbaa !9
  %30 = zext i16 %29 to i32
  %31 = sub nsw i32 %30, 1
  %32 = icmp sgt i32 %28, %31
  %33 = zext i1 %32 to i32
  %34 = shl i32 %33, 1
  %35 = or i32 %27, %34
  %36 = load i32, ptr %7, align 4, !tbaa !5
  %37 = icmp slt i32 %36, 0
  %38 = zext i1 %37 to i32
  %39 = shl i32 %38, 2
  %40 = or i32 %35, %39
  %41 = load i32, ptr %7, align 4, !tbaa !5
  %42 = load i16, ptr @GL_height, align 2, !tbaa !9
  %43 = zext i16 %42 to i32
  %44 = sub nsw i32 %43, 1
  %45 = icmp sgt i32 %41, %44
  %46 = zext i1 %45 to i32
  %47 = shl i32 %46, 3
  %48 = or i32 %40, %47
  store i32 %48, ptr %11, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #3
  %49 = load i32, ptr %8, align 4, !tbaa !5
  %50 = icmp slt i32 %49, 0
  %51 = zext i1 %50 to i32
  %52 = load i32, ptr %8, align 4, !tbaa !5
  %53 = load i16, ptr @GL_width, align 2, !tbaa !9
  %54 = zext i16 %53 to i32
  %55 = sub nsw i32 %54, 1
  %56 = icmp sgt i32 %52, %55
  %57 = zext i1 %56 to i32
  %58 = shl i32 %57, 1
  %59 = or i32 %51, %58
  %60 = load i32, ptr %9, align 4, !tbaa !5
  %61 = icmp slt i32 %60, 0
  %62 = zext i1 %61 to i32
  %63 = shl i32 %62, 2
  %64 = or i32 %59, %63
  %65 = load i32, ptr %9, align 4, !tbaa !5
  %66 = load i16, ptr @GL_height, align 2, !tbaa !9
  %67 = zext i16 %66 to i32
  %68 = sub nsw i32 %67, 1
  %69 = icmp sgt i32 %65, %68
  %70 = zext i1 %69 to i32
  %71 = shl i32 %70, 3
  %72 = or i32 %64, %71
  store i32 %72, ptr %12, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #3
  br label %73

73:                                               ; preds = %235, %5
  %74 = load i32, ptr %11, align 4, !tbaa !5
  %75 = icmp eq i32 %74, 0
  br i1 %75, label %76, label %80

76:                                               ; preds = %73
  %77 = load i32, ptr %12, align 4, !tbaa !5
  %78 = icmp eq i32 %77, 0
  br i1 %78, label %79, label %80

79:                                               ; preds = %76
  br label %236

80:                                               ; preds = %76, %73
  %81 = load i32, ptr %11, align 4, !tbaa !5
  %82 = load i32, ptr %12, align 4, !tbaa !5
  %83 = and i32 %81, %82
  %84 = icmp ne i32 %83, 0
  br i1 %84, label %85, label %86

85:                                               ; preds = %80
  store i32 1, ptr %20, align 4
  br label %341

86:                                               ; preds = %80
  %87 = load i32, ptr %11, align 4, !tbaa !5
  %88 = icmp ne i32 %87, 0
  br i1 %88, label %89, label %91

89:                                               ; preds = %86
  %90 = load i32, ptr %11, align 4, !tbaa !5
  br label %93

91:                                               ; preds = %86
  %92 = load i32, ptr %12, align 4, !tbaa !5
  br label %93

93:                                               ; preds = %91, %89
  %94 = phi i32 [ %90, %89 ], [ %92, %91 ]
  store i32 %94, ptr %13, align 4, !tbaa !5
  %95 = load i32, ptr %13, align 4, !tbaa !5
  %96 = and i32 %95, 8
  %97 = icmp ne i32 %96, 0
  br i1 %97, label %98, label %117

98:                                               ; preds = %93
  %99 = load i32, ptr %6, align 4, !tbaa !5
  %100 = load i32, ptr %8, align 4, !tbaa !5
  %101 = load i32, ptr %6, align 4, !tbaa !5
  %102 = sub nsw i32 %100, %101
  %103 = load i16, ptr @GL_height, align 2, !tbaa !9
  %104 = zext i16 %103 to i32
  %105 = sub nsw i32 %104, 1
  %106 = load i32, ptr %7, align 4, !tbaa !5
  %107 = sub nsw i32 %105, %106
  %108 = mul nsw i32 %102, %107
  %109 = load i32, ptr %9, align 4, !tbaa !5
  %110 = load i32, ptr %7, align 4, !tbaa !5
  %111 = sub nsw i32 %109, %110
  %112 = sdiv i32 %108, %111
  %113 = add nsw i32 %99, %112
  store i32 %113, ptr %14, align 4, !tbaa !5
  %114 = load i16, ptr @GL_height, align 2, !tbaa !9
  %115 = zext i16 %114 to i32
  %116 = sub nsw i32 %115, 1
  store i32 %116, ptr %15, align 4, !tbaa !5
  br label %177

117:                                              ; preds = %93
  %118 = load i32, ptr %13, align 4, !tbaa !5
  %119 = and i32 %118, 4
  %120 = icmp ne i32 %119, 0
  br i1 %120, label %121, label %134

121:                                              ; preds = %117
  %122 = load i32, ptr %6, align 4, !tbaa !5
  %123 = load i32, ptr %8, align 4, !tbaa !5
  %124 = load i32, ptr %6, align 4, !tbaa !5
  %125 = sub nsw i32 %123, %124
  %126 = load i32, ptr %7, align 4, !tbaa !5
  %127 = sub nsw i32 0, %126
  %128 = mul nsw i32 %125, %127
  %129 = load i32, ptr %9, align 4, !tbaa !5
  %130 = load i32, ptr %7, align 4, !tbaa !5
  %131 = sub nsw i32 %129, %130
  %132 = sdiv i32 %128, %131
  %133 = add nsw i32 %122, %132
  store i32 %133, ptr %14, align 4, !tbaa !5
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %176

134:                                              ; preds = %117
  %135 = load i32, ptr %13, align 4, !tbaa !5
  %136 = and i32 %135, 2
  %137 = icmp ne i32 %136, 0
  br i1 %137, label %138, label %157

138:                                              ; preds = %134
  %139 = load i32, ptr %7, align 4, !tbaa !5
  %140 = load i32, ptr %9, align 4, !tbaa !5
  %141 = load i32, ptr %7, align 4, !tbaa !5
  %142 = sub nsw i32 %140, %141
  %143 = load i16, ptr @GL_width, align 2, !tbaa !9
  %144 = zext i16 %143 to i32
  %145 = sub nsw i32 %144, 1
  %146 = load i32, ptr %6, align 4, !tbaa !5
  %147 = sub nsw i32 %145, %146
  %148 = mul nsw i32 %142, %147
  %149 = load i32, ptr %8, align 4, !tbaa !5
  %150 = load i32, ptr %6, align 4, !tbaa !5
  %151 = sub nsw i32 %149, %150
  %152 = sdiv i32 %148, %151
  %153 = add nsw i32 %139, %152
  store i32 %153, ptr %15, align 4, !tbaa !5
  %154 = load i16, ptr @GL_width, align 2, !tbaa !9
  %155 = zext i16 %154 to i32
  %156 = sub nsw i32 %155, 1
  store i32 %156, ptr %14, align 4, !tbaa !5
  br label %175

157:                                              ; preds = %134
  %158 = load i32, ptr %13, align 4, !tbaa !5
  %159 = and i32 %158, 1
  %160 = icmp ne i32 %159, 0
  br i1 %160, label %161, label %174

161:                                              ; preds = %157
  %162 = load i32, ptr %7, align 4, !tbaa !5
  %163 = load i32, ptr %9, align 4, !tbaa !5
  %164 = load i32, ptr %7, align 4, !tbaa !5
  %165 = sub nsw i32 %163, %164
  %166 = load i32, ptr %6, align 4, !tbaa !5
  %167 = sub nsw i32 0, %166
  %168 = mul nsw i32 %165, %167
  %169 = load i32, ptr %8, align 4, !tbaa !5
  %170 = load i32, ptr %6, align 4, !tbaa !5
  %171 = sub nsw i32 %169, %170
  %172 = sdiv i32 %168, %171
  %173 = add nsw i32 %162, %172
  store i32 %173, ptr %15, align 4, !tbaa !5
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %174

174:                                              ; preds = %161, %157
  br label %175

175:                                              ; preds = %174, %138
  br label %176

176:                                              ; preds = %175, %121
  br label %177

177:                                              ; preds = %176, %98
  %178 = load i32, ptr %13, align 4, !tbaa !5
  %179 = load i32, ptr %11, align 4, !tbaa !5
  %180 = icmp eq i32 %178, %179
  br i1 %180, label %181, label %208

181:                                              ; preds = %177
  %182 = load i32, ptr %14, align 4, !tbaa !5
  store i32 %182, ptr %6, align 4, !tbaa !5
  %183 = load i32, ptr %15, align 4, !tbaa !5
  store i32 %183, ptr %7, align 4, !tbaa !5
  %184 = load i32, ptr %6, align 4, !tbaa !5
  %185 = icmp slt i32 %184, 0
  %186 = zext i1 %185 to i32
  %187 = load i32, ptr %6, align 4, !tbaa !5
  %188 = load i16, ptr @GL_width, align 2, !tbaa !9
  %189 = zext i16 %188 to i32
  %190 = sub nsw i32 %189, 1
  %191 = icmp sgt i32 %187, %190
  %192 = zext i1 %191 to i32
  %193 = shl i32 %192, 1
  %194 = or i32 %186, %193
  %195 = load i32, ptr %7, align 4, !tbaa !5
  %196 = icmp slt i32 %195, 0
  %197 = zext i1 %196 to i32
  %198 = shl i32 %197, 2
  %199 = or i32 %194, %198
  %200 = load i32, ptr %7, align 4, !tbaa !5
  %201 = load i16, ptr @GL_height, align 2, !tbaa !9
  %202 = zext i16 %201 to i32
  %203 = sub nsw i32 %202, 1
  %204 = icmp sgt i32 %200, %203
  %205 = zext i1 %204 to i32
  %206 = shl i32 %205, 3
  %207 = or i32 %199, %206
  store i32 %207, ptr %11, align 4, !tbaa !5
  br label %235

208:                                              ; preds = %177
  %209 = load i32, ptr %14, align 4, !tbaa !5
  store i32 %209, ptr %8, align 4, !tbaa !5
  %210 = load i32, ptr %15, align 4, !tbaa !5
  store i32 %210, ptr %9, align 4, !tbaa !5
  %211 = load i32, ptr %8, align 4, !tbaa !5
  %212 = icmp slt i32 %211, 0
  %213 = zext i1 %212 to i32
  %214 = load i32, ptr %8, align 4, !tbaa !5
  %215 = load i16, ptr @GL_width, align 2, !tbaa !9
  %216 = zext i16 %215 to i32
  %217 = sub nsw i32 %216, 1
  %218 = icmp sgt i32 %214, %217
  %219 = zext i1 %218 to i32
  %220 = shl i32 %219, 1
  %221 = or i32 %213, %220
  %222 = load i32, ptr %9, align 4, !tbaa !5
  %223 = icmp slt i32 %222, 0
  %224 = zext i1 %223 to i32
  %225 = shl i32 %224, 2
  %226 = or i32 %221, %225
  %227 = load i32, ptr %9, align 4, !tbaa !5
  %228 = load i16, ptr @GL_height, align 2, !tbaa !9
  %229 = zext i16 %228 to i32
  %230 = sub nsw i32 %229, 1
  %231 = icmp sgt i32 %227, %230
  %232 = zext i1 %231 to i32
  %233 = shl i32 %232, 3
  %234 = or i32 %226, %233
  store i32 %234, ptr %12, align 4, !tbaa !5
  br label %235

235:                                              ; preds = %208, %181
  br label %73

236:                                              ; preds = %79
  %237 = load i32, ptr %9, align 4, !tbaa !5
  %238 = load i32, ptr %7, align 4, !tbaa !5
  %239 = sub nsw i32 %237, %238
  store i32 %239, ptr %17, align 4, !tbaa !5
  store i32 1, ptr %19, align 4, !tbaa !5
  %240 = load i32, ptr %17, align 4, !tbaa !5
  %241 = icmp slt i32 %240, 0
  br i1 %241, label %242, label %245

242:                                              ; preds = %236
  store i32 -1, ptr %19, align 4, !tbaa !5
  %243 = load i32, ptr %17, align 4, !tbaa !5
  %244 = sub nsw i32 0, %243
  store i32 %244, ptr %17, align 4, !tbaa !5
  br label %245

245:                                              ; preds = %242, %236
  %246 = load i32, ptr %8, align 4, !tbaa !5
  %247 = load i32, ptr %6, align 4, !tbaa !5
  %248 = sub nsw i32 %246, %247
  store i32 %248, ptr %16, align 4, !tbaa !5
  store i32 1, ptr %18, align 4, !tbaa !5
  %249 = load i32, ptr %16, align 4, !tbaa !5
  %250 = icmp slt i32 %249, 0
  br i1 %250, label %251, label %254

251:                                              ; preds = %245
  store i32 -1, ptr %18, align 4, !tbaa !5
  %252 = load i32, ptr %16, align 4, !tbaa !5
  %253 = sub nsw i32 0, %252
  store i32 %253, ptr %16, align 4, !tbaa !5
  br label %254

254:                                              ; preds = %251, %245
  %255 = load i32, ptr %6, align 4, !tbaa !5
  store i32 %255, ptr %14, align 4, !tbaa !5
  %256 = load i32, ptr %7, align 4, !tbaa !5
  store i32 %256, ptr %15, align 4, !tbaa !5
  %257 = load i32, ptr %17, align 4, !tbaa !5
  %258 = load i32, ptr %16, align 4, !tbaa !5
  %259 = icmp sgt i32 %257, %258
  br i1 %259, label %260, label %300

260:                                              ; preds = %254
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #3
  %261 = load i32, ptr %16, align 4, !tbaa !5
  %262 = shl i32 %261, 1
  %263 = load i32, ptr %17, align 4, !tbaa !5
  %264 = sub nsw i32 %262, %263
  store i32 %264, ptr %21, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #3
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %265

265:                                              ; preds = %296, %260
  %266 = load i32, ptr %22, align 4, !tbaa !5
  %267 = load i32, ptr %17, align 4, !tbaa !5
  %268 = icmp slt i32 %266, %267
  br i1 %268, label %270, label %269

269:                                              ; preds = %265
  store i32 4, ptr %20, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #3
  br label %299

270:                                              ; preds = %265
  %271 = load i32, ptr %14, align 4, !tbaa !5
  %272 = load i32, ptr %15, align 4, !tbaa !5
  %273 = load i16, ptr %10, align 2, !tbaa !9
  call void @GL_setpixel(i32 noundef %271, i32 noundef %272, i16 noundef zeroext %273)
  %274 = load i32, ptr %19, align 4, !tbaa !5
  %275 = load i32, ptr %15, align 4, !tbaa !5
  %276 = add nsw i32 %275, %274
  store i32 %276, ptr %15, align 4, !tbaa !5
  br label %277

277:                                              ; preds = %280, %270
  %278 = load i32, ptr %21, align 4, !tbaa !5
  %279 = icmp sge i32 %278, 0
  br i1 %279, label %280, label %291

280:                                              ; preds = %277
  %281 = load i32, ptr %14, align 4, !tbaa !5
  %282 = load i32, ptr %15, align 4, !tbaa !5
  %283 = load i16, ptr %10, align 2, !tbaa !9
  call void @GL_setpixel(i32 noundef %281, i32 noundef %282, i16 noundef zeroext %283)
  %284 = load i32, ptr %18, align 4, !tbaa !5
  %285 = load i32, ptr %14, align 4, !tbaa !5
  %286 = add nsw i32 %285, %284
  store i32 %286, ptr %14, align 4, !tbaa !5
  %287 = load i32, ptr %17, align 4, !tbaa !5
  %288 = shl i32 %287, 1
  %289 = load i32, ptr %21, align 4, !tbaa !5
  %290 = sub nsw i32 %289, %288
  store i32 %290, ptr %21, align 4, !tbaa !5
  br label %277, !llvm.loop !11

291:                                              ; preds = %277
  %292 = load i32, ptr %16, align 4, !tbaa !5
  %293 = shl i32 %292, 1
  %294 = load i32, ptr %21, align 4, !tbaa !5
  %295 = add nsw i32 %294, %293
  store i32 %295, ptr %21, align 4, !tbaa !5
  br label %296

296:                                              ; preds = %291
  %297 = load i32, ptr %22, align 4, !tbaa !5
  %298 = add nsw i32 %297, 1
  store i32 %298, ptr %22, align 4, !tbaa !5
  br label %265, !llvm.loop !13

299:                                              ; preds = %269
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #3
  br label %340

300:                                              ; preds = %254
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #3
  %301 = load i32, ptr %17, align 4, !tbaa !5
  %302 = shl i32 %301, 1
  %303 = load i32, ptr %16, align 4, !tbaa !5
  %304 = sub nsw i32 %302, %303
  store i32 %304, ptr %23, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #3
  store i32 0, ptr %24, align 4, !tbaa !5
  br label %305

305:                                              ; preds = %336, %300
  %306 = load i32, ptr %24, align 4, !tbaa !5
  %307 = load i32, ptr %16, align 4, !tbaa !5
  %308 = icmp slt i32 %306, %307
  br i1 %308, label %310, label %309

309:                                              ; preds = %305
  store i32 9, ptr %20, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #3
  br label %339

310:                                              ; preds = %305
  %311 = load i32, ptr %14, align 4, !tbaa !5
  %312 = load i32, ptr %15, align 4, !tbaa !5
  %313 = load i16, ptr %10, align 2, !tbaa !9
  call void @GL_setpixel(i32 noundef %311, i32 noundef %312, i16 noundef zeroext %313)
  %314 = load i32, ptr %18, align 4, !tbaa !5
  %315 = load i32, ptr %14, align 4, !tbaa !5
  %316 = add nsw i32 %315, %314
  store i32 %316, ptr %14, align 4, !tbaa !5
  br label %317

317:                                              ; preds = %320, %310
  %318 = load i32, ptr %23, align 4, !tbaa !5
  %319 = icmp sge i32 %318, 0
  br i1 %319, label %320, label %331

320:                                              ; preds = %317
  %321 = load i32, ptr %14, align 4, !tbaa !5
  %322 = load i32, ptr %15, align 4, !tbaa !5
  %323 = load i16, ptr %10, align 2, !tbaa !9
  call void @GL_setpixel(i32 noundef %321, i32 noundef %322, i16 noundef zeroext %323)
  %324 = load i32, ptr %19, align 4, !tbaa !5
  %325 = load i32, ptr %15, align 4, !tbaa !5
  %326 = add nsw i32 %325, %324
  store i32 %326, ptr %15, align 4, !tbaa !5
  %327 = load i32, ptr %16, align 4, !tbaa !5
  %328 = shl i32 %327, 1
  %329 = load i32, ptr %23, align 4, !tbaa !5
  %330 = sub nsw i32 %329, %328
  store i32 %330, ptr %23, align 4, !tbaa !5
  br label %317, !llvm.loop !14

331:                                              ; preds = %317
  %332 = load i32, ptr %17, align 4, !tbaa !5
  %333 = shl i32 %332, 1
  %334 = load i32, ptr %23, align 4, !tbaa !5
  %335 = add nsw i32 %334, %333
  store i32 %335, ptr %23, align 4, !tbaa !5
  br label %336

336:                                              ; preds = %331
  %337 = load i32, ptr %24, align 4, !tbaa !5
  %338 = add nsw i32 %337, 1
  store i32 %338, ptr %24, align 4, !tbaa !5
  br label %305, !llvm.loop !15

339:                                              ; preds = %309
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #3
  br label %340

340:                                              ; preds = %339, %299
  store i32 0, ptr %20, align 4
  br label %341

341:                                              ; preds = %340, %85
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #3
  %342 = load i32, ptr %20, align 4
  switch i32 %342, label %344 [
    i32 0, label %343
    i32 1, label %343
  ]

343:                                              ; preds = %341, %341
  ret void

344:                                              ; preds = %341
  unreachable
}

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

declare void @GL_setpixel(i32 noundef, i32 noundef, i16 noundef zeroext) #2

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

attributes #0 = { 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 #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"short", !7, i64 0}
!11 = distinct !{!11, !12}
!12 = !{!"llvm.loop.mustprogress"}
!13 = distinct !{!13, !12}
!14 = distinct !{!14, !12}
!15 = distinct !{!15, !12}


; 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"

@GL_width = external local_unnamed_addr global i16, align 2
@GL_height = external local_unnamed_addr global i16, align 2

; Function Attrs: nounwind uwtable
define dso_local void @GL_line(i32 noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3, i16 noundef zeroext %4) local_unnamed_addr #0 {
  %.lobit = lshr i32 %0, 31
  %6 = load i16, ptr @GL_width, align 2, !tbaa !5
  %7 = zext i16 %6 to i32
  %.not = icmp sgt i32 %7, %0
  %8 = select i1 %.not, i32 0, i32 2
  %9 = lshr i32 %1, 29
  %10 = and i32 %9, 4
  %11 = load i16, ptr @GL_height, align 2, !tbaa !5
  %12 = zext i16 %11 to i32
  %.not142 = icmp sgt i32 %12, %1
  %13 = select i1 %.not142, i32 0, i32 8
  %14 = or disjoint i32 %10, %.lobit
  %15 = or disjoint i32 %14, %8
  %16 = or disjoint i32 %15, %13
  %.lobit143 = lshr i32 %2, 31
  %.not144 = icmp sgt i32 %7, %2
  %17 = select i1 %.not144, i32 0, i32 2
  %18 = lshr i32 %3, 29
  %19 = and i32 %18, 4
  %.not146 = icmp sgt i32 %12, %3
  %20 = select i1 %.not146, i32 0, i32 8
  %21 = or disjoint i32 %19, %.lobit143
  %22 = or disjoint i32 %21, %17
  %23 = or disjoint i32 %22, %20
  %24 = icmp eq i32 %16, 0
  %25 = icmp eq i32 %23, 0
  %or.cond169 = select i1 %24, i1 %25, i1 false
  br i1 %or.cond169, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %5
  %26 = add nsw i32 %12, -1
  %27 = add nsw i32 %7, -1
  br label %28

28:                                               ; preds = %.lr.ph, %62
  %29 = phi i1 [ %24, %.lr.ph ], [ %71, %62 ]
  %.0118177 = phi i32 [ undef, %.lr.ph ], [ %.1119, %62 ]
  %.0120176 = phi i32 [ undef, %.lr.ph ], [ %.1121, %62 ]
  %.0125175 = phi i32 [ %0, %.lr.ph ], [ %.1121..0125175, %62 ]
  %.0127174 = phi i32 [ %23, %.lr.ph ], [ %.0127174., %62 ]
  %.0129173 = phi i32 [ %16, %.lr.ph ], [ %..0129173, %62 ]
  %.0131172 = phi i32 [ %1, %.lr.ph ], [ %.1119..0131172, %62 ]
  %.0133171 = phi i32 [ %3, %.lr.ph ], [ %.0133171..1119, %62 ]
  %.0135170 = phi i32 [ %2, %.lr.ph ], [ %.0135170..1121, %62 ]
  %30 = and i32 %.0127174, %.0129173
  %.not147 = icmp eq i32 %30, 0
  br i1 %.not147, label %31, label %.loopexit

31:                                               ; preds = %28
  %32 = select i1 %29, i32 %.0127174, i32 %.0129173
  %33 = and i32 %32, 8
  %.not149 = icmp eq i32 %33, 0
  br i1 %.not149, label %41, label %34

34:                                               ; preds = %31
  %35 = sub nsw i32 %.0135170, %.0125175
  %36 = sub nsw i32 %26, %.0131172
  %37 = mul nsw i32 %35, %36
  %38 = sub nsw i32 %.0133171, %.0131172
  %39 = sdiv i32 %37, %38
  %40 = add nsw i32 %39, %.0125175
  br label %62

41:                                               ; preds = %31
  %42 = and i32 %32, 4
  %.not150 = icmp eq i32 %42, 0
  br i1 %.not150, label %47, label %43

43:                                               ; preds = %41
  %.neg154 = sub i32 %.0125175, %.0135170
  %.neg155 = mul i32 %.neg154, %.0131172
  %44 = sub nsw i32 %.0133171, %.0131172
  %45 = sdiv i32 %.neg155, %44
  %46 = add nsw i32 %45, %.0125175
  br label %62

47:                                               ; preds = %41
  %48 = and i32 %32, 2
  %.not151 = icmp eq i32 %48, 0
  br i1 %.not151, label %56, label %49

49:                                               ; preds = %47
  %50 = sub nsw i32 %.0133171, %.0131172
  %51 = sub nsw i32 %27, %.0125175
  %52 = mul nsw i32 %51, %50
  %53 = sub nsw i32 %.0135170, %.0125175
  %54 = sdiv i32 %52, %53
  %55 = add nsw i32 %54, %.0131172
  br label %62

56:                                               ; preds = %47
  %57 = and i32 %32, 1
  %.not152 = icmp eq i32 %57, 0
  br i1 %.not152, label %62, label %58

58:                                               ; preds = %56
  %.neg = sub i32 %.0131172, %.0133171
  %.neg153 = mul i32 %.0125175, %.neg
  %59 = sub nsw i32 %.0135170, %.0125175
  %60 = sdiv i32 %.neg153, %59
  %61 = add nsw i32 %60, %.0131172
  br label %62

62:                                               ; preds = %43, %56, %58, %49, %34
  %.1121 = phi i32 [ %40, %34 ], [ %46, %43 ], [ %27, %49 ], [ 0, %58 ], [ %.0120176, %56 ]
  %.1119 = phi i32 [ %26, %34 ], [ 0, %43 ], [ %55, %49 ], [ %61, %58 ], [ %.0118177, %56 ]
  %63 = icmp eq i32 %32, %.0129173
  %.1121.lobit158 = lshr i32 %.1121, 31
  %.not159 = icmp slt i32 %.1121, %7
  %64 = select i1 %.not159, i32 0, i32 2
  %65 = or disjoint i32 %64, %.1121.lobit158
  %66 = lshr i32 %.1119, 29
  %67 = and i32 %66, 4
  %68 = or disjoint i32 %65, %67
  %.not160 = icmp slt i32 %.1119, %12
  %69 = select i1 %.not160, i32 0, i32 8
  %70 = or disjoint i32 %68, %69
  %.0135170..1121 = select i1 %63, i32 %.0135170, i32 %.1121
  %.0133171..1119 = select i1 %63, i32 %.0133171, i32 %.1119
  %.1119..0131172 = select i1 %63, i32 %.1119, i32 %.0131172
  %..0129173 = select i1 %63, i32 %70, i32 %.0129173
  %.0127174. = select i1 %63, i32 %.0127174, i32 %70
  %.1121..0125175 = select i1 %63, i32 %.1121, i32 %.0125175
  %71 = icmp eq i32 %..0129173, 0
  %72 = icmp eq i32 %.0127174., 0
  %or.cond = select i1 %71, i1 %72, i1 false
  br i1 %or.cond, label %._crit_edge, label %28

._crit_edge:                                      ; preds = %62, %5
  %.0135.lcssa = phi i32 [ %2, %5 ], [ %.0135170..1121, %62 ]
  %.0133.lcssa = phi i32 [ %3, %5 ], [ %.0133171..1119, %62 ]
  %.0131.lcssa = phi i32 [ %1, %5 ], [ %.1119..0131172, %62 ]
  %.0125.lcssa = phi i32 [ %0, %5 ], [ %.1121..0125175, %62 ]
  %73 = sub nsw i32 %.0133.lcssa, %.0131.lcssa
  %spec.select = tail call i32 @llvm.abs.i32(i32 %73, i1 true)
  %.inv = icmp sgt i32 %73, -1
  %spec.select161 = select i1 %.inv, i32 1, i32 -1
  %74 = sub nsw i32 %.0135.lcssa, %.0125.lcssa
  %.0117 = tail call i32 @llvm.abs.i32(i32 %74, i1 true)
  %.inv162 = icmp sgt i32 %74, -1
  %.0115 = select i1 %.inv162, i32 1, i32 -1
  %75 = icmp ugt i32 %spec.select, %.0117
  br i1 %75, label %76, label %88

76:                                               ; preds = %._crit_edge
  %77 = shl nuw i32 %.0117, 1
  %78 = sub nsw i32 %77, %spec.select
  %79 = shl nuw i32 %spec.select, 1
  br label %80

80:                                               ; preds = %76, %._crit_edge198
  %.0111204 = phi i32 [ 0, %76 ], [ %87, %._crit_edge198 ]
  %.0112203 = phi i32 [ %78, %76 ], [ %86, %._crit_edge198 ]
  %.2202 = phi i32 [ %.0131.lcssa, %76 ], [ %81, %._crit_edge198 ]
  %.2122201 = phi i32 [ %.0125.lcssa, %76 ], [ %.3123.lcssa, %._crit_edge198 ]
  tail call void @GL_setpixel(i32 noundef %.2122201, i32 noundef %.2202, i16 noundef zeroext %4) #3
  %81 = add nsw i32 %.2202, %spec.select161
  %82 = icmp sgt i32 %.0112203, -1
  br i1 %82, label %.lr.ph197, label %._crit_edge198

.lr.ph197:                                        ; preds = %80, %.lr.ph197
  %.1113195 = phi i32 [ %84, %.lr.ph197 ], [ %.0112203, %80 ]
  %.3123194 = phi i32 [ %83, %.lr.ph197 ], [ %.2122201, %80 ]
  tail call void @GL_setpixel(i32 noundef %.3123194, i32 noundef %81, i16 noundef zeroext %4) #3
  %83 = add nsw i32 %.3123194, %.0115
  %84 = sub nsw i32 %.1113195, %79
  %85 = icmp sgt i32 %84, -1
  br i1 %85, label %.lr.ph197, label %._crit_edge198, !llvm.loop !9

._crit_edge198:                                   ; preds = %.lr.ph197, %80
  %.3123.lcssa = phi i32 [ %.2122201, %80 ], [ %83, %.lr.ph197 ]
  %.1113.lcssa = phi i32 [ %.0112203, %80 ], [ %84, %.lr.ph197 ]
  %86 = add nsw i32 %.1113.lcssa, %77
  %87 = add nuw i32 %.0111204, 1
  %exitcond211.not = icmp eq i32 %87, %spec.select
  br i1 %exitcond211.not, label %.loopexit, label %80, !llvm.loop !11

88:                                               ; preds = %._crit_edge
  %89 = shl nuw i32 %spec.select, 1
  %.not205 = icmp eq i32 %.0135.lcssa, %.0125.lcssa
  br i1 %.not205, label %.loopexit, label %.lr.ph193

.lr.ph193:                                        ; preds = %88
  %90 = sub nsw i32 %89, %.0117
  %91 = shl nuw i32 %.0117, 1
  %umax = tail call i32 @llvm.umax.i32(i32 %.0117, i32 1)
  br label %92

92:                                               ; preds = %.lr.ph193, %._crit_edge185
  %.0191 = phi i32 [ 0, %.lr.ph193 ], [ %99, %._crit_edge185 ]
  %.0110190 = phi i32 [ %90, %.lr.ph193 ], [ %98, %._crit_edge185 ]
  %.3189 = phi i32 [ %.0131.lcssa, %.lr.ph193 ], [ %.4.lcssa, %._crit_edge185 ]
  %.4124188 = phi i32 [ %.0125.lcssa, %.lr.ph193 ], [ %93, %._crit_edge185 ]
  tail call void @GL_setpixel(i32 noundef %.4124188, i32 noundef %.3189, i16 noundef zeroext %4) #3
  %93 = add nsw i32 %.4124188, %.0115
  %94 = icmp sgt i32 %.0110190, -1
  br i1 %94, label %.lr.ph184, label %._crit_edge185

.lr.ph184:                                        ; preds = %92, %.lr.ph184
  %.1182 = phi i32 [ %96, %.lr.ph184 ], [ %.0110190, %92 ]
  %.4181 = phi i32 [ %95, %.lr.ph184 ], [ %.3189, %92 ]
  tail call void @GL_setpixel(i32 noundef %93, i32 noundef %.4181, i16 noundef zeroext %4) #3
  %95 = add nsw i32 %.4181, %spec.select161
  %96 = sub nsw i32 %.1182, %91
  %97 = icmp sgt i32 %96, -1
  br i1 %97, label %.lr.ph184, label %._crit_edge185, !llvm.loop !12

._crit_edge185:                                   ; preds = %.lr.ph184, %92
  %.4.lcssa = phi i32 [ %.3189, %92 ], [ %95, %.lr.ph184 ]
  %.1.lcssa = phi i32 [ %.0110190, %92 ], [ %96, %.lr.ph184 ]
  %98 = add nsw i32 %.1.lcssa, %89
  %99 = add nuw i32 %.0191, 1
  %exitcond.not = icmp eq i32 %99, %umax
  br i1 %exitcond.not, label %.loopexit, label %92, !llvm.loop !13

.loopexit:                                        ; preds = %28, %._crit_edge185, %._crit_edge198, %88
  ret void
}

declare void @GL_setpixel(i32 noundef, i32 noundef, i16 noundef zeroext) local_unnamed_addr #1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.abs.i32(i32, i1 immarg) #2

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

attributes #0 = { 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 #1 = { "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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = !{!"short", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = distinct !{!9, !10}
!10 = !{!"llvm.loop.mustprogress"}
!11 = distinct !{!11, !10}
!12 = distinct !{!12, !10}
!13 = distinct !{!13, !10}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass