|
| 1 | +; RUN: %opt < %s %loadEnzyme -print-type-analysis -type-analysis-func=f -enzyme-strict-aliasing=0 -o /dev/null | FileCheck %s |
| 2 | + |
| 3 | +source_filename = "<source>" |
| 4 | +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
| 5 | +target triple = "x86_64-unknown-linux-gnu" |
| 6 | + |
| 7 | +%class.Testing = type { %struct.Header, %struct.Header } |
| 8 | +%struct.Header = type { %struct.Base, i32 } |
| 9 | +%struct.Base = type { %struct.Base*, %struct.Base* } |
| 10 | + |
| 11 | +define dso_local void @f(%class.Testing* %arg) { |
| 12 | +bb: |
| 13 | + %i = getelementptr inbounds %class.Testing, %class.Testing* %arg, i64 0, i32 0, i32 0 |
| 14 | + %i1 = getelementptr inbounds %class.Testing, %class.Testing* %arg, i64 0, i32 0, i32 0, i32 0 |
| 15 | + %i13 = getelementptr inbounds %class.Testing, %class.Testing* %arg, i64 0, i32 1, i32 0 |
| 16 | + %i14 = getelementptr inbounds %class.Testing, %class.Testing* %arg, i64 0, i32 1, i32 0, i32 0 |
| 17 | + br label %bb2 |
| 18 | + |
| 19 | +bb2: ; preds = %bb2, %bb |
| 20 | + %i3 = phi %struct.Base** [ %i1, %bb ], [ %i7, %bb2 ] |
| 21 | + %i4 = phi %struct.Base* [ %i, %bb ], [ %i5, %bb2 ] |
| 22 | + %i5 = load %struct.Base*, %struct.Base** %i3, align 8, !tbaa !3 |
| 23 | + %i6 = icmp eq %struct.Base* %i5, null |
| 24 | + %i7 = getelementptr inbounds %struct.Base, %struct.Base* %i5, i64 0, i32 1 |
| 25 | + br i1 %i6, label %bb8, label %bb2, !llvm.loop !7 |
| 26 | + |
| 27 | +bb8: ; preds = %bb2 |
| 28 | + %i9 = getelementptr inbounds %struct.Base, %struct.Base* %i4, i64 1, i32 1 |
| 29 | + %i10 = bitcast %struct.Base** %i9 to double* |
| 30 | + %i11 = load double, double* %i10, align 8, !tbaa !9 |
| 31 | + br label %bb15 |
| 32 | + |
| 33 | +bb15: ; preds = %bb15, %bb8 |
| 34 | + %i16 = phi %struct.Base** [ %i14, %bb8 ], [ %i20, %bb15 ] |
| 35 | + %i17 = phi %struct.Base* [ %i13, %bb8 ], [ %i18, %bb15 ] |
| 36 | + %i18 = load %struct.Base*, %struct.Base** %i16, align 8, !tbaa !3 |
| 37 | + %i19 = icmp eq %struct.Base* %i18, null |
| 38 | + %i20 = getelementptr inbounds %struct.Base, %struct.Base* %i18, i64 0, i32 1 |
| 39 | + br i1 %i19, label %bb21, label %bb15, !llvm.loop !7 |
| 40 | + |
| 41 | +bb21: ; preds = %bb15 |
| 42 | + %i22 = getelementptr inbounds %struct.Base, %struct.Base* %i17, i64 1, i32 1 |
| 43 | + %i23 = bitcast %struct.Base** %i22 to double* |
| 44 | + %i24 = load double, double* %i23, align 8, !tbaa !9 |
| 45 | + tail call void @_Z5printdd(double %i11, double %i24) |
| 46 | + ret void |
| 47 | +} |
| 48 | + |
| 49 | +declare void @_Z5printdd(double, double) |
| 50 | + |
| 51 | +!llvm.module.flags = !{!0, !1} |
| 52 | +!llvm.ident = !{!2} |
| 53 | + |
| 54 | +!0 = !{i32 7, !"Dwarf Version", i32 4} |
| 55 | +!1 = !{i32 1, !"wchar_size", i32 4} |
| 56 | +!2 = !{!"clang version 12.0.1 (https://github.com/llvm/llvm-project.git fed41342a82f5a3a9201819a82bf7a48313e296b)"} |
| 57 | +!3 = !{!4, !4, i64 0} |
| 58 | +!4 = !{!"any pointer", !5, i64 0} |
| 59 | +!5 = !{!"omnipotent char", !6, i64 0} |
| 60 | +!6 = !{!"Simple C++ TBAA"} |
| 61 | +!7 = distinct !{!7, !8} |
| 62 | +!8 = !{!"llvm.loop.mustprogress"} |
| 63 | +!9 = !{!10, !10, i64 0} |
| 64 | +!10 = !{!"double", !5, i64 0} |
| 65 | + |
| 66 | +; CHECK: %class.Testing* %arg: {[-1]:Pointer} |
| 67 | +; CHECK-NEXT: bb |
| 68 | +; CHECK-NEXT: %i = getelementptr inbounds %class.Testing, %class.Testing* %arg, i64 0, i32 0, i32 0: {[-1]:Pointer} |
| 69 | +; CHECK-NEXT: %i1 = getelementptr inbounds %class.Testing, %class.Testing* %arg, i64 0, i32 0, i32 0, i32 0: {[-1]:Pointer} |
| 70 | +; CHECK-NEXT: %i13 = getelementptr inbounds %class.Testing, %class.Testing* %arg, i64 0, i32 1, i32 0: {[-1]:Pointer} |
| 71 | +; CHECK-NEXT: %i14 = getelementptr inbounds %class.Testing, %class.Testing* %arg, i64 0, i32 1, i32 0, i32 0: {[-1]:Pointer} |
| 72 | +; CHECK-NEXT: br label %bb2: {} |
| 73 | +; CHECK-NEXT: bb2 |
| 74 | +; CHECK-NEXT: %i3 = phi %struct.Base** [ %i1, %bb ], [ %i7, %bb2 ]: {[-1]:Pointer, [-1,0]:Pointer} |
| 75 | +; CHECK-NEXT: %i4 = phi %struct.Base* [ %i, %bb ], [ %i5, %bb2 ]: {[-1]:Pointer, [-1,24]:Float@double} |
| 76 | +; CHECK-NEXT: %i5 = load %struct.Base*, %struct.Base** %i3, align 8, !tbaa !3: {[-1]:Pointer} |
| 77 | +; CHECK-NEXT: %i6 = icmp eq %struct.Base* %i5, null: {[-1]:Integer} |
| 78 | +; CHECK-NEXT: %i7 = getelementptr inbounds %struct.Base, %struct.Base* %i5, i64 0, i32 1: {[-1]:Pointer} |
| 79 | +; CHECK-NEXT: br i1 %i6, label %bb8, label %bb2, !llvm.loop !7: {} |
| 80 | +; CHECK-NEXT: bb8 |
| 81 | +; CHECK-NEXT: %i9 = getelementptr inbounds %struct.Base, %struct.Base* %i4, i64 1, i32 1: {[-1]:Pointer, [-1,0]:Float@double} |
| 82 | +; CHECK-NEXT: %i10 = bitcast %struct.Base** %i9 to double*: {[-1]:Pointer, [-1,0]:Float@double} |
| 83 | +; CHECK-NEXT: %i11 = load double, double* %i10, align 8, !tbaa !9: {[-1]:Float@double} |
| 84 | +; CHECK-NEXT: br label %bb15: {} |
| 85 | +; CHECK-NEXT: bb15 |
| 86 | +; CHECK-NEXT: %i16 = phi %struct.Base** [ %i14, %bb8 ], [ %i20, %bb15 ]: {[-1]:Pointer, [-1,0]:Pointer} |
| 87 | +; CHECK-NEXT: %i17 = phi %struct.Base* [ %i13, %bb8 ], [ %i18, %bb15 ]: {[-1]:Pointer, [-1,24]:Float@double} |
| 88 | +; CHECK-NEXT: %i18 = load %struct.Base*, %struct.Base** %i16, align 8, !tbaa !3: {[-1]:Pointer} |
| 89 | +; CHECK-NEXT: %i19 = icmp eq %struct.Base* %i18, null: {[-1]:Integer} |
| 90 | +; CHECK-NEXT: %i20 = getelementptr inbounds %struct.Base, %struct.Base* %i18, i64 0, i32 1: {[-1]:Pointer} |
| 91 | +; CHECK-NEXT: br i1 %i19, label %bb21, label %bb15, !llvm.loop !7: {} |
| 92 | +; CHECK-NEXT: bb21 |
| 93 | +; CHECK-NEXT: %i22 = getelementptr inbounds %struct.Base, %struct.Base* %i17, i64 1, i32 1: {[-1]:Pointer, [-1,0]:Float@double} |
| 94 | +; CHECK-NEXT: %i23 = bitcast %struct.Base** %i22 to double*: {[-1]:Pointer, [-1,0]:Float@double} |
| 95 | +; CHECK-NEXT: %i24 = load double, double* %i23, align 8, !tbaa !9: {[-1]:Float@double} |
| 96 | +; CHECK-NEXT: tail call void @_Z5printdd(double %i11, double %i24): {} |
| 97 | +; CHECK-NEXT: ret void: {} |
0 commit comments