@@ -490,18 +490,114 @@ loop.latch:
490490exit:
491491 ret void
492492}
493+
494+ define void @switch_unconditional (ptr %start ) {
495+ ; IC1-LABEL: define void @switch_unconditional(
496+ ; IC1-SAME: ptr [[START:%.*]]) {
497+ ; IC1-NEXT: [[ENTRY:.*:]]
498+ ; IC1-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
499+ ; IC1: [[VECTOR_PH]]:
500+ ; IC1-NEXT: br label %[[VECTOR_BODY:.*]]
501+ ; IC1: [[VECTOR_BODY]]:
502+ ; IC1-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
503+ ; IC1-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[START]], i64 [[INDEX]]
504+ ; IC1-NEXT: store <2 x i32> zeroinitializer, ptr [[TMP1]], align 4
505+ ; IC1-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
506+ ; IC1-NEXT: [[TMP0:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
507+ ; IC1-NEXT: br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
508+ ; IC1: [[MIDDLE_BLOCK]]:
509+ ; IC1-NEXT: br label %[[EXIT:.*]]
510+ ; IC1: [[SCALAR_PH]]:
511+ ; IC1-NEXT: br label %[[LOOP:.*]]
512+ ; IC1: [[LOOP]]:
513+ ; IC1-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LATCH:.*]] ]
514+ ; IC1-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[START]], i64 [[IV]]
515+ ; IC1-NEXT: [[X:%.*]] = load i32, ptr [[GEP]], align 4
516+ ; IC1-NEXT: switch i32 [[X]], label %[[FOO:.*]] [
517+ ; IC1-NEXT: ]
518+ ; IC1: [[FOO]]:
519+ ; IC1-NEXT: br label %[[LATCH]]
520+ ; IC1: [[LATCH]]:
521+ ; IC1-NEXT: store i32 0, ptr [[GEP]], align 4
522+ ; IC1-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
523+ ; IC1-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], 100
524+ ; IC1-NEXT: br i1 [[CMP]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP7:![0-9]+]]
525+ ; IC1: [[EXIT]]:
526+ ; IC1-NEXT: ret void
527+ ;
528+ ; IC2-LABEL: define void @switch_unconditional(
529+ ; IC2-SAME: ptr [[START:%.*]]) {
530+ ; IC2-NEXT: [[ENTRY:.*:]]
531+ ; IC2-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
532+ ; IC2: [[VECTOR_PH]]:
533+ ; IC2-NEXT: br label %[[VECTOR_BODY:.*]]
534+ ; IC2: [[VECTOR_BODY]]:
535+ ; IC2-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
536+ ; IC2-NEXT: [[TMP2:%.*]] = getelementptr i32, ptr [[START]], i64 [[INDEX]]
537+ ; IC2-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[TMP2]], i32 2
538+ ; IC2-NEXT: store <2 x i32> zeroinitializer, ptr [[TMP2]], align 4
539+ ; IC2-NEXT: store <2 x i32> zeroinitializer, ptr [[TMP1]], align 4
540+ ; IC2-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
541+ ; IC2-NEXT: [[TMP0:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
542+ ; IC2-NEXT: br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
543+ ; IC2: [[MIDDLE_BLOCK]]:
544+ ; IC2-NEXT: br label %[[EXIT:.*]]
545+ ; IC2: [[SCALAR_PH]]:
546+ ; IC2-NEXT: br label %[[LOOP:.*]]
547+ ; IC2: [[LOOP]]:
548+ ; IC2-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LATCH:.*]] ]
549+ ; IC2-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[START]], i64 [[IV]]
550+ ; IC2-NEXT: [[X:%.*]] = load i32, ptr [[GEP]], align 4
551+ ; IC2-NEXT: switch i32 [[X]], label %[[FOO:.*]] [
552+ ; IC2-NEXT: ]
553+ ; IC2: [[FOO]]:
554+ ; IC2-NEXT: br label %[[LATCH]]
555+ ; IC2: [[LATCH]]:
556+ ; IC2-NEXT: store i32 0, ptr [[GEP]], align 4
557+ ; IC2-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1
558+ ; IC2-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], 100
559+ ; IC2-NEXT: br i1 [[CMP]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP7:![0-9]+]]
560+ ; IC2: [[EXIT]]:
561+ ; IC2-NEXT: ret void
562+ ;
563+ entry:
564+ br label %loop
565+
566+ loop:
567+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %latch ]
568+ %gep = getelementptr i32 , ptr %start , i64 %iv
569+ %x = load i32 , ptr %gep
570+ switch i32 %x , label %foo []
571+
572+ foo:
573+ br label %latch
574+
575+ latch:
576+ store i32 0 , ptr %gep
577+ %iv.next = add i64 %iv , 1
578+ %cmp = icmp eq i64 %iv.next , 100
579+ br i1 %cmp , label %exit , label %loop
580+
581+ exit:
582+ ret void
583+ }
584+
493585;.
494586; IC1: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
495587; IC1: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
496588; IC1: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
497589; IC1: [[LOOP3]] = distinct !{[[LOOP3]], [[META2]], [[META1]]}
498590; IC1: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}
499591; IC1: [[LOOP5]] = distinct !{[[LOOP5]], [[META2]], [[META1]]}
592+ ; IC1: [[LOOP6]] = distinct !{[[LOOP6]], [[META1]], [[META2]]}
593+ ; IC1: [[LOOP7]] = distinct !{[[LOOP7]], [[META2]], [[META1]]}
500594;.
501595; IC2: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
502596; IC2: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
503597; IC2: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
504598; IC2: [[LOOP3]] = distinct !{[[LOOP3]], [[META2]], [[META1]]}
505599; IC2: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}
506600; IC2: [[LOOP5]] = distinct !{[[LOOP5]], [[META2]], [[META1]]}
601+ ; IC2: [[LOOP6]] = distinct !{[[LOOP6]], [[META1]], [[META2]]}
602+ ; IC2: [[LOOP7]] = distinct !{[[LOOP7]], [[META2]], [[META1]]}
507603;.
0 commit comments