Index: llvm/test/Transforms/InstCombine/addsub-constant-folding.ll =================================================================== --- llvm/test/Transforms/InstCombine/addsub-constant-folding.ll +++ llvm/test/Transforms/InstCombine/addsub-constant-folding.ll @@ -132,6 +132,47 @@ ret i32 %t1 } +define i32 @add_nsw_const_const_sub_nsw(i32 %arg) { +; CHECK-LABEL: @add_nsw_const_const_sub_nsw( +; CHECK-NEXT: [[T1:%.*]] = sub i32 -2147483648, [[ARG:%.*]] +; CHECK-NEXT: ret i32 [[T1]] +; + %t0 = add nsw i32 %arg, 1 + %t1 = sub nsw i32 -2147483647, %t0 + ret i32 %t1 +} + +define i32 @add_nsw_const_const_sub(i32 %arg) { +; CHECK-LABEL: @add_nsw_const_const_sub( +; CHECK-NEXT: [[T1:%.*]] = sub i32 -2147483648, [[ARG:%.*]] +; CHECK-NEXT: ret i32 [[T1]] +; + %t0 = add nsw i32 %arg, 1 + %t1 = sub i32 -2147483647, %t0 + ret i32 %t1 +} + +define i32 @add_const_const_sub_nsw(i32 %arg) { +; CHECK-LABEL: @add_const_const_sub_nsw( +; CHECK-NEXT: [[T1:%.*]] = sub i32 -2147483648, [[ARG:%.*]] +; CHECK-NEXT: ret i32 [[T1]] +; + %t0 = add i32 %arg, 1 + %t1 = sub nsw i32 -2147483647, %t0 + ret i32 %t1 +} + +; 2147483647-X with nsw will be more poisonous than -2147483647-(X+2) with nsw. (see X = -1) +define i32 @add_nsw_const_const_sub_nsw_ov(i32 %arg) { +; CHECK-LABEL: @add_nsw_const_const_sub_nsw_ov( +; CHECK-NEXT: [[T1:%.*]] = sub i32 2147483647, [[ARG:%.*]] +; CHECK-NEXT: ret i32 [[T1]] +; + %t0 = add nsw i32 %arg, 2 + %t1 = sub nsw i32 -2147483647, %t0 + ret i32 %t1 +} + define i32 @add_const_const_sub_extrause(i32 %arg) { ; CHECK-LABEL: @add_const_const_sub_extrause( ; CHECK-NEXT: [[T0:%.*]] = add i32 [[ARG:%.*]], 8