|
| 1 | +; RUN: %opt < %s %loadEnzyme -enzyme -enzyme-preopt=false -mem2reg -instsimplify -simplifycfg -S | FileCheck %s |
| 2 | + |
| 3 | +@g = constant i8* null, align 8 |
| 4 | + |
| 5 | +define void @_Z3barv(void ()** %i2) { |
| 6 | + store void ()* bitcast (i8** @g to void ()*), void ()** %i2, align 8 |
| 7 | + ret void |
| 8 | +} |
| 9 | + |
| 10 | +define double @_Z3fooRd(double* nocapture readonly %arg) { |
| 11 | + %ai2 = alloca void ()*, align 8 |
| 12 | + call void @_Z3barv(void ()** %ai2) |
| 13 | + %a8 = load void ()*, void ()** %ai2, align 8 |
| 14 | + ret double 0.000000e+00 |
| 15 | +} |
| 16 | + |
| 17 | +define void @caller(double* %i, double* %i2) { |
| 18 | + %i6 = call double (...) @__enzyme_autodiff(i8* bitcast (double (double*)* @_Z3fooRd to i8*), double* %i, double* %i2) |
| 19 | + ret void |
| 20 | +} |
| 21 | + |
| 22 | +declare double @__enzyme_autodiff(...) |
| 23 | + |
| 24 | +; CHECK: define internal void @diffe_Z3fooRd(double* nocapture readonly %arg, double* nocapture %"arg'", double %differeturn) |
| 25 | +; CHECK-NEXT: invert: |
| 26 | +; CHECK-NEXT: %"ai2'ipa" = alloca void ()*, align 8 |
| 27 | +; CHECK-NEXT: store void ()* null, void ()** %"ai2'ipa", align 8 |
| 28 | +; CHECK-NEXT: %ai2 = alloca void ()*, align 8 |
| 29 | +; CHECK-NEXT: call void @diffe_Z3barv(void ()** %ai2, void ()** %"ai2'ipa") |
| 30 | +; CHECK-NEXT: ret void |
| 31 | +; CHECK-NEXT: } |
| 32 | + |
| 33 | +; CHECK: define internal void @diffe_Z3barv(void ()** %i2, void ()** %"i2'") |
| 34 | +; CHECK-NEXT: invert: |
| 35 | +; CHECK-NEXT: store void ()* bitcast (i8** @g to void ()*), void ()** %"i2'", align 8 |
| 36 | +; CHECK-NEXT: store void ()* bitcast (i8** @g to void ()*), void ()** %i2, align 8 |
| 37 | +; CHECK-NEXT: ret void |
| 38 | +; CHECK-NEXT: } |
| 39 | + |
0 commit comments