65 lines · plain
1; REQUIRES: asserts2; RUN: opt -passes=simple-loop-unswitch -disable-output -stats -info-output-file - < %s | FileCheck --check-prefix=STATS %s3; RUN: opt -passes=simple-loop-unswitch -verify-memoryssa -S < %s | FileCheck %s4; PR53735 6; Loop unswitching shouldn't trivially unswitch the true case of condition %a7; in the code here because it leads to an infinite loop. While this doesn't8; contain any instructions with side effects, it's still a kind of side effect.9; It can trivially unswitch on the false cas of condition %a though.10 11; STATS: 2 simple-loop-unswitch - Number of branches unswitched12; STATS: 2 simple-loop-unswitch - Number of unswitches that are trivial13 14; CHECK-LABEL: @func_16(15; CHECK-NEXT: entry:16; CHECK-NEXT: br i1 %a, label %entry.split, label %abort017 18; CHECK: entry.split:19; CHECK-NEXT: br i1 %b, label %entry.split.split, label %abort120 21; CHECK: entry.split.split:22; CHECK-NEXT: br label %for.body23 24; CHECK: for.body:25; CHECK-NEXT: br label %cond.end26 27; CHECK: cond.end:28; CHECK-NEXT: br label %for.body29 30; CHECK: abort0:31; CHECK-NEXT: call void @end0() [[NOR_NUW:#[0-9]+]]32; CHECK-NEXT: unreachable33 34; CHECK: abort1:35; CHECK-NEXT: call void @end1() [[NOR_NUW]]36; CHECK-NEXT: unreachable37 38; CHECK: }39 40define void @func_16(i1 %a, i1 %b) nounwind {41entry:42 br label %for.body43 44for.body:45 br i1 %a, label %cond.end, label %abort046 47cond.end:48 br i1 %b, label %for.body, label %abort149 50abort0:51 call void @end0() noreturn nounwind52 unreachable53 54abort1:55 call void @end1() noreturn nounwind56 unreachable57}58 59declare void @end0() noreturn60declare void @end1() noreturn61 62; CHECK: attributes #0 = { nounwind }63; CHECK: attributes #1 = { noreturn }64; CHECK: attributes [[NOR_NUW]] = { noreturn nounwind }65