forked from OSchip/llvm-project
[SystemZ] Fix addcarry of usubo (PR42512)
Only custom lower uaddo+addcarry or usubo+subcarry chains and leave mixtures like usubo+addcarry or uaddo+subcarry to the generic legalizer. Otherwise we run into issues because SystemZ uses different CC values for carries and borrows. Fixes https://bugs.llvm.org/show_bug.cgi?id=42512. Differential Revision: https://reviews.llvm.org/D64213 llvm-svn: 365242
This commit is contained in:
parent
e7e23e3e91
commit
a2a09cb606
|
@ -3449,11 +3449,17 @@ SDValue SystemZTargetLowering::lowerADDSUBCARRY(SDValue Op,
|
|||
switch (Op.getOpcode()) {
|
||||
default: llvm_unreachable("Unknown instruction!");
|
||||
case ISD::ADDCARRY:
|
||||
if (Carry.getOpcode() != ISD::UADDO && Carry.getOpcode() != ISD::ADDCARRY)
|
||||
return SDValue();
|
||||
|
||||
BaseOp = SystemZISD::ADDCARRY;
|
||||
CCValid = SystemZ::CCMASK_LOGICAL;
|
||||
CCMask = SystemZ::CCMASK_LOGICAL_CARRY;
|
||||
break;
|
||||
case ISD::SUBCARRY:
|
||||
if (Carry.getOpcode() != ISD::USUBO && Carry.getOpcode() != ISD::SUBCARRY)
|
||||
return SDValue();
|
||||
|
||||
BaseOp = SystemZISD::SUBCARRY;
|
||||
CCValid = SystemZ::CCMASK_LOGICAL;
|
||||
CCMask = SystemZ::CCMASK_LOGICAL_BORROW;
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
||||
|
||||
define i8 @test(i8 %x) {
|
||||
; CHECK-LABEL: test:
|
||||
; CHECK: # %bb.0:
|
||||
; CHECK-NEXT: slgfi %r0, 1
|
||||
; CHECK-NEXT: ipm %r0
|
||||
; CHECK-NEXT: afi %r0, -536870912
|
||||
; CHECK-NEXT: srl %r0, 31
|
||||
; CHECK-NEXT: ar %r2, %r0
|
||||
; CHECK-NEXT: br %r14
|
||||
%usubo = tail call { i64, i1 } @llvm.usub.with.overflow.i64(i64 undef, i64 1)
|
||||
%ov = extractvalue { i64, i1 } %usubo, 1
|
||||
%ovext = zext i1 %ov to i8
|
||||
%ret = add i8 %x, %ovext
|
||||
ret i8 %ret
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind readnone speculatable
|
||||
declare { i64, i1 } @llvm.usub.with.overflow.i64(i64, i64) #0
|
||||
|
||||
attributes #0 = { nounwind readnone speculatable }
|
Loading…
Reference in New Issue