Odin icon indicating copy to clipboard operation
Odin copied to clipboard

Metal example doesn't compile: LLVM CODE GEN FAILED for build_shaders

Open yay opened this issue 3 years ago • 2 comments

I'm getting an error building Metal examples.

macOS 13 beta 4 arm64 (kernel version 22.0) Odin dev-2022-08:a0135080 LLVM 14.0.6 (same error with LLVM 13) RAM: 32768 MiB

Please note that this source change would have to be made first before you see the below output: Screenshot 2022-08-01 at 9 57 47 PM

/Users/vitaly/projects/odin-examples/learn_metal/01-primitive $ odin run .
LLVM CODE GEN FAILED FOR PROCEDURE: main.build_shaders
define internal void @main.build_shaders({ %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* noalias sret({ %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }) %agg.result, %objc_Metal.Device* %0, i8* noalias nocapture nonnull %__.context_ptr) {
decls:
  %1 = alloca %objc_Metal.Device*, align 8
  %2 = alloca %..string, align 8
  %3 = alloca %objc_Foundation.String*, align 8
  %4 = alloca { %objc_Metal.Library*, %objc_Foundation.Error* }, align 8
  %5 = alloca %objc_Metal.Function*, align 8
  %6 = alloca %objc_Metal.Function*, align 8
  %7 = alloca %objc_Metal.RenderPipelineDescriptor*, align 8
  %8 = alloca { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, align 8
  br label %entry

entry:                                            ; preds = %decls
  store %objc_Metal.Device* %0, %objc_Metal.Device** %1, align 8
  %9 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 0
  %10 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 1
  %11 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 2
  %12 = bitcast i8* %__.context_ptr to %runtime.Context*
  store %..string { i8* getelementptr inbounds ([552 x i8], [552 x i8]* @"csbs$1bc", i64 0, i64 0), i64 551 }, %..string* %2, align 8
  %13 = bitcast %runtime.Context* %12 to i8*
  %14 = call %objc_Foundation.String* @objc_Foundation.String_alloc(i8* %13)
  %15 = load %..string, %..string* %2, align 8
  %16 = bitcast %..string* %2 to [2 x i64]*
  %17 = load [2 x i64], [2 x i64]* %16, align 8
  %18 = bitcast %runtime.Context* %12 to i8*
  %19 = call %objc_Foundation.String* @objc_Foundation.String_initWithOdinString(%objc_Foundation.String* %14, [2 x i64] %17, i8* %18)
  store %objc_Foundation.String* %19, %objc_Foundation.String** %3, align 8
  %20 = load %objc_Metal.Device*, %objc_Metal.Device** %1, align 8
  %21 = load %objc_Foundation.String*, %objc_Foundation.String** %3, align 8
  %22 = bitcast %runtime.Context* %12 to i8*
  %23 = call [2 x i64] @objc_Metal.Device_newLibraryWithSource(%objc_Metal.Device* %20, %objc_Foundation.String* %21, %objc_Metal.CompileOptions* null, i8* %22)
  %24 = bitcast { %objc_Metal.Library*, %objc_Foundation.Error* }* %4 to [2 x i64]*
  store [2 x i64] %23, [2 x i64]* %24, align 8
  %25 = load { %objc_Metal.Library*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Foundation.Error* }* %4, align 8
  %26 = getelementptr inbounds { %objc_Metal.Library*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Foundation.Error* }* %4, i32 0, i32 0
  %27 = load %objc_Metal.Library*, %objc_Metal.Library** %26, align 8
  %28 = getelementptr inbounds { %objc_Metal.Library*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Foundation.Error* }* %4, i32 0, i32 1
  %29 = load %objc_Foundation.Error*, %objc_Foundation.Error** %28, align 8
  %30 = icmp eq %objc_Foundation.Error* %29, null
  br i1 %30, label %or_return.continue, label %or_return.return

or_return.return:                                 ; preds = %entry
  store %objc_Foundation.Error* %29, %objc_Foundation.Error** %11, align 8
  %31 = load %objc_Metal.Library*, %objc_Metal.Library** %9, align 8
  %32 = load %objc_Metal.RenderPipelineState*, %objc_Metal.RenderPipelineState** %10, align 8
  %33 = load %objc_Foundation.Error*, %objc_Foundation.Error** %11, align 8
  store %objc_Metal.Library* %31, %objc_Metal.Library** %9, align 8
  store %objc_Metal.RenderPipelineState* %32, %objc_Metal.RenderPipelineState** %10, align 8
  store %objc_Foundation.Error* %33, %objc_Foundation.Error** %11, align 8
  %34 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 0
  %35 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 1
  %36 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 2
  store %objc_Metal.Library* %31, %objc_Metal.Library** %34, align 8
  store %objc_Metal.RenderPipelineState* %32, %objc_Metal.RenderPipelineState** %35, align 8
  store %objc_Foundation.Error* %33, %objc_Foundation.Error** %36, align 8
  br label %defer

defer:                                            ; preds = %or_return.return
  %37 = load %objc_Foundation.String*, %objc_Foundation.String** %3, align 8
  %38 = getelementptr inbounds %objc_Foundation.String, %objc_Foundation.String* %37, i32 0, i32 0
  %39 = getelementptr inbounds %"objc_Foundation.Copying(String)-12202", %"objc_Foundation.Copying(String)-12202"* %38, i32 0, i32 0
  %40 = bitcast %runtime.Context* %12 to i8*
  call void @objc_Foundation.release(%objc_Foundation.Object* %39, i8* %40)
  ret void

or_return.continue:                               ; preds = %entry
  store %objc_Metal.Library* %27, %objc_Metal.Library** %9, align 8
  %41 = load %objc_Metal.Library*, %objc_Metal.Library** %9, align 8
  %42 = call %objc_Foundation.String* @objc_Foundation.MakeConstantString(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @"csbs$1bd", i64 0, i64 0))
  %43 = bitcast %runtime.Context* %12 to i8*
  %44 = call %objc_Metal.Function* @objc_Metal.Library_newFunctionWithName(%objc_Metal.Library* %41, %objc_Foundation.String* %42, i8* %43)
  store %objc_Metal.Function* %44, %objc_Metal.Function** %5, align 8
  %45 = load %objc_Metal.Library*, %objc_Metal.Library** %9, align 8
  %46 = call %objc_Foundation.String* @objc_Foundation.MakeConstantString(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @"csbs$1be", i64 0, i64 0))
  %47 = bitcast %runtime.Context* %12 to i8*
  %48 = call %objc_Metal.Function* @objc_Metal.Library_newFunctionWithName(%objc_Metal.Library* %45, %objc_Foundation.String* %46, i8* %47)
  store %objc_Metal.Function* %48, %objc_Metal.Function** %6, align 8
  %49 = bitcast %runtime.Context* %12 to i8*
  %50 = call %objc_Metal.RenderPipelineDescriptor* @objc_Metal.RenderPipelineDescriptor_alloc(i8* %49)
  %51 = bitcast %runtime.Context* %12 to i8*
  %52 = call %objc_Metal.RenderPipelineDescriptor* @objc_Metal.RenderPipelineDescriptor_init(%objc_Metal.RenderPipelineDescriptor* %50, i8* %51)
  store %objc_Metal.RenderPipelineDescriptor* %52, %objc_Metal.RenderPipelineDescriptor** %7, align 8
  %53 = load %objc_Metal.RenderPipelineDescriptor*, %objc_Metal.RenderPipelineDescriptor** %7, align 8
  %54 = load %objc_Metal.Function*, %objc_Metal.Function** %5, align 8
  %55 = bitcast %runtime.Context* %12 to i8*
  call void @objc_Metal.RenderPipelineDescriptor_setVertexFunction(%objc_Metal.RenderPipelineDescriptor* %53, %objc_Metal.Function* %54, i8* %55)
  %56 = load %objc_Metal.RenderPipelineDescriptor*, %objc_Metal.RenderPipelineDescriptor** %7, align 8
  %57 = load %objc_Metal.Function*, %objc_Metal.Function** %6, align 8
  %58 = bitcast %runtime.Context* %12 to i8*
  call void @objc_Metal.RenderPipelineDescriptor_setFragmentFunction(%objc_Metal.RenderPipelineDescriptor* %56, %objc_Metal.Function* %57, i8* %58)
  %59 = load %objc_Metal.RenderPipelineDescriptor*, %objc_Metal.RenderPipelineDescriptor** %7, align 8
  %60 = bitcast %runtime.Context* %12 to i8*
  %61 = call %objc_Metal.RenderPipelineColorAttachmentDescriptorArray* @objc_Metal.RenderPipelineDescriptor_colorAttachments(%objc_Metal.RenderPipelineDescriptor* %59, i8* %60)
  %62 = bitcast %runtime.Context* %12 to i8*
  %63 = call %objc_Metal.RenderPipelineColorAttachmentDescriptor* @objc_Metal.RenderPipelineColorAttachmentDescriptorArray_object(%objc_Metal.RenderPipelineColorAttachmentDescriptorArray* %61, i64 0, i8* %62)
  %64 = bitcast %runtime.Context* %12 to i8*
  call void @objc_Metal.RenderPipelineColorAttachmentDescriptor_setPixelFormat(%objc_Metal.RenderPipelineColorAttachmentDescriptor* %63, i64 81, i8* %64)
  %65 = load %objc_Metal.Device*, %objc_Metal.Device** %1, align 8
  %66 = load %objc_Metal.RenderPipelineDescriptor*, %objc_Metal.RenderPipelineDescriptor** %7, align 8
  %67 = bitcast %runtime.Context* %12 to i8*
  %68 = call [2 x i64] @objc_Metal.Device_newRenderPipelineStateWithDescriptor(%objc_Metal.Device* %65, %objc_Metal.RenderPipelineDescriptor* %66, i8* %67)
  %69 = bitcast { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %8 to [2 x i64]*
  store [2 x i64] %68, [2 x i64]* %69, align 8
  %70 = load { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %8, align 8
  %71 = getelementptr inbounds { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %8, i32 0, i32 0
  %72 = load %objc_Metal.RenderPipelineState*, %objc_Metal.RenderPipelineState** %71, align 8
  %73 = getelementptr inbounds { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %8, i32 0, i32 1
  %74 = load %objc_Foundation.Error*, %objc_Foundation.Error** %73, align 8
  %75 = icmp eq %objc_Foundation.Error* %74, null
  br i1 %75, label %or_return.continue6, label %or_return.return1

or_return.return1:                                ; preds = %or_return.continue
  store %objc_Foundation.Error* %74, %objc_Foundation.Error** %11, align 8
  %76 = load %objc_Metal.Library*, %objc_Metal.Library** %9, align 8
  %77 = load %objc_Metal.RenderPipelineState*, %objc_Metal.RenderPipelineState** %10, align 8
  %78 = load %objc_Foundation.Error*, %objc_Foundation.Error** %11, align 8
  store %objc_Metal.Library* %76, %objc_Metal.Library** %9, align 8
  store %objc_Metal.RenderPipelineState* %77, %objc_Metal.RenderPipelineState** %10, align 8
  store %objc_Foundation.Error* %78, %objc_Foundation.Error** %11, align 8
  %79 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 0
  %80 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 1
  %81 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 2
  store %objc_Metal.Library* %76, %objc_Metal.Library** %79, align 8
  store %objc_Metal.RenderPipelineState* %77, %objc_Metal.RenderPipelineState** %80, align 8
  store %objc_Foundation.Error* %78, %objc_Foundation.Error** %81, align 8
  br label %defer2

defer2:                                           ; preds = %or_return.return1
  %82 = load %objc_Metal.RenderPipelineDescriptor*, %objc_Metal.RenderPipelineDescriptor** %7, align 8
  %83 = getelementptr inbounds %objc_Metal.RenderPipelineDescriptor, %objc_Metal.RenderPipelineDescriptor* %82, i32 0, i32 0
  %84 = getelementptr inbounds %"objc_Metal.NS.Copying(RenderPipelineDescriptor)-14622", %"objc_Metal.NS.Copying(RenderPipelineDescriptor)-14622"* %83, i32 0, i32 0
  %85 = bitcast %runtime.Context* %12 to i8*
  call void @objc_Foundation.release(%objc_Foundation.Object* %84, i8* %85)
  br label %defer3

defer3:                                           ; preds = %defer2
  %86 = load %objc_Metal.Function*, %objc_Metal.Function** %6, align 8
  %87 = getelementptr inbounds %objc_Metal.Function, %objc_Metal.Function* %86, i32 0, i32 0
  %88 = bitcast %runtime.Context* %12 to i8*
  call void @objc_Foundation.release(%objc_Foundation.Object* %87, i8* %88)
  br label %defer4

defer4:                                           ; preds = %defer3
  %89 = load %objc_Metal.Function*, %objc_Metal.Function** %5, align 8
  %90 = getelementptr inbounds %objc_Metal.Function, %objc_Metal.Function* %89, i32 0, i32 0
  %91 = bitcast %runtime.Context* %12 to i8*
  call void @objc_Foundation.release(%objc_Foundation.Object* %90, i8* %91)
  br label %defer5

defer5:                                           ; preds = %defer4
  %92 = getelementptr inbounds %objc_Foundation.String, %objc_Foundation.String* %37, i32 0, i32 0
  %93 = getelementptr inbounds %"objc_Foundation.Copying(String)-12202", %"objc_Foundation.Copying(String)-12202"* %92, i32 0, i32 0
  %94 = bitcast %runtime.Context* %12 to i8*
  call void @objc_Foundation.release(%objc_Foundation.Object* %93, i8* %94)
  ret void

or_return.continue6:                              ; preds = %or_return.continue
  store %objc_Metal.RenderPipelineState* %72, %objc_Metal.RenderPipelineState** %10, align 8
  %95 = load %objc_Metal.Library*, %objc_Metal.Library** %9, align 8
  %96 = load %objc_Metal.RenderPipelineState*, %objc_Metal.RenderPipelineState** %10, align 8
  %97 = load %objc_Foundation.Error*, %objc_Foundation.Error** %11, align 8
  store %objc_Metal.Library* %95, %objc_Metal.Library** %9, align 8
  store %objc_Metal.RenderPipelineState* %96, %objc_Metal.RenderPipelineState** %10, align 8
  store %objc_Foundation.Error* %97, %objc_Foundation.Error** %11, align 8
  %98 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 0
  %99 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 1
  %100 = getelementptr inbounds { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }, { %objc_Metal.Library*, %objc_Metal.RenderPipelineState*, %objc_Foundation.Error* }* %agg.result, i32 0, i32 2
  store %objc_Metal.Library* %95, %objc_Metal.Library** %98, align 8
  store %objc_Metal.RenderPipelineState* %96, %objc_Metal.RenderPipelineState** %99, align 8
  store %objc_Foundation.Error* %97, %objc_Foundation.Error** %100, align 8
  br label %defer7

defer7:                                           ; preds = %or_return.continue6
  %101 = getelementptr inbounds %objc_Metal.RenderPipelineDescriptor, %objc_Metal.RenderPipelineDescriptor* %82, i32 0, i32 0
  %102 = getelementptr inbounds %"objc_Metal.NS.Copying(RenderPipelineDescriptor)-14622", %"objc_Metal.NS.Copying(RenderPipelineDescriptor)-14622"* %101, i32 0, i32 0
  %103 = bitcast %runtime.Context* %12 to i8*
  call void @objc_Foundation.release(%objc_Foundation.Object* %102, i8* %103)
  br label %defer8

defer8:                                           ; preds = %defer7
  %104 = getelementptr inbounds %objc_Metal.Function, %objc_Metal.Function* %86, i32 0, i32 0
  %105 = bitcast %runtime.Context* %12 to i8*
  call void @objc_Foundation.release(%objc_Foundation.Object* %104, i8* %105)
  br label %defer9

defer9:                                           ; preds = %defer8
  %106 = getelementptr inbounds %objc_Metal.Function, %objc_Metal.Function* %89, i32 0, i32 0
  %107 = bitcast %runtime.Context* %12 to i8*
  call void @objc_Foundation.release(%objc_Foundation.Object* %106, i8* %107)
  br label %defer10

defer10:                                          ; preds = %defer9
  %108 = load %objc_Foundation.String*, %objc_Foundation.String** %3, align 8
  %109 = getelementptr inbounds %objc_Foundation.String, %objc_Foundation.String* %108, i32 0, i32 0
  %110 = getelementptr inbounds %"objc_Foundation.Copying(String)-12202", %"objc_Foundation.Copying(String)-12202"* %109, i32 0, i32 0
  %111 = bitcast %runtime.Context* %12 to i8*
  call void @objc_Foundation.release(%objc_Foundation.Object* %110, i8* %111)
  ret void
}




Instruction does not dominate all uses!
  %37 = load %objc_Foundation.String*, %objc_Foundation.String** %3, align 8
  %92 = getelementptr inbounds %objc_Foundation.String, %objc_Foundation.String* %37, i32 0, i32 0
Instruction does not dominate all uses!
  %82 = load %objc_Metal.RenderPipelineDescriptor*, %objc_Metal.RenderPipelineDescriptor** %7, align 8
  %101 = getelementptr inbounds %objc_Metal.RenderPipelineDescriptor, %objc_Metal.RenderPipelineDescriptor* %82, i32 0, i32 0
Instruction does not dominate all uses!
  %86 = load %objc_Metal.Function*, %objc_Metal.Function** %6, align 8
  %104 = getelementptr inbounds %objc_Metal.Function, %objc_Metal.Function* %86, i32 0, i32 0
Instruction does not dominate all uses!
  %89 = load %objc_Metal.Function*, %objc_Metal.Function** %5, align 8
  %106 = getelementptr inbounds %objc_Metal.Function, %objc_Metal.Function* %89, i32 0, i32 0
/Users/vitaly/projects/odin-examples/learn_metal/01-primitive $ 

yay avatar Aug 01 '22 21:08 yay

@gingerBill any update on fixing this regression?

yay avatar Aug 10 '22 00:08 yay

I found the commit that broke it: https://github.com/odin-lang/Odin/commit/199dae6cd52d5401d6f71b73eef235814d5ab223

yay avatar Aug 10 '22 20:08 yay