|  | 
|  | 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 | 
|  | 2 | +; RUN: opt < %s -passes=simplifycfg -S | FileCheck %s | 
|  | 3 | + | 
|  | 4 | +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" | 
|  | 5 | +target triple = "x86_64-unknown-linux-gnu" | 
|  | 6 | + | 
|  | 7 | +define dso_local noundef i32 @main() { | 
|  | 8 | +; CHECK-LABEL: define dso_local noundef i32 @main() { | 
|  | 9 | +; CHECK-NEXT:  [[BB:.*]]: | 
|  | 10 | +; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca [2 x ptr], align 16 | 
|  | 11 | +; CHECK-NEXT:    store ptr blockaddress(@main, %[[BB4:.*]]), ptr [[ALLOCA]], align 16, !tbaa [[TBAA0:![0-9]+]] | 
|  | 12 | +; CHECK-NEXT:    [[GETELEMENTPTR:%.*]] = getelementptr inbounds [2 x ptr], ptr [[ALLOCA]], i64 0, i64 1 | 
|  | 13 | +; CHECK-NEXT:    store ptr blockaddress(@main, %[[BB10:.*]]), ptr [[GETELEMENTPTR]], align 8, !tbaa [[TBAA0]] | 
|  | 14 | +; CHECK-NEXT:    br label %[[BB1:.*]] | 
|  | 15 | +; CHECK:       [[BB1]]: | 
|  | 16 | +; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[PHI8:%.*]], %[[BB7:.*]] ] | 
|  | 17 | +; CHECK-NEXT:    [[PHI2:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[PHI9:%.*]], %[[BB7]] ] | 
|  | 18 | +; CHECK-NEXT:    switch i32 [[PHI]], label %[[BB7]] [ | 
|  | 19 | +; CHECK-NEXT:      i32 0, label %[[BB12:.*]] | 
|  | 20 | +; CHECK-NEXT:      i32 1, label %[[BB4]] | 
|  | 21 | +; CHECK-NEXT:      i32 2, label %[[BB6:.*]] | 
|  | 22 | +; CHECK-NEXT:    ] | 
|  | 23 | +; CHECK:       [[BB4]]: | 
|  | 24 | +; CHECK-NEXT:    [[PHI5:%.*]] = phi i32 [ [[PHI13:%.*]], %[[BB12]] ], [ [[PHI2]], %[[BB1]] ] | 
|  | 25 | +; CHECK-NEXT:    br label %[[BB7]] | 
|  | 26 | +; CHECK:       [[BB6]]: | 
|  | 27 | +; CHECK-NEXT:    [[CALL:%.*]] = call i32 @foo(i32 noundef [[PHI2]]) | 
|  | 28 | +; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[PHI2]], 1 | 
|  | 29 | +; CHECK-NEXT:    br label %[[BB12]] | 
|  | 30 | +; CHECK:       [[BB7]]: | 
|  | 31 | +; CHECK-NEXT:    [[PHI8]] = phi i32 [ [[PHI]], %[[BB1]] ], [ 2, %[[BB4]] ] | 
|  | 32 | +; CHECK-NEXT:    [[PHI9]] = phi i32 [ [[PHI2]], %[[BB1]] ], [ [[PHI5]], %[[BB4]] ] | 
|  | 33 | +; CHECK-NEXT:    br label %[[BB1]], !llvm.loop [[LOOP4:![0-9]+]] | 
|  | 34 | +; CHECK:       [[BB10]]: | 
|  | 35 | +; CHECK-NEXT:    [[CALL11:%.*]] = call i32 @foo(i32 noundef [[PHI13]]) | 
|  | 36 | +; CHECK-NEXT:    ret i32 0 | 
|  | 37 | +; CHECK:       [[BB12]]: | 
|  | 38 | +; CHECK-NEXT:    [[PHI13]] = phi i32 [ [[ADD]], %[[BB6]] ], [ [[PHI2]], %[[BB1]] ] | 
|  | 39 | +; CHECK-NEXT:    [[SEXT:%.*]] = sext i32 [[PHI13]] to i64 | 
|  | 40 | +; CHECK-NEXT:    [[GETELEMENTPTR14:%.*]] = getelementptr inbounds [2 x ptr], ptr [[ALLOCA]], i64 0, i64 [[SEXT]] | 
|  | 41 | +; CHECK-NEXT:    [[LOAD:%.*]] = load ptr, ptr [[GETELEMENTPTR14]], align 8, !tbaa [[TBAA0]] | 
|  | 42 | +; CHECK-NEXT:    indirectbr ptr [[LOAD]], [label %[[BB4]], label %bb10] | 
|  | 43 | +; | 
|  | 44 | +bb: | 
|  | 45 | +  %alloca = alloca [2 x ptr], align 16 | 
|  | 46 | +  store ptr blockaddress(@main, %bb4), ptr %alloca, align 16, !tbaa !0 | 
|  | 47 | +  %getelementptr = getelementptr inbounds [2 x ptr], ptr %alloca, i64 0, i64 1 | 
|  | 48 | +  store ptr blockaddress(@main, %bb10), ptr %getelementptr, align 8, !tbaa !0 | 
|  | 49 | +  br label %bb1 | 
|  | 50 | + | 
|  | 51 | +bb1:                                              ; preds = %bb7, %bb | 
|  | 52 | +  %phi = phi i32 [ 0, %bb ], [ %phi8, %bb7 ] | 
|  | 53 | +  %phi2 = phi i32 [ 0, %bb ], [ %phi9, %bb7 ] | 
|  | 54 | +  switch i32 %phi, label %bb7 [ | 
|  | 55 | +  i32 0, label %bb3 | 
|  | 56 | +  i32 1, label %bb4 | 
|  | 57 | +  i32 2, label %bb6 | 
|  | 58 | +  ] | 
|  | 59 | + | 
|  | 60 | +bb3:                                              ; preds = %bb1 | 
|  | 61 | +  br label %bb12 | 
|  | 62 | + | 
|  | 63 | +bb4:                                              ; preds = %bb12, %bb1 | 
|  | 64 | +  %phi5 = phi i32 [ %phi13, %bb12 ], [ %phi2, %bb1 ] | 
|  | 65 | +  br label %bb7 | 
|  | 66 | + | 
|  | 67 | +bb6:                                              ; preds = %bb1 | 
|  | 68 | +  %call = call i32 @foo(i32 noundef %phi2) | 
|  | 69 | +  %add = add nsw i32 %phi2, 1 | 
|  | 70 | +  br label %bb12 | 
|  | 71 | + | 
|  | 72 | +bb7:                                              ; preds = %bb4, %bb1 | 
|  | 73 | +  %phi8 = phi i32 [ %phi, %bb1 ], [ 2, %bb4 ] | 
|  | 74 | +  %phi9 = phi i32 [ %phi2, %bb1 ], [ %phi5, %bb4 ] | 
|  | 75 | +  br label %bb1, !llvm.loop !4 | 
|  | 76 | + | 
|  | 77 | +bb10:                                             ; preds = %bb12 | 
|  | 78 | +  %call11 = call i32 @foo(i32 noundef %phi13) | 
|  | 79 | +  ret i32 0 | 
|  | 80 | + | 
|  | 81 | +bb12:                                             ; preds = %bb6, %bb3 | 
|  | 82 | +  %phi13 = phi i32 [ %add, %bb6 ], [ %phi2, %bb3 ] | 
|  | 83 | +  %sext = sext i32 %phi13 to i64 | 
|  | 84 | +  %getelementptr14 = getelementptr inbounds [2 x ptr], ptr %alloca, i64 0, i64 %sext | 
|  | 85 | +  %load = load ptr, ptr %getelementptr14, align 8, !tbaa !0 | 
|  | 86 | +  indirectbr ptr %load, [label %bb4, label %bb10] | 
|  | 87 | +} | 
|  | 88 | + | 
|  | 89 | +declare i32 @foo(i32) | 
|  | 90 | + | 
|  | 91 | +!0 = !{!1, !1, i64 0} | 
|  | 92 | +!1 = !{!"any pointer", !2, i64 0} | 
|  | 93 | +!2 = !{!"omnipotent char", !3, i64 0} | 
|  | 94 | +!3 = !{!"Simple C++ TBAA"} | 
|  | 95 | +!4 = !{!5, !5, i64 0} | 
|  | 96 | +!5 = !{!"int", !2, i64 0} | 
|  | 97 | +;. | 
|  | 98 | +; CHECK: [[TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0} | 
|  | 99 | +; CHECK: [[META1]] = !{!"any pointer", [[META2:![0-9]+]], i64 0} | 
|  | 100 | +; CHECK: [[META2]] = !{!"omnipotent char", [[META3:![0-9]+]], i64 0} | 
|  | 101 | +; CHECK: [[META3]] = !{!"Simple C++ TBAA"} | 
|  | 102 | +; CHECK: [[LOOP4]] = !{[[META5:![0-9]+]], [[META5]], i64 0} | 
|  | 103 | +; CHECK: [[META5]] = !{!"int", [[META2]], i64 0} | 
|  | 104 | +;. | 
0 commit comments