Author: Craig Topper Date: 2020-12-13T23:25:00-08:00 New Revision: 2acd5a473860d6ed024252367e7fdefa105e9df9
URL: https://github.com/llvm/llvm-project/commit/2acd5a473860d6ed024252367e7fdefa105e9df9 DIFF: https://github.com/llvm/llvm-project/commit/2acd5a473860d6ed024252367e7fdefa105e9df9.diff LOG: [LoopIdiom] Pre-commit tests for D92745. NFC Added: Modified: llvm/test/Transforms/LoopIdiom/X86/ctlz.ll llvm/test/Transforms/LoopIdiom/X86/cttz.ll Removed: ################################################################################ diff --git a/llvm/test/Transforms/LoopIdiom/X86/ctlz.ll b/llvm/test/Transforms/LoopIdiom/X86/ctlz.ll index 117946cf3d2c..6d3863a0ee33 100644 --- a/llvm/test/Transforms/LoopIdiom/X86/ctlz.ll +++ b/llvm/test/Transforms/LoopIdiom/X86/ctlz.ll @@ -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 +} diff --git a/llvm/test/Transforms/LoopIdiom/X86/cttz.ll b/llvm/test/Transforms/LoopIdiom/X86/cttz.ll index 82bc8207eb0e..642eb11d2d7f 100644 --- a/llvm/test/Transforms/LoopIdiom/X86/cttz.ll +++ b/llvm/test/Transforms/LoopIdiom/X86/cttz.ll @@ -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 +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits