[llvm] 51bddfb - [InstCombine] Add additional cost of phi tests (NFC)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 10 07:14:55 PDT 2022


Author: Nikita Popov
Date: 2022-06-10T16:14:46+02:00
New Revision: 51bddfb1a091aa3413bef34368fa2dca51bc530c

URL: https://github.com/llvm/llvm-project/commit/51bddfb1a091aa3413bef34368fa2dca51bc530c
DIFF: https://github.com/llvm/llvm-project/commit/51bddfb1a091aa3413bef34368fa2dca51bc530c.diff

LOG: [InstCombine] Add additional cost of phi tests (NFC)

These check for undesirable folds for a cast of a loop phi.

Added: 
    

Modified: 
    llvm/test/Transforms/InstCombine/cast_phi.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/InstCombine/cast_phi.ll b/llvm/test/Transforms/InstCombine/cast_phi.ll
index 222b04ae16501..d2a3576eb8dd9 100644
--- a/llvm/test/Transforms/InstCombine/cast_phi.ll
+++ b/llvm/test/Transforms/InstCombine/cast_phi.ll
@@ -253,13 +253,13 @@ define i64 @zext_from_legal_to_legal_type(i32 %x) {
 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
 ; CHECK:       t:
 ; CHECK-NEXT:    [[Y:%.*]] = call i32 @get_i32()
-; CHECK-NEXT:    [[PHITMP:%.*]] = zext i32 [[Y]] to i64
+; CHECK-NEXT:    [[PHI_CAST:%.*]] = zext i32 [[Y]] to i64
 ; CHECK-NEXT:    br label [[EXIT:%.*]]
 ; CHECK:       f:
 ; CHECK-NEXT:    call void @bar()
 ; CHECK-NEXT:    br label [[EXIT]]
 ; CHECK:       exit:
-; CHECK-NEXT:    [[P:%.*]] = phi i64 [ [[PHITMP]], [[T]] ], [ 3, [[F]] ]
+; CHECK-NEXT:    [[P:%.*]] = phi i64 [ [[PHI_CAST]], [[T]] ], [ 3, [[F]] ]
 ; CHECK-NEXT:    ret i64 [[P]]
 ;
 entry:
@@ -287,13 +287,13 @@ define i64 @zext_from_illegal_to_legal_type(i32 %x) {
 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
 ; CHECK:       t:
 ; CHECK-NEXT:    [[Y:%.*]] = call i3 @get_i3()
-; CHECK-NEXT:    [[PHITMP:%.*]] = zext i3 [[Y]] to i64
+; CHECK-NEXT:    [[PHI_CAST:%.*]] = zext i3 [[Y]] to i64
 ; CHECK-NEXT:    br label [[EXIT:%.*]]
 ; CHECK:       f:
 ; CHECK-NEXT:    call void @bar()
 ; CHECK-NEXT:    br label [[EXIT]]
 ; CHECK:       exit:
-; CHECK-NEXT:    [[P:%.*]] = phi i64 [ [[PHITMP]], [[T]] ], [ 3, [[F]] ]
+; CHECK-NEXT:    [[P:%.*]] = phi i64 [ [[PHI_CAST]], [[T]] ], [ 3, [[F]] ]
 ; CHECK-NEXT:    ret i64 [[P]]
 ;
 entry:
@@ -313,3 +313,73 @@ exit:
   %r = zext i3 %p to i64
   ret i64 %r
 }
+
+define i8 @trunc_in_loop_exit_block() {
+; CHECK-LABEL: @trunc_in_loop_exit_block(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[LOOP:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
+; CHECK-NEXT:    [[PHI:%.*]] = phi i8 [ 1, [[ENTRY]] ], [ [[PHI_CAST:%.*]], [[LOOP_LATCH]] ]
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[IV]], 100
+; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT:%.*]]
+; CHECK:       loop.latch:
+; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
+; CHECK-NEXT:    [[PHI_CAST]] = trunc i32 [[IV_NEXT]] to i8
+; CHECK-NEXT:    br label [[LOOP]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret i8 [[PHI]]
+;
+entry:
+  br label %loop
+
+loop:
+  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]
+  %phi = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ]
+  %cmp = icmp ult i32 %iv, 100
+  br i1 %cmp, label %loop.latch, label %exit
+
+loop.latch:
+  %iv.next = add i32 %iv, 1
+  br label %loop
+
+exit:
+  %trunc = trunc i32 %phi to i8
+  ret i8 %trunc
+}
+
+define i32 @zext_in_loop_and_exit_block(i8 %step, i32 %end) {
+; CHECK-LABEL: @zext_in_loop_and_exit_block(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[LOOP:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[PHI_CAST:%.*]], [[LOOP_LATCH:%.*]] ]
+; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp eq i32 [[IV]], [[END:%.*]]
+; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[EXIT:%.*]], label [[LOOP_LATCH]]
+; CHECK:       loop.latch:
+; CHECK-NEXT:    [[STEP_EXT:%.*]] = zext i8 [[STEP:%.*]] to i32
+; CHECK-NEXT:    [[IV_NEXT:%.*]] = add nuw nsw i32 [[IV]], [[STEP_EXT]]
+; CHECK-NEXT:    [[PHI_CAST]] = and i32 [[IV_NEXT]], 255
+; CHECK-NEXT:    br label [[LOOP]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret i32 [[IV]]
+;
+entry:
+  br label %loop
+
+loop:
+  %iv = phi i8 [ 0, %entry ], [ %iv.next.trunc, %loop.latch ]
+  %iv.ext = zext i8 %iv to i32
+  %cmp = icmp ne i32 %iv.ext, %end
+  br i1 %cmp, label %loop.latch, label %exit
+
+loop.latch:
+  %step.ext = zext i8 %step to i32
+  %iv.next = add i32 %iv.ext, %step.ext
+  %iv.next.trunc = trunc i32 %iv.next to i8
+  br label %loop
+
+exit:
+  %ext = zext i8 %iv to i32
+  ret i32 %ext
+}


        


More information about the llvm-commits mailing list