Skip to content

Commit 117ef01

Browse files
committed
usubo
1 parent f9c2565 commit 117ef01

29 files changed

+1968
-1679
lines changed

llvm/include/llvm/CodeGen/TargetLowering.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3459,19 +3459,14 @@ class LLVM_ABI TargetLoweringBase {
34593459
if (isOperationLegal(Opcode, VT))
34603460
return true;
34613461

3462-
// TODO: The default logic is inherited from code in CodeGenPrepare.
3463-
// The opcode should not make a difference by default?
3464-
if (Opcode != ISD::UADDO)
3465-
return false;
3466-
34673462
// Allow the transform as long as we have an integer type that is not
34683463
// obviously illegal and unsupported and if the math result is used
34693464
// besides the overflow check. On some targets (e.g. SPARC), it is
34703465
// not profitable to form on overflow op if the math result has no
34713466
// concrete users.
34723467
if (VT.isVector())
34733468
return false;
3474-
return MathUsed && (VT.isSimple() || !isOperationExpand(Opcode, VT));
3469+
return MathUsed && (isTypeLegal(VT) || !isOperationExpand(Opcode, VT));
34753470
}
34763471

34773472
// Return true if it is profitable to use a scalar input to a BUILD_VECTOR

llvm/lib/Target/AMDGPU/AMDGPUISelLowering.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,15 @@ class AMDGPUTargetLowering : public TargetLowering {
295295
bool isFsqrtCheap(SDValue Operand, SelectionDAG &DAG) const override {
296296
return true;
297297
}
298+
299+
bool shouldFormOverflowOp(unsigned Opcode, EVT VT,
300+
bool MathUsed) const override {
301+
if (isOperationLegal(Opcode, VT))
302+
return true;
303+
304+
return MathUsed && (VT.isSimple() || !isOperationExpand(Opcode, VT));
305+
}
306+
298307
SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
299308
int &RefinementSteps, bool &UseOneConstNR,
300309
bool Reciprocal) const override;

llvm/lib/Target/ARM/ARMISelLowering.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,6 @@ class VectorType;
641641

642642
bool shouldFormOverflowOp(unsigned Opcode, EVT VT,
643643
bool MathUsed) const override {
644-
// Using overflow ops for overflow checks only should beneficial on ARM.
645644
return TargetLowering::shouldFormOverflowOp(Opcode, VT, true);
646645
}
647646

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3405,10 +3405,7 @@ bool X86TargetLowering::shouldScalarizeBinop(SDValue VecOp) const {
34053405

34063406
bool X86TargetLowering::shouldFormOverflowOp(unsigned Opcode, EVT VT,
34073407
bool) const {
3408-
// TODO: Allow vectors?
3409-
if (VT.isVector())
3410-
return false;
3411-
return VT.isSimple() || !isOperationExpand(Opcode, VT);
3408+
return TargetLowering::shouldFormOverflowOp(Opcode, VT, true);
34123409
}
34133410

34143411
bool X86TargetLowering::isCheapToSpeculateCttz(Type *Ty) const {

llvm/test/CodeGen/AArch64/abdu-neg.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ define i64 @abd_cmp_i64(i64 %a, i64 %b) nounwind {
355355
; CHECK-LABEL: abd_cmp_i64:
356356
; CHECK: // %bb.0:
357357
; CHECK-NEXT: subs x8, x0, x1
358-
; CHECK-NEXT: cneg x0, x8, hs
358+
; CHECK-NEXT: cneg x0, x8, hi
359359
; CHECK-NEXT: ret
360360
%cmp = icmp ult i64 %a, %b
361361
%ab = sub i64 %a, %b

llvm/test/CodeGen/AArch64/arm64-srl-and.ll

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,12 @@ define i32 @srl_and() {
99
; CHECK-LABEL: srl_and:
1010
; CHECK: // %bb.0: // %entry
1111
; CHECK-NEXT: adrp x8, :got:g
12-
; CHECK-NEXT: mov w9, #50
1312
; CHECK-NEXT: ldr x8, [x8, :got_lo12:g]
1413
; CHECK-NEXT: ldrh w8, [x8]
15-
; CHECK-NEXT: eor w8, w8, w9
16-
; CHECK-NEXT: mov w9, #65535
17-
; CHECK-NEXT: add w8, w8, w9
18-
; CHECK-NEXT: and w0, w8, w8, lsr #16
14+
; CHECK-NEXT: cmp w8, #50
15+
; CHECK-NEXT: sub w8, w8, #1
16+
; CHECK-NEXT: cset w9, ne
17+
; CHECK-NEXT: and w0, w8, w9
1918
; CHECK-NEXT: ret
2019
entry:
2120
%0 = load i16, ptr @g, align 4

llvm/test/CodeGen/AArch64/atomicrmw-uinc-udec-wrap.ll

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,12 @@ define i32 @atomicrmw_udec_wrap_i32(ptr %ptr, i32 %val) {
113113
; CHECK-NEXT: .LBB6_1: // %atomicrmw.start
114114
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
115115
; CHECK-NEXT: ldaxr w8, [x0]
116+
; CHECK-NEXT: subs w9, w8, #1
117+
; CHECK-NEXT: cset w10, lo
116118
; CHECK-NEXT: cmp w8, w1
117-
; CHECK-NEXT: sub w9, w8, #1
118-
; CHECK-NEXT: ccmp w8, #0, #4, ls
119-
; CHECK-NEXT: csel w9, w1, w9, eq
119+
; CHECK-NEXT: csinc w10, w10, wzr, ls
120+
; CHECK-NEXT: cmp w10, #0
121+
; CHECK-NEXT: csel w9, w1, w9, ne
120122
; CHECK-NEXT: stlxr w10, w9, [x0]
121123
; CHECK-NEXT: cbnz w10, .LBB6_1
122124
; CHECK-NEXT: // %bb.2: // %atomicrmw.end
@@ -133,10 +135,12 @@ define i64 @atomicrmw_udec_wrap_i64(ptr %ptr, i64 %val) {
133135
; CHECK-NEXT: .LBB7_1: // %atomicrmw.start
134136
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
135137
; CHECK-NEXT: ldaxr x0, [x8]
138+
; CHECK-NEXT: subs x9, x0, #1
139+
; CHECK-NEXT: cset w10, lo
136140
; CHECK-NEXT: cmp x0, x1
137-
; CHECK-NEXT: sub x9, x0, #1
138-
; CHECK-NEXT: ccmp x0, #0, #4, ls
139-
; CHECK-NEXT: csel x9, x1, x9, eq
141+
; CHECK-NEXT: csinc w10, w10, wzr, ls
142+
; CHECK-NEXT: cmp w10, #0
143+
; CHECK-NEXT: csel x9, x1, x9, ne
140144
; CHECK-NEXT: stlxr w10, x9, [x8]
141145
; CHECK-NEXT: cbnz w10, .LBB7_1
142146
; CHECK-NEXT: // %bb.2: // %atomicrmw.end

llvm/test/CodeGen/AArch64/cgp-usubo.ll

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,9 @@ define i1 @usubo_ugt_constant_op1_i8(i8 %x, ptr %p) nounwind {
108108
define i1 @usubo_eq_constant1_op1_i32(i32 %x, ptr %p) nounwind {
109109
; CHECK-LABEL: usubo_eq_constant1_op1_i32:
110110
; CHECK: // %bb.0:
111-
; CHECK-NEXT: cmp w0, #0
112-
; CHECK-NEXT: sub w9, w0, #1
113-
; CHECK-NEXT: cset w8, eq
114-
; CHECK-NEXT: str w9, [x1]
115-
; CHECK-NEXT: mov w0, w8
111+
; CHECK-NEXT: subs w8, w0, #1
112+
; CHECK-NEXT: cset w0, lo
113+
; CHECK-NEXT: str w8, [x1]
116114
; CHECK-NEXT: ret
117115
%s = add i32 %x, -1
118116
%ov = icmp eq i32 %x, 0

llvm/test/CodeGen/AArch64/cmpxchg-idioms.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -192,12 +192,12 @@ define i1 @test_conditional2(i32 %a, i32 %b, ptr %c) {
192192
; CHECK-NEXT: mov w22, #2 ; =0x2
193193
; CHECK-NEXT: LBB3_5: ; %for.cond
194194
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
195-
; CHECK-NEXT: cbz w22, LBB3_8
195+
; CHECK-NEXT: subs w22, w22, #1
196+
; CHECK-NEXT: b.lo LBB3_8
196197
; CHECK-NEXT: ; %bb.6: ; %for.body
197198
; CHECK-NEXT: ; in Loop: Header=BB3_5 Depth=1
198-
; CHECK-NEXT: sub w22, w22, #1
199-
; CHECK-NEXT: orr w9, w21, w20
200199
; CHECK-NEXT: ldr w10, [x19, w22, sxtw #2]
200+
; CHECK-NEXT: orr w9, w21, w20
201201
; CHECK-NEXT: cmp w9, w10
202202
; CHECK-NEXT: b.eq LBB3_5
203203
; CHECK-NEXT: ; %bb.7: ; %if.then
@@ -238,12 +238,12 @@ define i1 @test_conditional2(i32 %a, i32 %b, ptr %c) {
238238
; OUTLINE-ATOMICS-NEXT: cset w8, eq
239239
; OUTLINE-ATOMICS-NEXT: LBB3_1: ; %for.cond
240240
; OUTLINE-ATOMICS-NEXT: ; =>This Inner Loop Header: Depth=1
241-
; OUTLINE-ATOMICS-NEXT: cbz w22, LBB3_4
241+
; OUTLINE-ATOMICS-NEXT: subs w22, w22, #1
242+
; OUTLINE-ATOMICS-NEXT: b.lo LBB3_4
242243
; OUTLINE-ATOMICS-NEXT: ; %bb.2: ; %for.body
243244
; OUTLINE-ATOMICS-NEXT: ; in Loop: Header=BB3_1 Depth=1
244-
; OUTLINE-ATOMICS-NEXT: sub w22, w22, #1
245-
; OUTLINE-ATOMICS-NEXT: orr w9, w21, w20
246245
; OUTLINE-ATOMICS-NEXT: ldr w10, [x19, w22, sxtw #2]
246+
; OUTLINE-ATOMICS-NEXT: orr w9, w21, w20
247247
; OUTLINE-ATOMICS-NEXT: cmp w9, w10
248248
; OUTLINE-ATOMICS-NEXT: b.eq LBB3_1
249249
; OUTLINE-ATOMICS-NEXT: ; %bb.3: ; %if.then

llvm/test/CodeGen/AArch64/local-bounds-single-trap.ll

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,22 @@ define dso_local void @f8(i32 noundef %i, i32 noundef %k) #0 {
1717
; CHECK-ASM-NEXT: .cfi_remember_state
1818
; CHECK-ASM-NEXT: // kill: def $w0 killed $w0 def $x0
1919
; CHECK-ASM-NEXT: sxtw x8, w0
20+
; CHECK-ASM-NEXT: mov w9, #10 // =0xa
2021
; CHECK-ASM-NEXT: stp w1, w0, [sp, #8]
21-
; CHECK-ASM-NEXT: cmp x8, #10
22-
; CHECK-ASM-NEXT: b.hi .LBB0_5
22+
; CHECK-ASM-NEXT: subs x9, x9, x8
23+
; CHECK-ASM-NEXT: b.lo .LBB0_5
2324
; CHECK-ASM-NEXT: // %bb.1: // %entry
24-
; CHECK-ASM-NEXT: mov w9, #10 // =0xa
25-
; CHECK-ASM-NEXT: sub x9, x9, x8
2625
; CHECK-ASM-NEXT: cbz x9, .LBB0_5
2726
; CHECK-ASM-NEXT: // %bb.2:
2827
; CHECK-ASM-NEXT: ldrsw x9, [sp, #8]
28+
; CHECK-ASM-NEXT: mov w10, #10 // =0xa
29+
; CHECK-ASM-NEXT: subs x11, x10, x9
2930
; CHECK-ASM-NEXT: adrp x10, .L_MergedGlobals
3031
; CHECK-ASM-NEXT: add x10, x10, :lo12:.L_MergedGlobals
3132
; CHECK-ASM-NEXT: strb wzr, [x10, x8]
32-
; CHECK-ASM-NEXT: cmp x9, #10
33-
; CHECK-ASM-NEXT: b.hi .LBB0_6
33+
; CHECK-ASM-NEXT: b.lo .LBB0_6
3434
; CHECK-ASM-NEXT: // %bb.3:
35-
; CHECK-ASM-NEXT: mov w8, #10 // =0xa
36-
; CHECK-ASM-NEXT: sub x8, x8, x9
37-
; CHECK-ASM-NEXT: cbz x8, .LBB0_6
35+
; CHECK-ASM-NEXT: cbz x11, .LBB0_6
3836
; CHECK-ASM-NEXT: // %bb.4:
3937
; CHECK-ASM-NEXT: add x8, x10, x9
4038
; CHECK-ASM-NEXT: strb wzr, [x8, #10]

0 commit comments

Comments
 (0)