forked from JuliaLang/julia
-
Notifications
You must be signed in to change notification settings - Fork 0
/
llvm-10.0-PPC_SELECT_CC.patch
135 lines (131 loc) · 5 KB
/
llvm-10.0-PPC_SELECT_CC.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
From 4765db99fa35257a4209e2976903d81087a3f0d7 Mon Sep 17 00:00:00 2001
From: Nemanja Ivanovic <[email protected]>
Date: Thu, 9 Apr 2020 13:53:02 -0500
Subject: [PATCH] [PowerPC] Don't assert on SELECT_CC with i1 type
When we try to select a SELECT_CC on Power9, we check if it can be matched to a
SETB instruction. In that function, we assert that the output type is i32/i64.
This is unnecessary as it is perfectly reasonable to have an i1 SELECT_CC.
Change that from an assert to an early exit condition.
Fixes: https://bugs.llvm.org/show_bug.cgi?id=45448
---
llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp | 7 +-
llvm/test/CodeGen/PowerPC/pr45448.ll | 90 +++++++++++++++++++++
2 files changed, 92 insertions(+), 5 deletions(-)
create mode 100644 llvm/test/CodeGen/PowerPC/pr45448.ll
diff --git llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
index 776ec52e260..9230ce4118b 100644
--- llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
+++ llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
@@ -4241,13 +4241,10 @@ static bool mayUseP9Setb(SDNode *N, const ISD::CondCode &CC, SelectionDAG *DAG,
SDValue TrueRes = N->getOperand(2);
SDValue FalseRes = N->getOperand(3);
ConstantSDNode *TrueConst = dyn_cast<ConstantSDNode>(TrueRes);
- if (!TrueConst)
+ if (!TrueConst || (N->getSimpleValueType(0) != MVT::i64 &&
+ N->getSimpleValueType(0) != MVT::i32))
return false;
- assert((N->getSimpleValueType(0) == MVT::i64 ||
- N->getSimpleValueType(0) == MVT::i32) &&
- "Expecting either i64 or i32 here.");
-
// We are looking for any of:
// (select_cc lhs, rhs, 1, (sext (setcc [lr]hs, [lr]hs, cc2)), cc1)
// (select_cc lhs, rhs, -1, (zext (setcc [lr]hs, [lr]hs, cc2)), cc1)
diff --git llvm/test/CodeGen/PowerPC/pr45448.ll llvm/test/CodeGen/PowerPC/pr45448.ll
new file mode 100644
index 00000000000..eb0a61cb075
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/pr45448.ll
@@ -0,0 +1,90 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
+; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | \
+; RUN: FileCheck %s
+define hidden void @julia_tryparse_internal_45896() #0 {
+; CHECK-LABEL: julia_tryparse_internal_45896:
+; CHECK: # %bb.0: # %top
+; CHECK-NEXT: ld r3, 0(r3)
+; CHECK-NEXT: cmpldi r3, 0
+; CHECK-NEXT: beq cr0, .LBB0_3
+; CHECK-NEXT: # %bb.1: # %top
+; CHECK-NEXT: cmpldi r3, 10
+; CHECK-NEXT: beq cr0, .LBB0_4
+; CHECK-NEXT: # %bb.2: # %top
+; CHECK-NEXT: .LBB0_3: # %fail194
+; CHECK-NEXT: .LBB0_4: # %L294
+; CHECK-NEXT: bc 12, 4*cr5+lt, .LBB0_6
+; CHECK-NEXT: # %bb.5: # %L294
+; CHECK-NEXT: bc 4, 4*cr5+lt, .LBB0_7
+; CHECK-NEXT: .LBB0_6: # %L1057.preheader
+; CHECK-NEXT: .LBB0_7: # %L670
+; CHECK-NEXT: lis r5, 4095
+; CHECK-NEXT: ori r5, r5, 65533
+; CHECK-NEXT: sldi r5, r5, 4
+; CHECK-NEXT: cmpdi r3, 0
+; CHECK-NEXT: sradi r4, r3, 63
+; CHECK-NEXT: mulhdu r3, r3, r5
+; CHECK-NEXT: maddld r6, r4, r5, r3
+; CHECK-NEXT: crnor 4*cr5+gt, eq, eq
+; CHECK-NEXT: cmpld r6, r3
+; CHECK-NEXT: mulld r3, r4, r5
+; CHECK-NEXT: cmpldi cr1, r3, 0
+; CHECK-NEXT: crandc 4*cr5+lt, lt, 4*cr1+eq
+; CHECK-NEXT: mulhdu. r3, r4, r5
+; CHECK-NEXT: bc 4, 4*cr5+gt, .LBB0_10
+; CHECK-NEXT: # %bb.8: # %L670
+; CHECK-NEXT: crorc 4*cr5+lt, 4*cr5+lt, eq
+; CHECK-NEXT: bc 4, 4*cr5+lt, .LBB0_10
+; CHECK-NEXT: # %bb.9: # %L917
+; CHECK-NEXT: .LBB0_10: # %L994
+top:
+ %0 = load i64, i64* undef, align 8
+ %1 = icmp ne i64 %0, 0
+ %2 = sext i64 %0 to i128
+ switch i64 %0, label %pass195 [
+ i64 10, label %L294
+ i64 16, label %L294.fold.split
+ i64 0, label %fail194
+ ]
+
+L294.fold.split: ; preds = %top
+ unreachable
+
+L294: ; preds = %top
+ %3 = add nsw i32 0, -48
+ %4 = zext i32 %3 to i128
+ %5 = add i128 %4, 0
+ switch i32 undef, label %L670 [
+ i32 -1031471104, label %L1057.preheader
+ i32 536870912, label %L1057.preheader
+ ]
+
+L670: ; preds = %L294
+ br label %L898
+
+L1057.preheader: ; preds = %L294, %L294
+ unreachable
+
+L898: ; preds = %L670
+ %umul = call { i128, i1 } @llvm.umul.with.overflow.i128(i128 %2, i128 %5)
+ %umul.ov = extractvalue { i128, i1 } %umul, 1
+ %value_phi102 = and i1 %1, %umul.ov
+ %6 = or i1 %value_phi102, false
+ br i1 %6, label %L917, label %L994
+
+L917: ; preds = %L898
+ unreachable
+
+L994: ; preds = %L898
+ unreachable
+
+fail194: ; preds = %top
+ unreachable
+
+pass195: ; preds = %top
+ unreachable
+}
+
+; Function Attrs: nounwind readnone speculatable willreturn
+declare { i128, i1 } @llvm.umul.with.overflow.i128(i128, i128) #1
--
2.26.0