[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / PhaseOrdering / fast-reassociate-gvn.ll
blobb9e4ffeb15961d11ddc74cb767d349909dbf626b
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
3 ; Test cases in this file are intended to be run with both reassociate and
4 ; gvn passes enabled.
6 ; Test numbering remains continuous across:
7 ; - InstCombine/fast-basictest.ll
8 ; - PhaseOrdering/fast-basictest.ll
9 ; - PhaseOrdering/fast-reassociate-gvn.ll
10 ; - Reassociate/fast-basictest.ll
12 ; RUN: opt < %s -passes=reassociate,gvn -S | FileCheck %s --check-prefixes=CHECK,REASSOC_AND_GVN --allow-unused-prefixes
13 ; RUN: opt < %s -O2 -S | FileCheck %s --check-prefixes=CHECK,O2 --allow-unused-prefixes
15 @fe = external global float
16 @fa = external global float
17 @fb = external global float
18 @fc = external global float
19 @ff = external global float
21 ; If two sums of the same operands in different order are counted with 'fast'
22 ; flag and then stored to global variables, we can reuse the same value twice.
23 ; Sums:
24 ; - test3: (a+b)+c and (a+c)+b
25 ; - test4: c+(a+b) and (c+a)+b
26 ; - test5: c+(b+a) and (c+a)+b
27 ; TODO: check if 'reassoc' flag is technically enough for this optimization
28 ; (currently the transformation is not done with 'reassoc' only).
30 define void @test3() {
31 ; CHECK-LABEL: @test3(
32 ; CHECK-NEXT:    [[A:%.*]] = load float, ptr @fa, align 4
33 ; CHECK-NEXT:    [[B:%.*]] = load float, ptr @fb, align 4
34 ; CHECK-NEXT:    [[C:%.*]] = load float, ptr @fc, align 4
35 ; CHECK-NEXT:    [[T1:%.*]] = fadd fast float [[B]], [[A]]
36 ; CHECK-NEXT:    [[T2:%.*]] = fadd fast float [[T1]], [[C]]
37 ; CHECK-NEXT:    store float [[T2]], ptr @fe, align 4
38 ; CHECK-NEXT:    store float [[T2]], ptr @ff, align 4
39 ; CHECK-NEXT:    ret void
41   %A = load float, ptr @fa
42   %B = load float, ptr @fb
43   %C = load float, ptr @fc
44   %t1 = fadd fast float %A, %B
45   %t2 = fadd fast float %t1, %C
46   %t3 = fadd fast float %A, %C
47   %t4 = fadd fast float %t3, %B
48   ; e = (a+b)+c;
49   store float %t2, ptr @fe
50   ; f = (a+c)+b
51   store float %t4, ptr @ff
52   ret void
55 define void @test4() {
56 ; CHECK-LABEL: @test4(
57 ; CHECK-NEXT:    [[A:%.*]] = load float, ptr @fa, align 4
58 ; CHECK-NEXT:    [[B:%.*]] = load float, ptr @fb, align 4
59 ; CHECK-NEXT:    [[C:%.*]] = load float, ptr @fc, align 4
60 ; CHECK-NEXT:    [[T1:%.*]] = fadd fast float [[B]], [[A]]
61 ; CHECK-NEXT:    [[T2:%.*]] = fadd fast float [[T1]], [[C]]
62 ; CHECK-NEXT:    store float [[T2]], ptr @fe, align 4
63 ; CHECK-NEXT:    store float [[T2]], ptr @ff, align 4
64 ; CHECK-NEXT:    ret void
66   %A = load float, ptr @fa
67   %B = load float, ptr @fb
68   %C = load float, ptr @fc
69   %t1 = fadd fast float %A, %B
70   %t2 = fadd fast float %C, %t1
71   %t3 = fadd fast float %C, %A
72   %t4 = fadd fast float %t3, %B
73   ; e = c+(a+b)
74   store float %t2, ptr @fe
75   ; f = (c+a)+b
76   store float %t4, ptr @ff
77   ret void
80 define void @test5() {
81 ; CHECK-LABEL: @test5(
82 ; CHECK-NEXT:    [[A:%.*]] = load float, ptr @fa, align 4
83 ; CHECK-NEXT:    [[B:%.*]] = load float, ptr @fb, align 4
84 ; CHECK-NEXT:    [[C:%.*]] = load float, ptr @fc, align 4
85 ; CHECK-NEXT:    [[T1:%.*]] = fadd fast float [[B]], [[A]]
86 ; CHECK-NEXT:    [[T2:%.*]] = fadd fast float [[T1]], [[C]]
87 ; CHECK-NEXT:    store float [[T2]], ptr @fe, align 4
88 ; CHECK-NEXT:    store float [[T2]], ptr @ff, align 4
89 ; CHECK-NEXT:    ret void
91   %A = load float, ptr @fa
92   %B = load float, ptr @fb
93   %C = load float, ptr @fc
94   %t1 = fadd fast float %B, %A
95   %t2 = fadd fast float %C, %t1
96   %t3 = fadd fast float %C, %A
97   %t4 = fadd fast float %t3, %B
98   ; e = c+(b+a)
99   store float %t2, ptr @fe
100   ; f = (c+a)+b
101   store float %t4, ptr @ff
102   ret void