[llvm] [InstCombine] Preserve the nsw/nuw flags for (X | Op01C) + Op1C --> X + (Op01C + Op1C) (PR #94586)
    via llvm-commits 
    llvm-commits at lists.llvm.org
       
    Fri Jun  7 03:08:19 PDT 2024
    
    
  
================
@@ -4137,5 +4137,25 @@ define i32 @fold_zext_nneg_add_const_fail2(i8 %x) {
   ret i32 %r
 }
 
+define i8 @fold_add_constant_preserve_nsw(i8 %x) {
+; CHECK-LABEL: @fold_add_constant_preserve_nsw(
+; CHECK-NEXT:    [[ADD:%.*]] = add nsw i8 [[X:%.*]], -120
+; CHECK-NEXT:    ret i8 [[ADD]]
+;
+  %or = or disjoint i8 %x, -128
+  %add = add nsw i8 %or, 8
+  ret i8 %add
+}
+
+define i8 @fold_add_constant_no_nsw(i8 %x) {
+; CHECK-LABEL: @fold_add_constant_no_nsw(
+; CHECK-NEXT:    [[ADD:%.*]] = add i8 [[X:%.*]], 120
+; CHECK-NEXT:    ret i8 [[ADD]]
+;
+  %or = or disjoint i8 %x, -128
+  %add = add nsw i8 %or, -8
+  ret i8 %add
+}
----------------
csstormq wrote:
After commenting it out, failed tests as shown below:
```
llvm/test/Transforms/InstCombine/add.ll:
  add_like_or_t0
  add_like_or_t2_extrause
  add_like_or_disjoint
llvm/test/Transforms/InstCombine/freeze.ll:
  early_freeze_test3
llvm/test/Transforms/InstCombine/sadd-with-overflow.ll:
  fold_with_distjoin_or
llvm/test/Transforms/LoopVectorize/interleaved-accesses.ll:
  PR27626_5
llvm/test/Transforms/PhaseOrdering/AArch64/matrix-extract-insert.ll:
  matrix_extract_insert_loop
```
Additionally, related commit: https://github.com/llvm/llvm-project/commit/a36bb7fd761942577b0d20d7f9b2bac57ffcd986
I think the surroundings of function add_like_or_* are good places to place these tests.
https://github.com/llvm/llvm-project/pull/94586
    
    
More information about the llvm-commits
mailing list