Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@ben-clayton
Created November 5, 2020 22:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ben-clayton/f86c02e7dc84357695b5e4d5ba65211b to your computer and use it in GitHub Desktop.
Save ben-clayton/f86c02e7dc84357695b5e4d5ba65211b to your computer and use it in GitHub Desktop.
./bin/opt crash.ir -coro-early -coro-split -coro-elide -S
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: nounwind
define internal i8* @coroutine_begin(i8* %0, i32 %1, i32 %2, i32 %3, i8* %4, i32 %5, i32 %6) #0 {
function:
%7 = alloca i8*, align 8
%8 = alloca i32, align 4
%9 = alloca <4 x i32>, align 16
%promise = alloca i32, align 4
%10 = bitcast i32* %promise to i8*
%11 = call token @llvm.coro.id(i32 0, i8* %10, i8* null, i8* null)
%12 = call i32 @llvm.coro.size.i32()
%13 = call i8* @coroutine_alloc_frame(i32 %12)
%14 = call i8* @llvm.coro.begin(token %11, i8* %13)
%15 = alloca <4 x float>, i64 3, align 16
%16 = alloca <4 x i32>, align 16
%17 = alloca <4 x i32>, align 16
%18 = alloca <4 x i32>, align 16
%19 = alloca <4 x i32>, align 16
%20 = alloca <4 x i32>, align 16
%21 = alloca <4 x i32>, align 16
%22 = alloca <4 x i32>, align 16
%23 = alloca <4 x i32>, align 16
%24 = alloca <4 x i32>, align 16
%25 = alloca <4 x i32>, align 16
%26 = alloca <4 x i32>, align 16
%27 = alloca <4 x i32>, align 16
%28 = alloca <4 x float>, align 16
%29 = alloca i32, align 4
%30 = alloca i32, align 4
%31 = alloca <4 x float>, align 16
%32 = alloca <4 x float>, align 16
%33 = alloca <4 x float>, align 16
%34 = alloca <4 x float>, align 16
%35 = alloca i32, align 4
%36 = alloca <4 x float>, i64 128, align 16
%37 = alloca <4 x i32>, align 16
%38 = alloca i32, align 4
%39 = alloca i32, align 4
%40 = alloca <4 x float>, i64 128, align 16
%41 = alloca <4 x i32>, align 16
%42 = alloca i8*, align 8
%43 = alloca <4 x i32>, align 16
%44 = alloca i8**, align 8
%45 = alloca <4 x i32>, align 16
%46 = alloca i32, align 4
%47 = alloca i32, align 4
%48 = alloca i32, align 4
%49 = alloca i8*, align 8
%50 = alloca <4 x float>, align 16
%51 = alloca i8*, align 8
%52 = alloca <4 x float>, align 16
%53 = alloca i32, align 4
%54 = alloca i8*, align 8
%55 = alloca <4 x float>, align 16
%56 = alloca i32, align 4
%57 = alloca <4 x i32>, align 16
%58 = alloca <4 x i32>, align 16
%59 = alloca <4 x i32>, align 16
%60 = alloca i8*, align 8
%61 = alloca <4 x i32>, align 16
%62 = alloca i32, align 4
%63 = alloca i32*, align 8
%64 = alloca i8*, align 8
%65 = alloca <4 x i32>, align 16
%66 = alloca i32, align 4
%67 = alloca <4 x i32>, align 16
%68 = alloca <4 x i32>, align 16
%69 = alloca i32, align 4
%70 = alloca i32, align 4
%71 = alloca i32, align 4
%72 = alloca i32, align 4
%73 = getelementptr i8, i8* %0, i64 0
%74 = bitcast i8* %73 to i8**
%75 = getelementptr i8, i8* %0, i64 32
%76 = bitcast i8* %75 to i32*
%77 = getelementptr i8, i8* %0, i64 124
%78 = getelementptr i8, i8* %0, i64 256
%79 = bitcast i8* %78 to i8**
%80 = load i8*, i8** %79, align 1
%81 = getelementptr i8, i8* %0, i64 120
%82 = bitcast i8* %81 to i32*
%83 = load i32, i32* %82, align 1
%84 = getelementptr i8, i8* %0, i64 80
%85 = bitcast i8* %84 to <4 x i32>*
%86 = load <4 x i32>, <4 x i32>* %85, align 1
%87 = insertelement <4 x i32> zeroinitializer, i32 %1, i32 0
%88 = insertelement <4 x i32> %87, i32 %2, i32 1
%89 = insertelement <4 x i32> %88, i32 %3, i32 2
%90 = getelementptr i8, i8* %0, i64 96
%91 = bitcast i8* %90 to <4 x i32>*
%92 = load <4 x i32>, <4 x i32>* %91, align 1
%93 = getelementptr i8, i8* %0, i64 116
%94 = bitcast i8* %93 to i32*
%95 = load i32, i32* %94, align 1
%96 = getelementptr i8, i8* %0, i64 112
%97 = bitcast i8* %96 to i32*
%98 = load i32, i32* %97, align 1
store i32 %2, i32* %72, align 4
store i32 %3, i32* %71, align 4
store i32 %2, i32* %70, align 4
store i32 %1, i32* %69, align 4
store i32 %5, i32* %66, align 4
store i32* %76, i32** %63, align 8
store i8* %0, i8** %60, align 8
store <4 x i32> %92, <4 x i32>* %59, align 16
store <4 x i32> %89, <4 x i32>* %57, align 16
store i32 0, i32* %56, align 4
store i8* %80, i8** %54, align 8
store i32 %6, i32* %53, align 4
store i8* %77, i8** %51, align 8
store i8* %4, i8** %49, align 8
store i32 %98, i32* %47, align 4
store i32 %1, i32* %46, align 4
store i8** %74, i8*** %44, align 8
store i8* %4, i8** %42, align 8
store i32 %95, i32* %38, align 4
store i32 %83, i32* %35, align 4
store i32 0, i32* %30, align 4
store i32 %3, i32* %29, align 4
store <4 x i32> %86, <4 x i32>* %25, align 16
br label %99
99: ; preds = %resume, %function
%100 = load i32, i32* %53, align 4
%101 = load i32, i32* %30, align 4
%102 = icmp slt i32 %101, %100
br i1 %102, label %103, label %187
103: ; preds = %99
%104 = load i32, i32* %30, align 4
%105 = load i32, i32* %66, align 4
%106 = add i32 %105, %104
%107 = mul i32 %106, 4
%108 = load <4 x i32>, <4 x i32>* %24, align 16
%109 = insertelement <4 x i32> %108, i32 %107, i32 0
%110 = shufflevector <4 x i32> %109, <4 x i32> %109, <4 x i32> zeroinitializer
store <4 x i32> %110, <4 x i32>* %24, align 16
%111 = load <4 x i32>, <4 x i32>* %24, align 16
%112 = add <4 x i32> %111, <i32 0, i32 1, i32 2, i32 3>
%113 = load i32, i32* %35, align 4
%114 = load <4 x i32>, <4 x i32>* %23, align 16
%115 = insertelement <4 x i32> %114, i32 %113, i32 0
%116 = shufflevector <4 x i32> %115, <4 x i32> %115, <4 x i32> zeroinitializer
store <4 x i32> %116, <4 x i32>* %23, align 16
%117 = load <4 x i32>, <4 x i32>* %23, align 16
%118 = icmp slt <4 x i32> %112, %117
%119 = sext <4 x i1> %118 to <4 x i32>
%120 = load i8*, i8** %60, align 8
%121 = getelementptr i8, i8* %120, i64 80
%122 = bitcast i8* %121 to <4 x i32>*
%123 = load <4 x i32>, <4 x i32>* %122, align 1
%124 = getelementptr i8, i8* %120, i64 96
%125 = bitcast i8* %124 to <4 x i32>*
%126 = load <4 x i32>, <4 x i32>* %125, align 1
%127 = extractelement <4 x i32> %126, i32 0
%128 = extractelement <4 x i32> %126, i32 1
%129 = mul i32 %127, %128
%130 = load <4 x i32>, <4 x i32>* %22, align 16
%131 = insertelement <4 x i32> %130, i32 %129, i32 0
%132 = shufflevector <4 x i32> %131, <4 x i32> %131, <4 x i32> zeroinitializer
store <4 x i32> %132, <4 x i32>* %22, align 16
%133 = load <4 x i32>, <4 x i32>* %22, align 16
%134 = sdiv <4 x i32> %112, %133
%135 = mul i32 %127, %128
%136 = load <4 x i32>, <4 x i32>* %21, align 16
%137 = insertelement <4 x i32> %136, i32 %135, i32 0
%138 = shufflevector <4 x i32> %137, <4 x i32> %137, <4 x i32> zeroinitializer
store <4 x i32> %138, <4 x i32>* %21, align 16
%139 = load <4 x i32>, <4 x i32>* %21, align 16
%140 = mul <4 x i32> %134, %139
%141 = sub <4 x i32> %112, %140
%142 = load <4 x i32>, <4 x i32>* %20, align 16
%143 = insertelement <4 x i32> %142, i32 %127, i32 0
%144 = shufflevector <4 x i32> %143, <4 x i32> %143, <4 x i32> zeroinitializer
store <4 x i32> %144, <4 x i32>* %20, align 16
%145 = load <4 x i32>, <4 x i32>* %20, align 16
%146 = sdiv <4 x i32> %141, %145
%147 = load <4 x i32>, <4 x i32>* %19, align 16
%148 = insertelement <4 x i32> %147, i32 %127, i32 0
%149 = shufflevector <4 x i32> %148, <4 x i32> %148, <4 x i32> zeroinitializer
store <4 x i32> %149, <4 x i32>* %19, align 16
%150 = load <4 x i32>, <4 x i32>* %19, align 16
%151 = mul <4 x i32> %146, %150
%152 = sub <4 x i32> %141, %151
%153 = load i32, i32* %29, align 4
%154 = load i32, i32* %72, align 4
%155 = load i32, i32* %46, align 4
%156 = insertelement <4 x i32> zeroinitializer, i32 %155, i32 0
%157 = insertelement <4 x i32> %156, i32 %154, i32 1
%158 = insertelement <4 x i32> %157, i32 %153, i32 2
%159 = mul <4 x i32> %126, %158
%160 = extractelement <4 x i32> %159, i32 0
%161 = load <4 x i32>, <4 x i32>* %18, align 16
%162 = insertelement <4 x i32> %161, i32 %160, i32 0
%163 = shufflevector <4 x i32> %162, <4 x i32> %162, <4 x i32> zeroinitializer
store <4 x i32> %163, <4 x i32>* %18, align 16
%164 = load <4 x i32>, <4 x i32>* %18, align 16
%165 = add <4 x i32> %164, %152
%166 = extractelement <4 x i32> %159, i32 1
%167 = load <4 x i32>, <4 x i32>* %17, align 16
%168 = insertelement <4 x i32> %167, i32 %166, i32 0
%169 = shufflevector <4 x i32> %168, <4 x i32> %168, <4 x i32> zeroinitializer
store <4 x i32> %169, <4 x i32>* %17, align 16
%170 = load <4 x i32>, <4 x i32>* %17, align 16
%171 = add <4 x i32> %170, %146
%172 = extractelement <4 x i32> %159, i32 2
%173 = load <4 x i32>, <4 x i32>* %16, align 16
%174 = insertelement <4 x i32> %173, i32 %172, i32 0
%175 = shufflevector <4 x i32> %174, <4 x i32> %174, <4 x i32> zeroinitializer
store <4 x i32> %175, <4 x i32>* %16, align 16
%176 = load <4 x i32>, <4 x i32>* %16, align 16
%177 = add <4 x i32> %176, %134
store <4 x i32> %112, <4 x i32>* %27, align 16
store i32 %106, i32* %62, align 4
store <4 x i32> %152, <4 x i32>* %67, align 16
store <4 x i32> %146, <4 x i32>* %68, align 16
store <4 x i32> %134, <4 x i32>* %37, align 16
store <4 x i32> %165, <4 x i32>* %41, align 16
store <4 x i32> %171, <4 x i32>* %43, align 16
store <4 x i32> %177, <4 x i32>* %45, align 16
%178 = bitcast <4 x i32> %165 to <4 x float>
%179 = getelementptr <4 x float>, <4 x float>* %15, i64 0
store <4 x float> %178, <4 x float>* %179, align 1
%180 = bitcast <4 x i32> %171 to <4 x float>
%181 = getelementptr <4 x float>, <4 x float>* %15, i64 1
store <4 x float> %180, <4 x float>* %181, align 1
%182 = bitcast <4 x i32> %177 to <4 x float>
%183 = getelementptr <4 x float>, <4 x float>* %15, i64 2
store <4 x float> %182, <4 x float>* %183, align 1
%184 = getelementptr <4 x float>, <4 x float>* %15, i64 0
%185 = bitcast <4 x float>* %184 to i8*
fence acq_rel
store <4 x i32> zeroinitializer, <4 x i32>* %9, align 16
store i32 0, i32* %8, align 4
store i8* %185, i8** %7, align 8
store i32 0, i32* %promise, align 4
%186 = call i8 @llvm.coro.suspend(token none, i1 false)
switch i8 %186, label %suspend [
i8 0, label %resume
i8 1, label %destroy
]
187: ; preds = %99
br label %end
suspend: ; preds = %103, %destroy, %end
%188 = call i1 @llvm.coro.end(i8* %14, i1 false)
ret i8* %14
end: ; preds = %187
%189 = call i8 @llvm.coro.suspend(token none, i1 true)
switch i8 %189, label %suspend [
i8 1, label %destroy
]
destroy: ; preds = %103, %end
%190 = call i8* @llvm.coro.free(token %11, i8* %14)
call void @coroutine_free_frame(i8* %190)
br label %suspend
resume: ; preds = %103
%191 = load i32, i32* %30, align 4
%192 = add i32 %191, 1
store i32 %192, i32* %30, align 4
br label %99
}
; Function Attrs: nounwind
define internal i1 @coroutine_await(i8* %0, i32* %1) #0 {
co_await:
%done1 = call i1 @llvm.coro.done(i8* %0)
br i1 %done1, label %done, label %resume
done: ; preds = %co_await
ret i1 false
resume: ; preds = %co_await
%2 = call i8* @llvm.coro.promise(i8* %0, i32 4, i1 false)
%3 = bitcast i8* %2 to i32*
%4 = load i32, i32* %3, align 4
store i32 %4, i32* %1, align 4
call void @llvm.coro.resume(i8* %0)
ret i1 true
}
; Function Attrs: nounwind
define internal void @coroutine_destroy(i8* %0) #0 {
call void @llvm.coro.destroy(i8* %0)
ret void
}
; Function Attrs: argmemonly nounwind readonly
declare token @llvm.coro.id(i32, i8* readnone, i8* nocapture readonly, i8*) #1
; Function Attrs: nounwind readnone
declare i32 @llvm.coro.size.i32() #2
; Function Attrs: nounwind
declare i8* @llvm.coro.begin(token, i8* writeonly) #0
declare void @llvm.coro.resume(i8*)
; Function Attrs: nounwind
declare i1 @llvm.coro.end(i8*, i1) #0
; Function Attrs: argmemonly nounwind readonly
declare i8* @llvm.coro.free(token, i8* nocapture readonly) #1
declare void @llvm.coro.destroy(i8*)
; Function Attrs: nounwind readnone
declare i8* @llvm.coro.promise(i8* nocapture, i32, i1) #2
; Function Attrs: argmemonly nounwind
declare i1 @llvm.coro.done(i8* nocapture readonly) #3
; Function Attrs: nounwind
declare i8 @llvm.coro.suspend(token, i1) #0
declare i8* @coroutine_alloc_frame(i32)
declare void @coroutine_free_frame(i8*)
attributes #0 = { nounwind }
attributes #1 = { argmemonly nounwind readonly }
attributes #2 = { nounwind readnone }
attributes #3 = { argmemonly nounwind }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment