Skip to content

Commit

Permalink
Add many tests
Browse files Browse the repository at this point in the history
Make tests work for lower versions of LLVM
  • Loading branch information
tansongchen committed Jan 26, 2022
1 parent eb21c25 commit 6e25212
Show file tree
Hide file tree
Showing 10 changed files with 761 additions and 293 deletions.
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,3 @@
*.out
build
.vscode
.cache
.DS_Store
598 changes: 350 additions & 248 deletions enzyme/Enzyme/AdjointGenerator.h

Large diffs are not rendered by default.

55 changes: 55 additions & 0 deletions enzyme/test/Enzyme/ReverseMode/blas/cblas_daxpy_a.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
;RUN: %opt < %s %loadEnzyme -enzyme -mem2reg -instsimplify -simplifycfg -S | FileCheck %s

target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.17.0"
@__const.main.m = private unnamed_addr constant [3 x double] [double 1.000000e+00, double 2.000000e+00, double 3.000000e+00], align 16
@__const.main.d_m = private unnamed_addr constant [3 x double] [double 2.000000e+00, double 4.000000e+00, double 6.000000e+00], align 16
@__const.main.n = private unnamed_addr constant [3 x double] [double 4.000000e+00, double 5.000000e+00, double 6.000000e+00], align 16
@__const.main.d_n = private unnamed_addr constant [3 x double] [double 8.000000e+00, double 1.000000e+01, double 1.200000e+01], align 16
define void @f(i32 %n, double %a, double* noalias %x, double* noalias %y) {
entry:
tail call void @cblas_daxpy(i32 %n, double %a, double* %x, i32 1, double* %y, i32 1)
ret void
}
declare void @cblas_daxpy(i32, double, double*, i32, double*, i32)
define i32 @main() {
entry:
%m = alloca [3 x double], align 16
%d_m = alloca [3 x double], align 16
%n = alloca [3 x double], align 16
%d_n = alloca [3 x double], align 16
%0 = bitcast [3 x double]* %m to i8*
call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %0)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %0, i8* align 16 bitcast ([3 x double]* @__const.main.m to i8*), i64 24, i1 false)
%1 = bitcast [3 x double]* %d_m to i8*
call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %1)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %1, i8* align 16 bitcast ([3 x double]* @__const.main.d_m to i8*), i64 24, i1 false)
%2 = bitcast [3 x double]* %n to i8*
call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %2)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %2, i8* align 16 bitcast ([3 x double]* @__const.main.n to i8*), i64 24, i1 false)
%3 = bitcast [3 x double]* %d_n to i8*
call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %3)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %3, i8* align 16 bitcast ([3 x double]* @__const.main.d_n to i8*), i64 24, i1 false)
%arraydecay = getelementptr inbounds [3 x double], [3 x double]* %m, i64 0, i64 0
%arraydecay1 = getelementptr inbounds [3 x double], [3 x double]* %d_m, i64 0, i64 0
%arraydecay2 = getelementptr inbounds [3 x double], [3 x double]* %n, i64 0, i64 0
%arraydecay3 = getelementptr inbounds [3 x double], [3 x double]* %d_n, i64 0, i64 0
%call = call double @__enzyme_autodiff(i8* bitcast (void (i32, double, double*, double*)* @f to i8*), i32 3, double 1.000000e+00, double* nonnull %arraydecay, double* nonnull %arraydecay1, double* nonnull %arraydecay2, double* nonnull %arraydecay3)
call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %3)
call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %2)
call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %1)
call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %0)
ret i32 0
}
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1)
declare double @__enzyme_autodiff(i8*, i32, double, double*, double*, double*, double*)
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
;CHECK:define internal { double } @diffef(i32 %n, double %a, double* noalias %x, double* %"x'", double* noalias %y, double* %"y'") {
;CHECK-NEXT:entry:
;CHECK-NEXT: tail call void @cblas_daxpy(i32 %n, double %a, double* %x, i32 1, double* %y, i32 1)
;CHECK-NEXT: call void @cblas_daxpy(i32 %n, double %a, double* %"y'", i32 1, double* %"x'", i32 1)
;CHECK-NEXT: %0 = call fast double @cblas_ddot(i32 %n, double* nocapture readonly %"y'", i32 1, double* nocapture readonly %x, i32 1)
;CHECK-NEXT: %1 = insertvalue { double } undef, double %0, 0
;CHECK-NEXT: ret { double } %1
;CHECK-NEXT:}
53 changes: 53 additions & 0 deletions enzyme/test/Enzyme/ReverseMode/blas/cblas_daxpy_x.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
;RUN: %opt < %s %loadEnzyme -enzyme -mem2reg -instsimplify -simplifycfg -S | FileCheck %s

target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.17.0"
@__const.main.m = private unnamed_addr constant [3 x double] [double 1.000000e+00, double 2.000000e+00, double 3.000000e+00], align 16
@__const.main.d_m = private unnamed_addr constant [3 x double] [double 2.000000e+00, double 4.000000e+00, double 6.000000e+00], align 16
@__const.main.n = private unnamed_addr constant [3 x double] [double 4.000000e+00, double 5.000000e+00, double 6.000000e+00], align 16
@__const.main.d_n = private unnamed_addr constant [3 x double] [double 8.000000e+00, double 1.000000e+01, double 1.200000e+01], align 16
define void @f(i32 %n, double* noalias %x, double* noalias %y) {
entry:
tail call void @cblas_daxpy(i32 %n, double 1.000000e+00, double* %x, i32 1, double* %y, i32 1)
ret void
}
declare void @cblas_daxpy(i32, double, double*, i32, double*, i32)
define i32 @main() {
entry:
%m = alloca [3 x double], align 16
%d_m = alloca [3 x double], align 16
%n = alloca [3 x double], align 16
%d_n = alloca [3 x double], align 16
%0 = bitcast [3 x double]* %m to i8*
call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %0)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %0, i8* align 16 bitcast ([3 x double]* @__const.main.m to i8*), i64 24, i1 false)
%1 = bitcast [3 x double]* %d_m to i8*
call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %1)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %1, i8* align 16 bitcast ([3 x double]* @__const.main.d_m to i8*), i64 24, i1 false)
%2 = bitcast [3 x double]* %n to i8*
call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %2)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %2, i8* align 16 bitcast ([3 x double]* @__const.main.n to i8*), i64 24, i1 false)
%3 = bitcast [3 x double]* %d_n to i8*
call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %3)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %3, i8* align 16 bitcast ([3 x double]* @__const.main.d_n to i8*), i64 24, i1 false)
%arraydecay = getelementptr inbounds [3 x double], [3 x double]* %m, i64 0, i64 0
%arraydecay1 = getelementptr inbounds [3 x double], [3 x double]* %d_m, i64 0, i64 0
%arraydecay2 = getelementptr inbounds [3 x double], [3 x double]* %n, i64 0, i64 0
%arraydecay3 = getelementptr inbounds [3 x double], [3 x double]* %d_n, i64 0, i64 0
call void @__enzyme_autodiff(i8* bitcast (void (i32, double*, double*)* @f to i8*), i32 3, double* nonnull %arraydecay, double* nonnull %arraydecay1, double* nonnull %arraydecay2, double* nonnull %arraydecay3)
call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %3)
call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %2)
call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %1)
call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %0)
ret i32 0
}
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1)
declare void @__enzyme_autodiff(i8*, i32, double*, double*, double*, double*)
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
;CHECK:define internal void @diffef(i32 %n, double* noalias %x, double* %"x'", double* noalias %y, double* %"y'") {
;CHECK-NEXT:entry:
;CHECK-NEXT: tail call void @cblas_daxpy(i32 %n, double 1.000000e+00, double* %x, i32 1, double* %y, i32 1)
;CHECK-NEXT: call void @cblas_daxpy(i32 %n, double 1.000000e+00, double* %"y'", i32 1, double* %"x'", i32 1)
;CHECK-NEXT: ret void
;CHECK-NEXT:}
73 changes: 73 additions & 0 deletions enzyme/test/Enzyme/ReverseMode/blas/cblas_dgemv_alpha.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
;RUN: %opt < %s %loadEnzyme -enzyme -mem2reg -instsimplify -simplifycfg -S | FileCheck %s

target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.17.0"
@__const.main.a = private unnamed_addr constant [4 x double] [double 1.000000e+00, double 0.000000e+00, double 0.000000e+00, double 1.000000e+00], align 16
@__const.main.x = private unnamed_addr constant [2 x double] [double 1.000000e+00, double 1.000000e+00], align 16
@__const.main.y = private unnamed_addr constant [3 x double] [double 1.000000e+00, double 2.000000e+00, double 3.000000e+00], align 16
@__const.main.d_y = private unnamed_addr constant [3 x double] [double 2.000000e+00, double 4.000000e+00, double 6.000000e+00], align 16
define void @f(double* noalias %x, double* noalias %y, double* noalias %a, double %alpha) {
entry:
tail call void @cblas_dgemv(i32 102, i32 111, i32 2, i32 2, double %alpha, double* %a, i32 2, double* %x, i32 1, double 2.000000e+00, double* %y, i32 1)
ret void
}
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
declare void @cblas_dgemv(i32, i32, i32, i32, double, double*, i32, double*, i32, double, double*, i32)
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
define i32 @main() {
entry:
%a = alloca [4 x double], align 16
%d_a = alloca [4 x double], align 16
%x = alloca [2 x double], align 16
%d_x = alloca [2 x double], align 16
%y = alloca [3 x double], align 16
%d_y = alloca [3 x double], align 16
%0 = bitcast [4 x double]* %a to i8*
call void @llvm.lifetime.start.p0i8(i64 32, i8* nonnull %0)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %0, i8* align 16 bitcast ([4 x double]* @__const.main.a to i8*), i64 32, i1 false)
%1 = bitcast [4 x double]* %d_a to i8*
call void @llvm.lifetime.start.p0i8(i64 32, i8* nonnull %1)
call void @llvm.memset.p0i8.i64(i8* nonnull align 16 %1, i8 0, i64 32, i1 false)
%2 = bitcast [2 x double]* %x to i8*
call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %2)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %2, i8* align 16 bitcast ([2 x double]* @__const.main.x to i8*), i64 16, i1 false)
%3 = bitcast [2 x double]* %d_x to i8*
call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %3)
call void @llvm.memset.p0i8.i64(i8* nonnull align 16 %3, i8 0, i64 16, i1 false)
%4 = bitcast [3 x double]* %y to i8*
call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %4)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %4, i8* align 16 bitcast ([3 x double]* @__const.main.y to i8*), i64 24, i1 false)
%5 = bitcast [3 x double]* %d_y to i8*
call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %5)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %5, i8* align 16 bitcast ([3 x double]* @__const.main.d_y to i8*), i64 24, i1 false)
%arraydecay = getelementptr inbounds [2 x double], [2 x double]* %x, i64 0, i64 0
%arraydecay1 = getelementptr inbounds [2 x double], [2 x double]* %d_x, i64 0, i64 0
%arraydecay2 = getelementptr inbounds [3 x double], [3 x double]* %y, i64 0, i64 0
%arraydecay3 = getelementptr inbounds [3 x double], [3 x double]* %d_y, i64 0, i64 0
%arraydecay4 = getelementptr inbounds [4 x double], [4 x double]* %a, i64 0, i64 0
%arraydecay5 = getelementptr inbounds [4 x double], [4 x double]* %d_a, i64 0, i64 0
%call = call double @__enzyme_autodiff(i8* bitcast (void (double*, double*, double*, double)* @f to i8*), double* nonnull %arraydecay, double* nonnull %arraydecay1, double* nonnull %arraydecay2, double* nonnull %arraydecay3, double* nonnull %arraydecay4, double* nonnull %arraydecay5, double 3.000000e+00)
call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %5)
call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %4)
call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %3)
call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %2)
call void @llvm.lifetime.end.p0i8(i64 32, i8* nonnull %1)
call void @llvm.lifetime.end.p0i8(i64 32, i8* nonnull %0)
ret i32 0
}
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1)
declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1)
declare double @__enzyme_autodiff(i8*, double*, double*, double*, double*, double*, double*, double)
;CHECK:define internal { double } @diffef(double* noalias %x, double* %"x'", double* noalias %y, double* %"y'", double* noalias %a, double* %"a'", double %alpha) {
;CHECK-NEXT:entry:
;CHECK-NEXT: %malloccall = tail call i8* @malloc(i64 mul (i64 ptrtoint (double* getelementptr (double, double* null, i32 1) to i64), i64 2))
;CHECK-NEXT: %0 = bitcast i8* %malloccall to double*
;CHECK-NEXT: tail call void @cblas_dgemv(i32 102, i32 111, i32 2, i32 2, double %alpha, double* %a, i32 2, double* %x, i32 1, double 2.000000e+00, double* %y, i32 1)
;CHECK-NEXT: call void @cblas_dscal(i32 2, double 2.000000e+00, double* %"y'", i32 1)
;CHECK-NEXT: call void @cblas_dgemv(i32 102, i32 112, i32 2, i32 2, double %alpha, double* %a, i32 2, double* %"y'", i32 1, double 1.000000e+00, double* %"x'", i32 1)
;CHECK-NEXT: call void @cblas_dger(i32 102, i32 2, i32 2, double %alpha, double* %"y'", i32 1, double* %"x'", i32 1, double* %a, i32 2)
;CHECK-NEXT: call void @cblas_dgemv(i32 102, i32 111, i32 2, i32 2, double 1.000000e+00, double* %a, i32 2, double* %x, i32 1, double 0.000000e+00, double* %0, i32 1)
;CHECK-NEXT: %1 = call fast double @cblas_ddot(i32 2, double* nocapture readonly %"y'", i32 1, double* nocapture readonly %0, i32 1)
;CHECK-NEXT: %2 = insertvalue { double } undef, double %1, 0
;CHECK-NEXT: ret { double } %2
;CHECK-NEXT:}
70 changes: 70 additions & 0 deletions enzyme/test/Enzyme/ReverseMode/blas/cblas_dgemv_beta.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
;RUN: %opt < %s %loadEnzyme -enzyme -mem2reg -instsimplify -simplifycfg -S | FileCheck %s

target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.17.0"
@__const.main.a = private unnamed_addr constant [4 x double] [double 1.000000e+00, double 0.000000e+00, double 0.000000e+00, double 1.000000e+00], align 16
@__const.main.x = private unnamed_addr constant [2 x double] [double 1.000000e+00, double 1.000000e+00], align 16
@__const.main.y = private unnamed_addr constant [3 x double] [double 1.000000e+00, double 2.000000e+00, double 3.000000e+00], align 16
@__const.main.d_y = private unnamed_addr constant [3 x double] [double 2.000000e+00, double 4.000000e+00, double 6.000000e+00], align 16
define void @f(double* noalias %x, double* noalias %y, double* noalias %a, double %beta) {
entry:
tail call void @cblas_dgemv(i32 102, i32 111, i32 2, i32 2, double 3.000000e+00, double* %a, i32 2, double* %x, i32 1, double %beta, double* %y, i32 1)
ret void
}
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
declare void @cblas_dgemv(i32, i32, i32, i32, double, double*, i32, double*, i32, double, double*, i32)
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
define i32 @main() {
entry:
%a = alloca [4 x double], align 16
%d_a = alloca [4 x double], align 16
%x = alloca [2 x double], align 16
%d_x = alloca [2 x double], align 16
%y = alloca [3 x double], align 16
%d_y = alloca [3 x double], align 16
%0 = bitcast [4 x double]* %a to i8*
call void @llvm.lifetime.start.p0i8(i64 32, i8* nonnull %0)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %0, i8* align 16 bitcast ([4 x double]* @__const.main.a to i8*), i64 32, i1 false)
%1 = bitcast [4 x double]* %d_a to i8*
call void @llvm.lifetime.start.p0i8(i64 32, i8* nonnull %1)
call void @llvm.memset.p0i8.i64(i8* nonnull align 16 %1, i8 0, i64 32, i1 false)
%2 = bitcast [2 x double]* %x to i8*
call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %2)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %2, i8* align 16 bitcast ([2 x double]* @__const.main.x to i8*), i64 16, i1 false)
%3 = bitcast [2 x double]* %d_x to i8*
call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %3)
call void @llvm.memset.p0i8.i64(i8* nonnull align 16 %3, i8 0, i64 16, i1 false)
%4 = bitcast [3 x double]* %y to i8*
call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %4)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %4, i8* align 16 bitcast ([3 x double]* @__const.main.y to i8*), i64 24, i1 false)
%5 = bitcast [3 x double]* %d_y to i8*
call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %5)
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 16 %5, i8* align 16 bitcast ([3 x double]* @__const.main.d_y to i8*), i64 24, i1 false)
%arraydecay = getelementptr inbounds [2 x double], [2 x double]* %x, i64 0, i64 0
%arraydecay1 = getelementptr inbounds [2 x double], [2 x double]* %d_x, i64 0, i64 0
%arraydecay2 = getelementptr inbounds [3 x double], [3 x double]* %y, i64 0, i64 0
%arraydecay3 = getelementptr inbounds [3 x double], [3 x double]* %d_y, i64 0, i64 0
%arraydecay4 = getelementptr inbounds [4 x double], [4 x double]* %a, i64 0, i64 0
%arraydecay5 = getelementptr inbounds [4 x double], [4 x double]* %d_a, i64 0, i64 0
%call = call double @__enzyme_autodiff(i8* bitcast (void (double*, double*, double*, double)* @f to i8*), double* nonnull %arraydecay, double* nonnull %arraydecay1, double* nonnull %arraydecay2, double* nonnull %arraydecay3, double* nonnull %arraydecay4, double* nonnull %arraydecay5, double 2.000000e+00)
call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %5)
call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %4)
call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %3)
call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %2)
call void @llvm.lifetime.end.p0i8(i64 32, i8* nonnull %1)
call void @llvm.lifetime.end.p0i8(i64 32, i8* nonnull %0)
ret i32 0
}
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1)
declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1)
declare double @__enzyme_autodiff(i8*, double*, double*, double*, double*, double*, double*, double)
;CHECK:define internal { double } @diffef(double* noalias %x, double* %"x'", double* noalias %y, double* %"y'", double* noalias %a, double* %"a'", double %beta) {
;CHECK-NEXT:entry:
;CHECK-NEXT: tail call void @cblas_dgemv(i32 102, i32 111, i32 2, i32 2, double 3.000000e+00, double* %a, i32 2, double* %x, i32 1, double %beta, double* %y, i32 1)
;CHECK-NEXT: call void @cblas_dscal(i32 2, double %beta, double* %"y'", i32 1)
;CHECK-NEXT: call void @cblas_dgemv(i32 102, i32 112, i32 2, i32 2, double 3.000000e+00, double* %a, i32 2, double* %"y'", i32 1, double 1.000000e+00, double* %"x'", i32 1)
;CHECK-NEXT: call void @cblas_dger(i32 102, i32 2, i32 2, double 3.000000e+00, double* %"y'", i32 1, double* %"x'", i32 1, double* %a, i32 2)
;CHECK-NEXT: %0 = call fast double @cblas_ddot(i32 2, double* nocapture readonly %"y'", i32 1, double* nocapture readonly %y, i32 1)
;CHECK-NEXT: %1 = insertvalue { double } undef, double %0, 0
;CHECK-NEXT: ret { double } %1
;CHECK-NEXT:}
Loading

0 comments on commit 6e25212

Please sign in to comment.