@@ -17,11 +17,12 @@ use std::autodiff::autodiff_forward;
1717#[ autodiff_forward( d_square2, 4 , Dual , DualOnly ) ]
1818#[ autodiff_forward( d_square1, 4 , Dual , Dual ) ]
1919#[ no_mangle]
20+ #[ inline( never) ]
2021fn square ( x : & f32 ) -> f32 {
2122 x * x
2223}
2324
24- // d_sqaure2
25+ // d_square2
2526// CHECK: define internal fastcc [4 x float] @fwddiffe4square(float %x.0.val, [4 x ptr] %"x'")
2627// CHECK-NEXT: start:
2728// CHECK-NEXT: %0 = extractvalue [4 x ptr] %"x'", 0
@@ -32,24 +33,20 @@ fn square(x: &f32) -> f32 {
3233// CHECK-NEXT: %"_2'ipl2" = load float, ptr %2, align 4
3334// CHECK-NEXT: %3 = extractvalue [4 x ptr] %"x'", 3
3435// CHECK-NEXT: %"_2'ipl3" = load float, ptr %3, align 4
35- // CHECK-NEXT: %4 = insertelement <4 x float> poison, float %"_2'ipl", i64 0
36- // CHECK-NEXT: %5 = insertelement <4 x float> %4, float %"_2'ipl1", i64 1
37- // CHECK-NEXT: %6 = insertelement <4 x float> %5, float %"_2'ipl2", i64 2
38- // CHECK-NEXT: %7 = insertelement <4 x float> %6, float %"_2'ipl3", i64 3
39- // CHECK-NEXT: %8 = fadd fast <4 x float> %7, %7
40- // CHECK-NEXT: %9 = insertelement <4 x float> poison, float %x.0.val, i64 0
41- // CHECK-NEXT: %10 = shufflevector <4 x float> %9, <4 x float> poison, <4 x i32> zeroinitializer
42- // CHECK-NEXT: %11 = fmul fast <4 x float> %8, %10
43- // CHECK-NEXT: %12 = extractelement <4 x float> %11, i64 0
44- // CHECK-NEXT: %13 = insertvalue [4 x float] undef, float %12, 0
45- // CHECK-NEXT: %14 = extractelement <4 x float> %11, i64 1
46- // CHECK-NEXT: %15 = insertvalue [4 x float] %13, float %14, 1
47- // CHECK-NEXT: %16 = extractelement <4 x float> %11, i64 2
48- // CHECK-NEXT: %17 = insertvalue [4 x float] %15, float %16, 2
49- // CHECK-NEXT: %18 = extractelement <4 x float> %11, i64 3
50- // CHECK-NEXT: %19 = insertvalue [4 x float] %17, float %18, 3
51- // CHECK-NEXT: ret [4 x float] %19
52- // CHECK-NEXT: }
36+ // CHECK-NEXT: %4 = fmul float %"_2'ipl", 2.000000e+00
37+ // CHECK-NEXT: %5 = fmul fast float %4, %x.0.val
38+ // CHECK-NEXT: %6 = insertvalue [4 x float] undef, float %5, 0
39+ // CHECK-NEXT: %7 = fmul float %"_2'ipl1", 2.000000e+00
40+ // CHECK-NEXT: %8 = fmul fast float %7, %x.0.val
41+ // CHECK-NEXT: %9 = insertvalue [4 x float] %6, float %8, 1
42+ // CHECK-NEXT: %10 = fmul float %"_2'ipl2", 2.000000e+00
43+ // CHECK-NEXT: %11 = fmul fast float %10, %x.0.val
44+ // CHECK-NEXT: %12 = insertvalue [4 x float] %9, float %11, 2
45+ // CHECK-NEXT: %13 = fmul float %"_2'ipl3", 2.000000e+00
46+ // CHECK-NEXT: %14 = fmul fast float %13, %x.0.val
47+ // CHECK-NEXT: %15 = insertvalue [4 x float] %12, float %14, 3
48+ // CHECK-NEXT: ret [4 x float] %15
49+ // CHECK-NEXT: }
5350
5451// d_square3, the extra float is the original return value (x * x)
5552// CHECK: define internal fastcc { float, [4 x float] } @fwddiffe4square.1(float %x.0.val, [4 x ptr] %"x'")
@@ -63,26 +60,22 @@ fn square(x: &f32) -> f32 {
6360// CHECK-NEXT: %3 = extractvalue [4 x ptr] %"x'", 3
6461// CHECK-NEXT: %"_2'ipl3" = load float, ptr %3, align 4
6562// CHECK-NEXT: %_0 = fmul float %x.0.val, %x.0.val
66- // CHECK-NEXT: %4 = insertelement <4 x float> poison, float %"_2'ipl", i64 0
67- // CHECK-NEXT: %5 = insertelement <4 x float> %4, float %"_2'ipl1", i64 1
68- // CHECK-NEXT: %6 = insertelement <4 x float> %5, float %"_2'ipl2", i64 2
69- // CHECK-NEXT: %7 = insertelement <4 x float> %6, float %"_2'ipl3", i64 3
70- // CHECK-NEXT: %8 = fadd fast <4 x float> %7, %7
71- // CHECK-NEXT: %9 = insertelement <4 x float> poison, float %x.0.val, i64 0
72- // CHECK-NEXT: %10 = shufflevector <4 x float> %9, <4 x float> poison, <4 x i32> zeroinitializer
73- // CHECK-NEXT: %11 = fmul fast <4 x float> %8, %10
74- // CHECK-NEXT: %12 = extractelement <4 x float> %11, i64 0
75- // CHECK-NEXT: %13 = insertvalue [4 x float] undef, float %12, 0
76- // CHECK-NEXT: %14 = extractelement <4 x float> %11, i64 1
77- // CHECK-NEXT: %15 = insertvalue [4 x float] %13, float %14, 1
78- // CHECK-NEXT: %16 = extractelement <4 x float> %11, i64 2
79- // CHECK-NEXT: %17 = insertvalue [4 x float] %15, float %16, 2
80- // CHECK-NEXT: %18 = extractelement <4 x float> %11, i64 3
81- // CHECK-NEXT: %19 = insertvalue [4 x float] %17, float %18, 3
82- // CHECK-NEXT: %20 = insertvalue { float, [4 x float] } undef, float %_0, 0
83- // CHECK-NEXT: %21 = insertvalue { float, [4 x float] } %20, [4 x float] %19, 1
84- // CHECK-NEXT: ret { float, [4 x float] } %21
85- // CHECK-NEXT: }
63+ // CHECK-NEXT: %4 = fmul float %"_2'ipl", 2.000000e+00
64+ // CHECK-NEXT: %5 = fmul fast float %4, %x.0.val
65+ // CHECK-NEXT: %6 = insertvalue [4 x float] undef, float %5, 0
66+ // CHECK-NEXT: %7 = fmul float %"_2'ipl1", 2.000000e+00
67+ // CHECK-NEXT: %8 = fmul fast float %7, %x.0.val
68+ // CHECK-NEXT: %9 = insertvalue [4 x float] %6, float %8, 1
69+ // CHECK-NEXT: %10 = fmul float %"_2'ipl2", 2.000000e+00
70+ // CHECK-NEXT: %11 = fmul fast float %10, %x.0.val
71+ // CHECK-NEXT: %12 = insertvalue [4 x float] %9, float %11, 2
72+ // CHECK-NEXT: %13 = fmul float %"_2'ipl3", 2.000000e+00
73+ // CHECK-NEXT: %14 = fmul fast float %13, %x.0.val
74+ // CHECK-NEXT: %15 = insertvalue [4 x float] %12, float %14, 3
75+ // CHECK-NEXT: %16 = insertvalue { float, [4 x float] } undef, float %_0, 0
76+ // CHECK-NEXT: %17 = insertvalue { float, [4 x float] } %16, [4 x float] %15, 1
77+ // CHECK-NEXT: ret { float, [4 x float] } %17
78+ // CHECK-NEXT: }
8679
8780fn main ( ) {
8881 let x = std:: hint:: black_box ( 3.0 ) ;
0 commit comments