1f0ea9c9cSMatthias Braun; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2f0ea9c9cSMatthias Braun; RUN: opt %s -mtriple=x86_64-- -codegenprepare -S | FileCheck %s 3f0ea9c9cSMatthias Braun@g = global i32 0 4f0ea9c9cSMatthias Braun@effect = global i32 0 5f0ea9c9cSMatthias Braun 6f0ea9c9cSMatthias Braundefine void @switch_phi_const(i32 %x) { 7f0ea9c9cSMatthias Braun; CHECK-LABEL: @switch_phi_const( 8f0ea9c9cSMatthias Braun; CHECK-NEXT: bb0: 9f0ea9c9cSMatthias Braun; CHECK-NEXT: switch i32 [[X:%.*]], label [[DEFAULT:%.*]] [ 10f0ea9c9cSMatthias Braun; CHECK-NEXT: i32 13, label [[CASE_13:%.*]] 11f0ea9c9cSMatthias Braun; CHECK-NEXT: i32 42, label [[CASE_42:%.*]] 12f0ea9c9cSMatthias Braun; CHECK-NEXT: i32 50, label [[CASE_50_51:%.*]] 13f0ea9c9cSMatthias Braun; CHECK-NEXT: i32 51, label [[CASE_50_51]] 14f0ea9c9cSMatthias Braun; CHECK-NEXT: i32 55, label [[CASE_55:%.*]] 15f0ea9c9cSMatthias Braun; CHECK-NEXT: i32 7, label [[CASE_7:%.*]] 16f0ea9c9cSMatthias Braun; CHECK-NEXT: ] 17f0ea9c9cSMatthias Braun; CHECK: case_13: 18f0ea9c9cSMatthias Braun; CHECK-NEXT: [[X0:%.*]] = phi i32 [ [[X]], [[BB0:%.*]] ], [ [[X_LOOPBACK:%.*]], [[CASE_7]] ] 19d9e51e75SMatt Arsenault; CHECK-NEXT: store i32 13, ptr @effect, align 4 20f0ea9c9cSMatthias Braun; CHECK-NEXT: br label [[CASE_42]] 21f0ea9c9cSMatthias Braun; CHECK: case_42: 22f0ea9c9cSMatthias Braun; CHECK-NEXT: [[X1:%.*]] = phi i32 [ [[X]], [[BB0]] ], [ [[X0]], [[CASE_13]] ] 23d9e51e75SMatt Arsenault; CHECK-NEXT: store i32 [[X1]], ptr @effect, align 4 24f0ea9c9cSMatthias Braun; CHECK-NEXT: br label [[CASE_50_51]] 25f0ea9c9cSMatthias Braun; CHECK: case_50_51: 26f0ea9c9cSMatthias Braun; CHECK-NEXT: [[X2:%.*]] = phi i32 [ 50, [[BB0]] ], [ 50, [[BB0]] ], [ [[X1]], [[CASE_42]] ] 27f0ea9c9cSMatthias Braun; CHECK-NEXT: [[X2_2:%.*]] = phi i32 [ 51, [[BB0]] ], [ 51, [[BB0]] ], [ [[X1]], [[CASE_42]] ] 28d9e51e75SMatt Arsenault; CHECK-NEXT: store i32 [[X2]], ptr @effect, align 4 29d9e51e75SMatt Arsenault; CHECK-NEXT: store i32 [[X2_2]], ptr @effect, align 4 30f0ea9c9cSMatthias Braun; CHECK-NEXT: br label [[CASE_55]] 31f0ea9c9cSMatthias Braun; CHECK: case_55: 32f0ea9c9cSMatthias Braun; CHECK-NEXT: [[X3:%.*]] = phi i32 [ 42, [[BB0]] ], [ 55, [[CASE_50_51]] ] 33d9e51e75SMatt Arsenault; CHECK-NEXT: store i32 [[X3]], ptr @effect, align 4 34f0ea9c9cSMatthias Braun; CHECK-NEXT: br label [[DEFAULT]] 35f0ea9c9cSMatthias Braun; CHECK: case_7: 36d9e51e75SMatt Arsenault; CHECK-NEXT: [[X_LOOPBACK]] = load i32, ptr @g, align 4 37d9e51e75SMatt Arsenault; CHECK-NEXT: store i32 7, ptr @effect, align 4 38f0ea9c9cSMatthias Braun; CHECK-NEXT: br label [[CASE_13]] 39f0ea9c9cSMatthias Braun; CHECK: default: 40f0ea9c9cSMatthias Braun; CHECK-NEXT: ret void 41f0ea9c9cSMatthias Braun; 42f0ea9c9cSMatthias Braunbb0: 43f0ea9c9cSMatthias Braun switch i32 %x, label %default [ 44f0ea9c9cSMatthias Braun i32 13, label %case_13 45f0ea9c9cSMatthias Braun i32 42, label %case_42 46f0ea9c9cSMatthias Braun i32 50, label %case_50_51 47f0ea9c9cSMatthias Braun i32 51, label %case_50_51 48f0ea9c9cSMatthias Braun i32 55, label %case_55 49f0ea9c9cSMatthias Braun i32 7, label %case_7 50f0ea9c9cSMatthias Braun ] 51f0ea9c9cSMatthias Braun 52f0ea9c9cSMatthias Brauncase_13: 53f0ea9c9cSMatthias Braun ; We should replace 13 with %x 54f0ea9c9cSMatthias Braun %x0 = phi i32 [ 13, %bb0 ], [ %x_loopback, %case_7 ] 55d9e51e75SMatt Arsenault store i32 13, ptr @effect, align 4 56f0ea9c9cSMatthias Braun br label %case_42 57f0ea9c9cSMatthias Braun 58f0ea9c9cSMatthias Brauncase_42: 59f0ea9c9cSMatthias Braun ; We should replace 42 with %x 60f0ea9c9cSMatthias Braun %x1 = phi i32 [ 42, %bb0 ], [ %x0, %case_13 ] 61d9e51e75SMatt Arsenault store i32 %x1, ptr @effect, align 4 62f0ea9c9cSMatthias Braun br label %case_50_51 63f0ea9c9cSMatthias Braun 64f0ea9c9cSMatthias Brauncase_50_51: 65f0ea9c9cSMatthias Braun ; Must not replace the PHI argument: Case values 50 and 51 jump here. 66f0ea9c9cSMatthias Braun %x2 = phi i32 [ 50, %bb0 ], [ 50, %bb0 ], [ %x1, %case_42 ] 67f0ea9c9cSMatthias Braun %x2.2 = phi i32 [ 51, %bb0 ], [ 51, %bb0 ], [ %x1, %case_42 ] 68d9e51e75SMatt Arsenault store i32 %x2, ptr @effect, align 4 69d9e51e75SMatt Arsenault store i32 %x2.2, ptr @effect, align 4 70f0ea9c9cSMatthias Braun br label %case_55 71f0ea9c9cSMatthias Braun 72f0ea9c9cSMatthias Brauncase_55: 73f0ea9c9cSMatthias Braun ; We must not replace any of the PHI arguments: 74f0ea9c9cSMatthias Braun ; - 42 is the wrong constant 75f0ea9c9cSMatthias Braun ; - %case_42 is not the switch predecessor block. 76f0ea9c9cSMatthias Braun %x3 = phi i32 [ 42, %bb0 ], [ 55, %case_50_51 ] 77d9e51e75SMatt Arsenault store i32 %x3, ptr @effect, align 4 78f0ea9c9cSMatthias Braun br label %default 79f0ea9c9cSMatthias Braun 80f0ea9c9cSMatthias Brauncase_7: 81d9e51e75SMatt Arsenault %x_loopback = load i32, ptr @g, align 4 82d9e51e75SMatt Arsenault store i32 7, ptr @effect, align 4 83f0ea9c9cSMatthias Braun br label %case_13 84f0ea9c9cSMatthias Braun 85f0ea9c9cSMatthias Braundefault: 86f0ea9c9cSMatthias Braun ret void 87f0ea9c9cSMatthias Braun} 88f0ea9c9cSMatthias Braun 89*02b02cd0SNikita Popovdefine void @switch_phi_const_multiple_phis(i32 %x, i1 %c) { 90f0ea9c9cSMatthias Braun; CHECK-LABEL: @switch_phi_const_multiple_phis( 91f0ea9c9cSMatthias Braun; CHECK-NEXT: bb0: 92*02b02cd0SNikita Popov; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[CASE_13:%.*]] 93f0ea9c9cSMatthias Braun; CHECK: bb1: 94f0ea9c9cSMatthias Braun; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[X:%.*]], 13 95f0ea9c9cSMatthias Braun; CHECK-NEXT: br i1 [[COND]], label [[CASE_13]], label [[DEFAULT:%.*]] 96f0ea9c9cSMatthias Braun; CHECK: case_13: 97f0ea9c9cSMatthias Braun; CHECK-NEXT: [[X0:%.*]] = phi i32 [ [[X]], [[BB1]] ], [ 1, [[BB0:%.*]] ] 98f0ea9c9cSMatthias Braun; CHECK-NEXT: [[N0:%.*]] = phi i32 [ 14, [[BB1]] ], [ 1, [[BB0]] ] 99f0ea9c9cSMatthias Braun; CHECK-NEXT: [[X1:%.*]] = phi i32 [ 27, [[BB0]] ], [ [[X]], [[BB1]] ] 100d9e51e75SMatt Arsenault; CHECK-NEXT: store volatile i32 [[X0]], ptr @effect, align 4 101d9e51e75SMatt Arsenault; CHECK-NEXT: store volatile i32 [[N0]], ptr @effect, align 4 102d9e51e75SMatt Arsenault; CHECK-NEXT: store volatile i32 [[X1]], ptr @effect, align 4 103f0ea9c9cSMatthias Braun; CHECK-NEXT: ret void 104f0ea9c9cSMatthias Braun; CHECK: default: 105f0ea9c9cSMatthias Braun; CHECK-NEXT: ret void 106f0ea9c9cSMatthias Braun; 107f0ea9c9cSMatthias Braunbb0: 108*02b02cd0SNikita Popov br i1 %c, label %bb1, label %case_13 109f0ea9c9cSMatthias Braun 110f0ea9c9cSMatthias Braunbb1: 111f0ea9c9cSMatthias Braun switch i32 %x, label %default [ 112f0ea9c9cSMatthias Braun i32 13, label %case_13 113f0ea9c9cSMatthias Braun ] 114f0ea9c9cSMatthias Braun 115f0ea9c9cSMatthias Brauncase_13: 116f0ea9c9cSMatthias Braun ; Check that replacement works for multiple PHIs. 117f0ea9c9cSMatthias Braun ; Should perform replacement for %x0, %x1 but not %n0 118f0ea9c9cSMatthias Braun %x0 = phi i32 [13, %bb1], [1, %bb0] 119f0ea9c9cSMatthias Braun %n0 = phi i32 [14, %bb1], [1, %bb0] 120f0ea9c9cSMatthias Braun %x1 = phi i32 [27, %bb0], [13, %bb1] 121d9e51e75SMatt Arsenault store volatile i32 %x0, ptr @effect, align 4 122d9e51e75SMatt Arsenault store volatile i32 %n0, ptr @effect, align 4 123d9e51e75SMatt Arsenault store volatile i32 %x1, ptr @effect, align 4 124f0ea9c9cSMatthias Braun ret void 125f0ea9c9cSMatthias Braun 126f0ea9c9cSMatthias Braundefault: 127f0ea9c9cSMatthias Braun ret void 128f0ea9c9cSMatthias Braun} 129de9ad98dSMatthias Braun 130*02b02cd0SNikita Popovdefine void @switch_phi_const_degenerate(i1 %c) { 131de9ad98dSMatthias Braun; CHECK-LABEL: @switch_phi_const_degenerate( 132de9ad98dSMatthias Braun; CHECK-NEXT: bb0: 133*02b02cd0SNikita Popov; CHECK-NEXT: br i1 [[C:%.*]], label [[CASE_42:%.*]], label [[BB1:%.*]] 134de9ad98dSMatthias Braun; CHECK: bb1: 135de9ad98dSMatthias Braun; CHECK-NEXT: br label [[CASE_42]] 136de9ad98dSMatthias Braun; CHECK: case_42: 137de9ad98dSMatthias Braun; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[BB0:%.*]] ], [ 42, [[BB1]] ] 138d9e51e75SMatt Arsenault; CHECK-NEXT: store volatile i32 [[X]], ptr @effect, align 4 139de9ad98dSMatthias Braun; CHECK-NEXT: ret void 140de9ad98dSMatthias Braun; 141de9ad98dSMatthias Braunbb0: 142*02b02cd0SNikita Popov br i1 %c, label %case_42, label %bb1 143de9ad98dSMatthias Braun 144de9ad98dSMatthias Braunbb1: 145de9ad98dSMatthias Braun switch i32 42, label %unreachable [ 146de9ad98dSMatthias Braun i32 42, label %case_42 147de9ad98dSMatthias Braun ] 148de9ad98dSMatthias Braun 149de9ad98dSMatthias Brauncase_42: 150de9ad98dSMatthias Braun ; We should not end up in an endless loop 42 with the switch condition 42. 151de9ad98dSMatthias Braun %x = phi i32 [0, %bb0], [42, %bb1] 152d9e51e75SMatt Arsenault store volatile i32 %x, ptr @effect, align 4 153de9ad98dSMatthias Braun ret void 154de9ad98dSMatthias Braun 155de9ad98dSMatthias Braununreachable: 156de9ad98dSMatthias Braun unreachable 157de9ad98dSMatthias Braun} 1588d03c49fSMatthias Braun 1598d03c49fSMatthias Braun@g64 = global i64 0 1608d03c49fSMatthias Braun@effect64 = global i64 0 1618d03c49fSMatthias Braun 1628d03c49fSMatthias Braundefine void @switch_trunc_phi_const(i32 %x) { 1638d03c49fSMatthias Braun; CHECK-LABEL: @switch_trunc_phi_const( 1648d03c49fSMatthias Braun; CHECK-NEXT: bb0: 1658d03c49fSMatthias Braun; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[X:%.*]] to i64 1668d03c49fSMatthias Braun; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[X]] to i64 1678d03c49fSMatthias Braun; CHECK-NEXT: switch i32 [[X]], label [[DEFAULT:%.*]] [ 1688d03c49fSMatthias Braun; CHECK-NEXT: i32 13, label [[CASE_13:%.*]] 1698d03c49fSMatthias Braun; CHECK-NEXT: i32 42, label [[CASE_42:%.*]] 1708d03c49fSMatthias Braun; CHECK-NEXT: i32 55, label [[CASE_55:%.*]] 1718d03c49fSMatthias Braun; CHECK-NEXT: i32 7, label [[CASE_7:%.*]] 1728d03c49fSMatthias Braun; CHECK-NEXT: ] 1738d03c49fSMatthias Braun; CHECK: case_13: 1748d03c49fSMatthias Braun; CHECK-NEXT: [[X0:%.*]] = phi i64 [ [[TMP0]], [[BB0:%.*]] ], [ [[X7:%.*]], [[CASE_7]] ] 175d9e51e75SMatt Arsenault; CHECK-NEXT: store i64 13, ptr @effect64, align 4 1768d03c49fSMatthias Braun; CHECK-NEXT: br label [[CASE_42]] 1778d03c49fSMatthias Braun; CHECK: case_42: 1788d03c49fSMatthias Braun; CHECK-NEXT: [[X1:%.*]] = phi i64 [ [[TMP1]], [[BB0]] ], [ [[X0]], [[CASE_13]] ] 179d9e51e75SMatt Arsenault; CHECK-NEXT: store i64 [[X1]], ptr @effect64, align 4 1808d03c49fSMatthias Braun; CHECK-NEXT: br label [[CASE_55]] 1818d03c49fSMatthias Braun; CHECK: case_55: 1828d03c49fSMatthias Braun; CHECK-NEXT: [[X2:%.*]] = phi i64 [ 3895, [[BB0]] ], [ 55, [[CASE_42]] ] 183d9e51e75SMatt Arsenault; CHECK-NEXT: store i64 [[X2]], ptr @effect64, align 4 1848d03c49fSMatthias Braun; CHECK-NEXT: br label [[DEFAULT]] 1858d03c49fSMatthias Braun; CHECK: case_7: 186d9e51e75SMatt Arsenault; CHECK-NEXT: [[X7]] = load i64, ptr @g64, align 4 187d9e51e75SMatt Arsenault; CHECK-NEXT: store i64 7, ptr @effect64, align 4 1888d03c49fSMatthias Braun; CHECK-NEXT: br label [[CASE_13]] 1898d03c49fSMatthias Braun; CHECK: default: 1908d03c49fSMatthias Braun; CHECK-NEXT: ret void 1918d03c49fSMatthias Braun; 1928d03c49fSMatthias Braunbb0: 1938d03c49fSMatthias Braun switch i32 %x, label %default [ 1948d03c49fSMatthias Braun i32 13, label %case_13 1958d03c49fSMatthias Braun i32 42, label %case_42 1968d03c49fSMatthias Braun i32 55, label %case_55 1978d03c49fSMatthias Braun i32 7, label %case_7 1988d03c49fSMatthias Braun ] 1998d03c49fSMatthias Braun 2008d03c49fSMatthias Brauncase_13: 2018d03c49fSMatthias Braun ; We should replace 13 with zext %x to i64 2028d03c49fSMatthias Braun %x0 = phi i64 [ 13, %bb0 ], [ %x7, %case_7 ] 203d9e51e75SMatt Arsenault store i64 13, ptr @effect64, align 4 2048d03c49fSMatthias Braun br label %case_42 2058d03c49fSMatthias Braun 2068d03c49fSMatthias Brauncase_42: 2078d03c49fSMatthias Braun ; We should replace 42 with zext i32 %x to i64 2088d03c49fSMatthias Braun %x1 = phi i64 [ 42, %bb0 ], [ %x0, %case_13 ] 209d9e51e75SMatt Arsenault store i64 %x1, ptr @effect64, align 4 2108d03c49fSMatthias Braun br label %case_55 2118d03c49fSMatthias Braun 2128d03c49fSMatthias Brauncase_55: 2138d03c49fSMatthias Braun ; We must not replace any of the PHI arguments! (3898 == 0xf00 + 55) 2148d03c49fSMatthias Braun %x2 = phi i64 [ 3895, %bb0 ], [ 55, %case_42 ] 215d9e51e75SMatt Arsenault store i64 %x2, ptr @effect64, align 4 2168d03c49fSMatthias Braun br label %default 2178d03c49fSMatthias Braun 2188d03c49fSMatthias Brauncase_7: 219d9e51e75SMatt Arsenault %x7 = load i64, ptr @g64, align 4 220d9e51e75SMatt Arsenault store i64 7, ptr @effect64, align 4 2218d03c49fSMatthias Braun br label %case_13 2228d03c49fSMatthias Braun 2238d03c49fSMatthias Braundefault: 2248d03c49fSMatthias Braun ret void 2258d03c49fSMatthias Braun} 226