10c40651fSNikita Popov; RUN: llvm-dis -expand-constant-exprs < %s.bc | FileCheck %s 2941c8e0eSNikita Popov 3941c8e0eSNikita Popov@g = extern_weak global i32 4941c8e0eSNikita Popov@g2 = extern_weak global i32 5941c8e0eSNikita Popov 6941c8e0eSNikita Popovdefine i64 @test_cast() { 7941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_cast() { 8941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 9941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %constexpr 10941c8e0eSNikita Popov ret i64 ptrtoint (ptr @g to i64) 11941c8e0eSNikita Popov} 12941c8e0eSNikita Popov 13941c8e0eSNikita Popovdefine i1 @test_icmp() { 14941c8e0eSNikita Popov; CHECK-LABEL: define i1 @test_icmp() { 15941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 16941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = icmp ne i64 %constexpr, 0 17941c8e0eSNikita Popov; CHECK-NEXT: ret i1 %constexpr1 18941c8e0eSNikita Popov ret i1 icmp ne (i64 ptrtoint (ptr @g to i64), i64 0) 19941c8e0eSNikita Popov} 20941c8e0eSNikita Popov 21941c8e0eSNikita Popovdefine i32 @test_select() { 22941c8e0eSNikita Popov; CHECK-LABEL: define i32 @test_select() { 23941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 24941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = icmp ne i64 %constexpr, 0 25941c8e0eSNikita Popov; CHECK-NEXT: %constexpr2 = select i1 %constexpr1, i32 1, i32 2 26941c8e0eSNikita Popov; CHECK-NEXT: ret i32 %constexpr2 27941c8e0eSNikita Popov ret i32 select (i1 icmp ne (i64 ptrtoint (ptr @g to i64), i64 0), i32 1, i32 2) 28941c8e0eSNikita Popov} 29941c8e0eSNikita Popov 30941c8e0eSNikita Popovdefine i8 @test_extractelement() { 31941c8e0eSNikita Popov; CHECK-LABEL: define i8 @test_extractelement() { 32941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 33941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = icmp ne i64 %constexpr, 0 34941c8e0eSNikita Popov; CHECK-NEXT: %constexpr2 = select i1 %constexpr1, <2 x i8> zeroinitializer, <2 x i8> <i8 0, i8 1> 35941c8e0eSNikita Popov; CHECK-NEXT: %constexpr3 = extractelement <2 x i8> %constexpr2, i32 0 36941c8e0eSNikita Popov; CHECK-NEXT: ret i8 %constexpr3 37941c8e0eSNikita Popov ret i8 extractelement (<2 x i8> select (i1 icmp ne (i64 ptrtoint (ptr @g to i64), i64 0), <2 x i8> zeroinitializer, <2 x i8> <i8 0, i8 1>), i32 0) 38941c8e0eSNikita Popov} 39941c8e0eSNikita Popov 40941c8e0eSNikita Popovdefine <2 x i8> @test_insertelement() { 41941c8e0eSNikita Popov; CHECK-LABEL: define <2 x i8> @test_insertelement() { 42941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i32 43941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = insertelement <2 x i8> poison, i8 42, i32 %constexpr 44941c8e0eSNikita Popov; CHECK-NEXT: ret <2 x i8> %constexpr1 45941c8e0eSNikita Popov ret <2 x i8> insertelement (<2 x i8> poison, i8 42, i32 ptrtoint (ptr @g to i32)) 46941c8e0eSNikita Popov} 47941c8e0eSNikita Popov 48941c8e0eSNikita Popovdefine double @test_fneg() { 49941c8e0eSNikita Popov; CHECK-LABEL: define double @test_fneg() { 50941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 51941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = bitcast i64 %constexpr to double 52941c8e0eSNikita Popov; CHECK-NEXT: %constexpr2 = fneg double %constexpr1 53941c8e0eSNikita Popov ret double fneg (double bitcast (i64 ptrtoint (ptr @g to i64) to double)) 54941c8e0eSNikita Popov} 55941c8e0eSNikita Popov 56941c8e0eSNikita Popovdefine i64 @test_flags() { 57941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_flags() { 58941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 59941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = add nuw i64 %constexpr, 1 60941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %constexpr1 61941c8e0eSNikita Popov ret i64 add nuw (i64 ptrtoint (ptr @g to i64), i64 1) 62941c8e0eSNikita Popov} 63941c8e0eSNikita Popov 64941c8e0eSNikita Popovdefine <3 x i64> @test_vector() { 65941c8e0eSNikita Popov; CHECK-LABEL: define <3 x i64> @test_vector() { 66941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 67941c8e0eSNikita Popov; CHECK-NEXT: %constexpr.ins = insertelement <3 x i64> poison, i64 5, i32 0 68941c8e0eSNikita Popov; CHECK-NEXT: %constexpr.ins1 = insertelement <3 x i64> %constexpr.ins, i64 %constexpr, i32 1 69941c8e0eSNikita Popov; CHECK-NEXT: %constexpr.ins2 = insertelement <3 x i64> %constexpr.ins1, i64 7, i32 2 70941c8e0eSNikita Popov ret <3 x i64> <i64 5, i64 ptrtoint (ptr @g to i64), i64 7> 71941c8e0eSNikita Popov} 72941c8e0eSNikita Popov 73*d452d5e2SNikita Popovdefine [3 x i64] @test_array() { 74*d452d5e2SNikita Popov; CHECK-LABEL: define [3 x i64] @test_array() { 75*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 76*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr.ins = insertvalue [3 x i64] poison, i64 5, 0 77*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr.ins1 = insertvalue [3 x i64] %constexpr.ins, i64 %constexpr, 1 78*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr.ins2 = insertvalue [3 x i64] %constexpr.ins1, i64 7, 2 79*d452d5e2SNikita Popov ret [3 x i64] [i64 5, i64 ptrtoint (ptr @g to i64), i64 7] 80*d452d5e2SNikita Popov} 81*d452d5e2SNikita Popov 82*d452d5e2SNikita Popovdefine { i64, i64, i64 } @test_struct() { 83*d452d5e2SNikita Popov; CHECK-LABEL: define { i64, i64, i64 } @test_struct() { 84*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 85*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr.ins = insertvalue { i64, i64, i64 } poison, i64 5, 0 86*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr.ins1 = insertvalue { i64, i64, i64 } %constexpr.ins, i64 %constexpr, 1 87*d452d5e2SNikita Popov; CHECK-NEXT: %constexpr.ins2 = insertvalue { i64, i64, i64 } %constexpr.ins1, i64 7, 2 88*d452d5e2SNikita Popov ret { i64, i64, i64 } {i64 5, i64 ptrtoint (ptr @g to i64), i64 7} 89*d452d5e2SNikita Popov} 90*d452d5e2SNikita Popov 91941c8e0eSNikita Popovdefine i64 @test_reused_expr() { 92941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_reused_expr() { 93941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 94941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = add i64 %constexpr, %constexpr 95941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %constexpr1 96941c8e0eSNikita Popov ret i64 add (i64 ptrtoint (ptr @g to i64), i64 ptrtoint (ptr @g to i64)) 97941c8e0eSNikita Popov} 98941c8e0eSNikita Popov 99941c8e0eSNikita Popovdefine i64 @test_multiple_expanded_operands() { 100941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_multiple_expanded_operands() { 101941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 102941c8e0eSNikita Popov; CHECK-NEXT: %constexpr1 = ptrtoint ptr @g2 to i64 103941c8e0eSNikita Popov; CHECK-NEXT: %constexpr2 = add i64 %constexpr, %constexpr1 104941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %constexpr2 105941c8e0eSNikita Popov ret i64 add (i64 ptrtoint (ptr @g to i64), i64 ptrtoint (ptr @g2 to i64)) 106941c8e0eSNikita Popov} 107941c8e0eSNikita Popov 108941c8e0eSNikita Popovdefine i64 @test_mid_block(i64 %arg) { 109941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_mid_block(i64 %arg) { 110941c8e0eSNikita Popov; CHECK-NEXT: %x = mul i64 %arg, 3 111941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 112941c8e0eSNikita Popov; CHECK-NEXT: %add = add i64 %x, %constexpr 113941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %add 114941c8e0eSNikita Popov %x = mul i64 %arg, 3 115941c8e0eSNikita Popov %add = add i64 %x, ptrtoint (ptr @g to i64) 116941c8e0eSNikita Popov ret i64 %add 117941c8e0eSNikita Popov} 118941c8e0eSNikita Popov 119941c8e0eSNikita Popovdefine i64 @test_phi_non_critical_edge_block_before(i1 %c) { 120941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_phi_non_critical_edge_block_before(i1 %c) { 121941c8e0eSNikita Popov; CHECK: entry: 122941c8e0eSNikita Popov; CHECK-NEXT: br i1 %c, label %if, label %join 123941c8e0eSNikita Popov; CHECK: if: 124941c8e0eSNikita Popov; CHECK-NEXT: br label %phi.constexpr 125941c8e0eSNikita Popov; CHECK: phi.constexpr: 126941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 127941c8e0eSNikita Popov; CHECK-NEXT: br label %join 128941c8e0eSNikita Popov; CHECK: join: 129941c8e0eSNikita Popov; CHECK-NEXT: %phi = phi i64 [ 0, %entry ], [ %constexpr, %phi.constexpr ] 130941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %phi 131941c8e0eSNikita Popoventry: 132941c8e0eSNikita Popov br i1 %c, label %if, label %join 133941c8e0eSNikita Popov 134941c8e0eSNikita Popovif: 135941c8e0eSNikita Popov br label %join 136941c8e0eSNikita Popov 137941c8e0eSNikita Popovjoin: 138941c8e0eSNikita Popov %phi = phi i64 [ 0, %entry ], [ ptrtoint (ptr @g to i64), %if ] 139941c8e0eSNikita Popov ret i64 %phi 140941c8e0eSNikita Popov} 141941c8e0eSNikita Popov 142941c8e0eSNikita Popovdefine i64 @test_phi_non_critical_edge_block_after(i1 %c) { 143941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_phi_non_critical_edge_block_after(i1 %c) { 144941c8e0eSNikita Popov; CHECK: entry: 145941c8e0eSNikita Popov; CHECK-NEXT: br i1 %c, label %if, label %join 146941c8e0eSNikita Popov; CHECK: phi.constexpr: 147941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 148941c8e0eSNikita Popov; CHECK-NEXT: br label %join 149941c8e0eSNikita Popov; CHECK: join: 150941c8e0eSNikita Popov; CHECK-NEXT: %phi = phi i64 [ 0, %entry ], [ %constexpr, %phi.constexpr ] 151941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %phi 152941c8e0eSNikita Popov; CHECK: if: 153941c8e0eSNikita Popov; CHECK-NEXT: br label %phi.constexpr 154941c8e0eSNikita Popoventry: 155941c8e0eSNikita Popov br i1 %c, label %if, label %join 156941c8e0eSNikita Popov 157941c8e0eSNikita Popovjoin: 158941c8e0eSNikita Popov %phi = phi i64 [ 0, %entry ], [ ptrtoint (ptr @g to i64), %if ] 159941c8e0eSNikita Popov ret i64 %phi 160941c8e0eSNikita Popov 161941c8e0eSNikita Popovif: 162941c8e0eSNikita Popov br label %join 163941c8e0eSNikita Popov} 164941c8e0eSNikita Popov 165941c8e0eSNikita Popovdefine i64 @test_phi_critical_edge(i1 %c) { 166941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_phi_critical_edge(i1 %c) { 167941c8e0eSNikita Popov; CHECK: entry: 168941c8e0eSNikita Popov; CHECK-NEXT: br i1 %c, label %if, label %phi.constexpr 169941c8e0eSNikita Popov; CHECK: if: 170941c8e0eSNikita Popov; CHECK-NEXT: br label %join 171941c8e0eSNikita Popov; CHECK: phi.constexpr: 172941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 173941c8e0eSNikita Popov; CHECK-NEXT: br label %join 174941c8e0eSNikita Popov; CHECK: join: 175941c8e0eSNikita Popov; CHECK-NEXT: %phi = phi i64 [ %constexpr, %phi.constexpr ], [ 0, %if ] 176941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %phi 177941c8e0eSNikita Popoventry: 178941c8e0eSNikita Popov br i1 %c, label %if, label %join 179941c8e0eSNikita Popov 180941c8e0eSNikita Popovif: 181941c8e0eSNikita Popov br label %join 182941c8e0eSNikita Popov 183941c8e0eSNikita Popovjoin: 184941c8e0eSNikita Popov %phi = phi i64 [ ptrtoint (ptr @g to i64), %entry ], [ 0, %if ] 185941c8e0eSNikita Popov ret i64 %phi 186941c8e0eSNikita Popov} 187941c8e0eSNikita Popov 188941c8e0eSNikita Popovdefine i64 @test_phi_multiple_nodes(i1 %c) { 189941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_phi_multiple_nodes(i1 %c) { 190941c8e0eSNikita Popov; CHECK: entry: 191941c8e0eSNikita Popov; CHECK-NEXT: br i1 %c, label %if, label %join 192941c8e0eSNikita Popov; CHECK: if: 193941c8e0eSNikita Popov; CHECK-NEXT: br label %phi.constexpr 194941c8e0eSNikita Popov; CHECK: phi.constexpr: 195941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 196941c8e0eSNikita Popov; CHECK-NEXT: %constexpr2 = ptrtoint ptr @g2 to i64 197941c8e0eSNikita Popov; CHECK-NEXT: br label %join 198941c8e0eSNikita Popov; CHECK: join: 199941c8e0eSNikita Popov; CHECK-NEXT: %phi = phi i64 [ 0, %entry ], [ %constexpr, %phi.constexpr ] 200941c8e0eSNikita Popov; CHECK-NEXT: %phi2 = phi i64 [ 0, %entry ], [ %constexpr2, %phi.constexpr ] 201941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %phi 202941c8e0eSNikita Popoventry: 203941c8e0eSNikita Popov br i1 %c, label %if, label %join 204941c8e0eSNikita Popov 205941c8e0eSNikita Popovif: 206941c8e0eSNikita Popov br label %join 207941c8e0eSNikita Popov 208941c8e0eSNikita Popovjoin: 209941c8e0eSNikita Popov %phi = phi i64 [ 0, %entry ], [ ptrtoint (ptr @g to i64), %if ] 210941c8e0eSNikita Popov %phi2 = phi i64 [ 0, %entry ], [ ptrtoint (ptr @g2 to i64), %if ] 211941c8e0eSNikita Popov ret i64 %phi 212941c8e0eSNikita Popov} 213941c8e0eSNikita Popov 214941c8e0eSNikita Popov 215941c8e0eSNikita Popovdefine i64 @test_phi_multiple_identical_predecessors(i32 %x) { 216941c8e0eSNikita Popov; CHECK-LABEL: define i64 @test_phi_multiple_identical_predecessors(i32 %x) { 217941c8e0eSNikita Popov; CHECK: entry: 218941c8e0eSNikita Popov; CHECK-NEXT: switch i32 %x, label %default [ 219941c8e0eSNikita Popov; CHECK-NEXT: i32 0, label %phi.constexpr 220941c8e0eSNikita Popov; CHECK-NEXT: i32 1, label %phi.constexpr 221941c8e0eSNikita Popov; CHECK-NEXT: ] 222941c8e0eSNikita Popov; CHECK: default: 223941c8e0eSNikita Popov; CHECK-NEXT: br label %join 224941c8e0eSNikita Popov; CHECK: phi.constexpr: 225941c8e0eSNikita Popov; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 226941c8e0eSNikita Popov; CHECK-NEXT: br label %join 227941c8e0eSNikita Popov; CHECK: join: 228941c8e0eSNikita Popov; CHECK-NEXT: %phi = phi i64 [ %constexpr, %phi.constexpr ], [ %constexpr, %phi.constexpr ], [ 0, %default ] 229941c8e0eSNikita Popov; CHECK-NEXT: ret i64 %phi 230941c8e0eSNikita Popoventry: 231941c8e0eSNikita Popov switch i32 %x, label %default [ 232941c8e0eSNikita Popov i32 0, label %join 233941c8e0eSNikita Popov i32 1, label %join 234941c8e0eSNikita Popov ] 235941c8e0eSNikita Popov 236941c8e0eSNikita Popovdefault: 237941c8e0eSNikita Popov br label %join 238941c8e0eSNikita Popov 239941c8e0eSNikita Popovjoin: 240941c8e0eSNikita Popov %phi = phi i64 [ ptrtoint (ptr @g to i64), %entry ], [ ptrtoint (ptr @g to i64), %entry ], [ 0, %default ] 241941c8e0eSNikita Popov ret i64 %phi 242941c8e0eSNikita Popov} 243