]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/llvm/patches/patch-r263313-llvm-r203311-fix-sse1-oom.diff
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / llvm / patches / patch-r263313-llvm-r203311-fix-sse1-oom.diff
1 Pull in r203311 from upstream llvm trunk (by Arnold Schwaighofer):
2
3   ISel: Make VSELECT selection terminate in cases where the condition type has to
4   be split and the result type widened.
5
6   When the condition of a vselect has to be split it makes no sense widening the
7   vselect and thereby widening the condition. We end up in an endless loop of
8   widening (vselect result type) and splitting (condition mask type) doing this.
9   Instead, split both the condition and the vselect and widen the result.
10
11   I ran this over the test suite with i686 and mattr=+sse and saw no regressions.
12
13   Fixes PR18036.
14
15 Introduced here: http://svnweb.freebsd.org/changeset/base/263313
16
17 Index: test/CodeGen/X86/sse1.ll
18 ===================================================================
19 --- test/CodeGen/X86/sse1.ll
20 +++ test/CodeGen/X86/sse1.ll
21 @@ -43,3 +43,17 @@ entry:
22  ; CHECK-NOT: shufps    $16
23  ; CHECK: ret
24  }
25 +
26 +; We used to get stuck in type legalization for this example when lowering the
27 +; vselect. With SSE1 v4f32 is a legal type but v4i1 (or any vector integer type)
28 +; is not. We used to ping pong between splitting the vselect for the v4i
29 +; condition operand and widening the resulting vselect for the v4f32 result.
30 +; PR18036
31 +
32 +; CHECK-LABEL: vselect
33 +define <4 x float> @vselect(<4 x float>*%p, <4 x i32> %q) {
34 +entry:
35 +  %a1 = icmp eq <4 x i32> %q, zeroinitializer
36 +  %a14 = select <4 x i1> %a1, <4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+0> , <4 x float> zeroinitializer
37 +  ret <4 x float> %a14
38 +}
39 Index: lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
40 ===================================================================
41 --- lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
42 +++ lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
43 @@ -2180,6 +2180,17 @@ SDValue DAGTypeLegalizer::WidenVecRes_SELECT(SDNod
44      if (getTypeAction(CondVT) == TargetLowering::TypeWidenVector)
45        Cond1 = GetWidenedVector(Cond1);
46  
47 +    // If we have to split the condition there is no point in widening the
48 +    // select. This would result in an cycle of widening the select ->
49 +    // widening the condition operand -> splitting the condition operand ->
50 +    // splitting the select -> widening the select. Instead split this select
51 +    // further and widen the resulting type.
52 +    if (getTypeAction(CondVT) == TargetLowering::TypeSplitVector) {
53 +      SDValue SplitSelect = SplitVecOp_VSELECT(N, 0);
54 +      SDValue Res = ModifyToType(SplitSelect, WidenVT);
55 +      return Res;
56 +    }
57 +
58      if (Cond1.getValueType() != CondWidenVT)
59        Cond1 = ModifyToType(Cond1, CondWidenVT);
60    }