; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc < %s -mtriple=aarch64-unknown-unknown -global-isel | FileCheck %s --check-prefixes=GISEL ; fold (sub -1, a) -> (xor a, -1) define i64 @sub_minus_one(i64 %a) { ; GISEL-LABEL: sub_minus_one: ; GISEL: // %bb.0: // %entry ; GISEL-NEXT: mvn x0, x0 ; GISEL-NEXT: ret entry: %sub1 = sub i64 -1, %a ret i64 %sub1 } define <8 x i16> @sub_minus_one_vec(<8 x i16> %x) { ; GISEL-LABEL: sub_minus_one_vec: ; GISEL: // %bb.0: ; GISEL-NEXT: mvn v0.16b, v0.16b ; GISEL-NEXT: ret %sub1 = sub <8 x i16> , %x ret <8 x i16> %sub1 } define i64 @sub_one_from_sub(i64 %a, i64 %b) { ; GISEL-LABEL: sub_one_from_sub: ; GISEL: // %bb.0: // %entry ; GISEL-NEXT: mvn x8, x1 ; GISEL-NEXT: add x0, x8, x0 ; GISEL-NEXT: ret entry: ; fold (A - B) - 1 -> add (xor B, -1), A %sub1 = sub i64 %a, %b %sub2 = sub i64 %sub1, 1 ret i64 %sub2 } ; fold (A - B) - 1 -> add (xor B, -1), A define i64 @sub_one_from_sub_one_use(i64 %a, i64 %b) { ; GISEL-LABEL: sub_one_from_sub_one_use: ; GISEL: // %bb.0: // %entry ; GISEL-NEXT: sub x8, x0, x1 ; GISEL-NEXT: sub x9, x8, #1 ; GISEL-NEXT: mul x0, x8, x9 ; GISEL-NEXT: ret entry: ; fold (A - (0 - B)) to (A + B) %sub1 = sub i64 %a, %b %sub2 = sub i64 %sub1, 1 %mul = mul i64 %sub1, %sub2 ret i64 %mul }