Skip to content

Commit

Permalink
[LoopIdiom] Pre-commit tests for D92745. NFC
Browse files Browse the repository at this point in the history
  • Loading branch information
topperc committed Dec 14, 2020
1 parent 33b740f commit 2acd5a4
Show file tree
Hide file tree
Showing 2 changed files with 201 additions and 0 deletions.
101 changes: 101 additions & 0 deletions llvm/test/Transforms/LoopIdiom/X86/ctlz.ll
Original file line number Diff line number Diff line change
Expand Up @@ -672,3 +672,104 @@ while.cond: ; preds = %while.cond, %entry
while.end: ; preds = %while.cond
ret i32 %inc
}

; Recognize CTLZ builtin pattern.
; Here it will replace the loop -
; assume builtin is always profitable.
;
; int ctlz_decrement(int n)
; {
; int i = 32;
; while(n) {
; n >>= 1;
; i--;
; }
; return i;
; }
;
define i32 @ctlz_decrement(i32 %n) {
; ALL-LABEL: @ctlz_decrement(
; ALL-NEXT: entry:
; ALL-NEXT: [[TOBOOL4:%.*]] = icmp eq i32 [[N:%.*]], 0
; ALL-NEXT: br i1 [[TOBOOL4]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]]
; ALL: while.body.preheader:
; ALL-NEXT: br label [[WHILE_BODY:%.*]]
; ALL: while.body:
; ALL-NEXT: [[I_06:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 32, [[WHILE_BODY_PREHEADER]] ]
; ALL-NEXT: [[N_ADDR_05:%.*]] = phi i32 [ [[SHR:%.*]], [[WHILE_BODY]] ], [ [[N]], [[WHILE_BODY_PREHEADER]] ]
; ALL-NEXT: [[SHR]] = lshr i32 [[N_ADDR_05]], 1
; ALL-NEXT: [[INC]] = add nsw i32 [[I_06]], -1
; ALL-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[SHR]], 0
; ALL-NEXT: br i1 [[TOBOOL]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]]
; ALL: while.end.loopexit:
; ALL-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ]
; ALL-NEXT: br label [[WHILE_END]]
; ALL: while.end:
; ALL-NEXT: [[I_0_LCSSA:%.*]] = phi i32 [ 32, [[ENTRY:%.*]] ], [ [[INC_LCSSA]], [[WHILE_END_LOOPEXIT]] ]
; ALL-NEXT: ret i32 [[I_0_LCSSA]]
;
entry:
%tobool4 = icmp eq i32 %n, 0
br i1 %tobool4, label %while.end, label %while.body.preheader

while.body.preheader: ; preds = %entry
br label %while.body

while.body: ; preds = %while.body.preheader, %while.body
%i.06 = phi i32 [ %inc, %while.body ], [ 32, %while.body.preheader ]
%n.addr.05 = phi i32 [ %shr, %while.body ], [ %n, %while.body.preheader ]
%shr = lshr i32 %n.addr.05, 1
%inc = add nsw i32 %i.06, -1
%tobool = icmp eq i32 %shr, 0
br i1 %tobool, label %while.end.loopexit, label %while.body

while.end.loopexit: ; preds = %while.body
br label %while.end

while.end: ; preds = %while.end.loopexit, %entry
%i.0.lcssa = phi i32 [ 32, %entry ], [ %inc, %while.end.loopexit ]
ret i32 %i.0.lcssa
}

; Recognize CTLZ builtin pattern.
; Here it will replace the loop -
; assume builtin is always profitable.
;
; int ctlz_lshr_decrement(int n)
; {
; int i = 31;
; while(n >>= 1) {
; i--;
; }
; return i;
; }
;
define i32 @ctlz_lshr_decrement(i32 %n) {
; ALL-LABEL: @ctlz_lshr_decrement(
; ALL-NEXT: entry:
; ALL-NEXT: br label [[WHILE_COND:%.*]]
; ALL: while.cond:
; ALL-NEXT: [[N_ADDR_0:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[SHR:%.*]], [[WHILE_COND]] ]
; ALL-NEXT: [[I_0:%.*]] = phi i32 [ 31, [[ENTRY]] ], [ [[INC:%.*]], [[WHILE_COND]] ]
; ALL-NEXT: [[SHR]] = lshr i32 [[N_ADDR_0]], 1
; ALL-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[SHR]], 0
; ALL-NEXT: [[INC]] = add nsw i32 [[I_0]], -1
; ALL-NEXT: br i1 [[TOBOOL]], label [[WHILE_END:%.*]], label [[WHILE_COND]]
; ALL: while.end:
; ALL-NEXT: [[I_0_LCSSA:%.*]] = phi i32 [ [[I_0]], [[WHILE_COND]] ]
; ALL-NEXT: ret i32 [[I_0_LCSSA]]
;
entry:
br label %while.cond

while.cond: ; preds = %while.cond, %entry
%n.addr.0 = phi i32 [ %n, %entry ], [ %shr, %while.cond ]
%i.0 = phi i32 [ 31, %entry ], [ %inc, %while.cond ]
%shr = lshr i32 %n.addr.0, 1
%tobool = icmp eq i32 %shr, 0
%inc = add nsw i32 %i.0, -1
br i1 %tobool, label %while.end, label %while.cond

while.end: ; preds = %while.cond
ret i32 %i.0
}
100 changes: 100 additions & 0 deletions llvm/test/Transforms/LoopIdiom/X86/cttz.ll
Original file line number Diff line number Diff line change
Expand Up @@ -113,3 +113,103 @@ while.end: ; preds = %while.cond
ret i32 %i.0
}

; Recognize CTTZ builtin pattern.
; Here it will replace the loop -
; assume builtin is always profitable.
;
; int ctlz_decrement(int n)
; {
; int i = 32;
; while(n) {
; n <<= 1;
; i--;
; }
; return i;
; }
;
define i32 @cttz_decrement(i32 %n) {
; ALL-LABEL: @cttz_decrement(
; ALL-NEXT: entry:
; ALL-NEXT: [[TOBOOL4:%.*]] = icmp eq i32 [[N:%.*]], 0
; ALL-NEXT: br i1 [[TOBOOL4]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]]
; ALL: while.body.preheader:
; ALL-NEXT: br label [[WHILE_BODY:%.*]]
; ALL: while.body:
; ALL-NEXT: [[I_06:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 32, [[WHILE_BODY_PREHEADER]] ]
; ALL-NEXT: [[N_ADDR_05:%.*]] = phi i32 [ [[SHL:%.*]], [[WHILE_BODY]] ], [ [[N]], [[WHILE_BODY_PREHEADER]] ]
; ALL-NEXT: [[SHL]] = shl i32 [[N_ADDR_05]], 1
; ALL-NEXT: [[INC]] = add nsw i32 [[I_06]], -1
; ALL-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[SHL]], 0
; ALL-NEXT: br i1 [[TOBOOL]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]]
; ALL: while.end.loopexit:
; ALL-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ]
; ALL-NEXT: br label [[WHILE_END]]
; ALL: while.end:
; ALL-NEXT: [[I_0_LCSSA:%.*]] = phi i32 [ 32, [[ENTRY:%.*]] ], [ [[INC_LCSSA]], [[WHILE_END_LOOPEXIT]] ]
; ALL-NEXT: ret i32 [[I_0_LCSSA]]
;
entry:
%tobool4 = icmp eq i32 %n, 0
br i1 %tobool4, label %while.end, label %while.body.preheader

while.body.preheader: ; preds = %entry
br label %while.body

while.body: ; preds = %while.body.preheader, %while.body
%i.06 = phi i32 [ %inc, %while.body ], [ 32, %while.body.preheader ]
%n.addr.05 = phi i32 [ %shl, %while.body ], [ %n, %while.body.preheader ]
%shl = shl i32 %n.addr.05, 1
%inc = add nsw i32 %i.06, -1
%tobool = icmp eq i32 %shl, 0
br i1 %tobool, label %while.end.loopexit, label %while.body

while.end.loopexit: ; preds = %while.body
br label %while.end

while.end: ; preds = %while.end.loopexit, %entry
%i.0.lcssa = phi i32 [ 32, %entry ], [ %inc, %while.end.loopexit ]
ret i32 %i.0.lcssa
}

; Recognize CTTZ builtin pattern.
; Here it will replace the loop -
; assume builtin is always profitable.
;
; int cttz_shl_decrement(int n)
; {
; int i = 31;
; while(n <<= 1) {
; i--;
; }
; return i;
; }
;
define i32 @cttz_shl_decrement(i32 %n) {
; ALL-LABEL: @cttz_shl_decrement(
; ALL-NEXT: entry:
; ALL-NEXT: br label [[WHILE_COND:%.*]]
; ALL: while.cond:
; ALL-NEXT: [[N_ADDR_0:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY:%.*]] ], [ [[SHL:%.*]], [[WHILE_COND]] ]
; ALL-NEXT: [[I_0:%.*]] = phi i32 [ 31, [[ENTRY]] ], [ [[INC:%.*]], [[WHILE_COND]] ]
; ALL-NEXT: [[SHL]] = shl i32 [[N_ADDR_0]], 1
; ALL-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[SHL]], 0
; ALL-NEXT: [[INC]] = add nsw i32 [[I_0]], -1
; ALL-NEXT: br i1 [[TOBOOL]], label [[WHILE_END:%.*]], label [[WHILE_COND]]
; ALL: while.end:
; ALL-NEXT: [[I_0_LCSSA:%.*]] = phi i32 [ [[I_0]], [[WHILE_COND]] ]
; ALL-NEXT: ret i32 [[I_0_LCSSA]]
;
entry:
br label %while.cond

while.cond: ; preds = %while.cond, %entry
%n.addr.0 = phi i32 [ %n, %entry ], [ %shl, %while.cond ]
%i.0 = phi i32 [ 31, %entry ], [ %inc, %while.cond ]
%shl = shl i32 %n.addr.0, 1
%tobool = icmp eq i32 %shl, 0
%inc = add nsw i32 %i.0, -1
br i1 %tobool, label %while.end, label %while.cond

while.end: ; preds = %while.cond
ret i32 %i.0
}

0 comments on commit 2acd5a4

Please sign in to comment.