diff options
| -rw-r--r-- | llvm/test/Transforms/InstCombine/add.ll | 27 | 
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/add.ll b/llvm/test/Transforms/InstCombine/add.ll index abf81a58c30..a6a305bd41b 100644 --- a/llvm/test/Transforms/InstCombine/add.ll +++ b/llvm/test/Transforms/InstCombine/add.ll @@ -947,3 +947,30 @@ define i32 @add_not_increment_commuted(i32 %A, i32 %B) {    ret i32 %E  } +; E = (A + ~B) + 1 = A - B +define i32 @add_to_sub(i32 %A, i32 %B) { +; CHECK-LABEL: @add_to_sub( +; CHECK-NEXT:    [[C:%.*]] = xor i32 [[B:%.*]], -1 +; CHECK-NEXT:    [[D:%.*]] = add i32 [[C]], [[A:%.*]] +; CHECK-NEXT:    [[E:%.*]] = add i32 [[D]], 1 +; CHECK-NEXT:    ret i32 [[E]] +; +  %C = xor i32 %B, -1 +  %D = add i32 %A, %C +  %E = add i32 %D, 1 +  ret i32 %E +} + +; E = (~B + A) + 1 = A - B +define i32 @add_to_sub2(i32 %A, i32 %B) { +; CHECK-LABEL: @add_to_sub2( +; CHECK-NEXT:    [[C:%.*]] = xor i32 [[B:%.*]], -1 +; CHECK-NEXT:    [[D:%.*]] = add i32 [[C]], [[A:%.*]] +; CHECK-NEXT:    [[E:%.*]] = add i32 [[D]], 1 +; CHECK-NEXT:    ret i32 [[E]] +; +  %C = xor i32 %B, -1 +  %D = add i32 %C, %A +  %E = add i32 %D, 1 +  ret i32 %E +}  | 

