1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=newgvn < %s | FileCheck %s 3 4define ptr addrspace(1) @addrspacecast(ptr %ptr) { 5; CHECK-LABEL: @addrspacecast( 6; CHECK-NEXT: block1: 7; CHECK-NEXT: [[Z1:%.*]] = addrspacecast ptr [[PTR:%.*]] to ptr addrspace(1) 8; CHECK-NEXT: br label [[BLOCK2:%.*]] 9; CHECK: block2: 10; CHECK-NEXT: store ptr addrspace(1) [[Z1]], ptr undef, align 8 11; CHECK-NEXT: ret ptr addrspace(1) [[Z1]] 12; 13block1: 14 %z1 = addrspacecast ptr %ptr to ptr addrspace(1) 15 br label %block2 16 17block2: 18 %z2 = addrspacecast ptr %ptr to ptr addrspace(1) 19 store ptr addrspace(1) %z1, ptr undef 20 ret ptr addrspace(1) %z2 21} 22 23; Make sure casts with the same source value but different result 24; address spaces aren't incorrectly merged. 25define ptr addrspace(1) @addrspacecast_different_result_types(ptr %ptr) { 26; CHECK-LABEL: @addrspacecast_different_result_types( 27; CHECK-NEXT: block1: 28; CHECK-NEXT: [[Z1:%.*]] = addrspacecast ptr [[PTR:%.*]] to ptr addrspace(2) 29; CHECK-NEXT: br label [[BLOCK2:%.*]] 30; CHECK: block2: 31; CHECK-NEXT: [[Z2:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(1) 32; CHECK-NEXT: store ptr addrspace(2) [[Z1]], ptr undef, align 8 33; CHECK-NEXT: ret ptr addrspace(1) [[Z2]] 34; 35block1: 36 %z1 = addrspacecast ptr %ptr to ptr addrspace(2) 37 br label %block2 38 39block2: 40 %z2 = addrspacecast ptr %ptr to ptr addrspace(1) 41 store ptr addrspace(2) %z1, ptr undef 42 ret ptr addrspace(1) %z2 43} 44 45define ptr addrspace(1) @addrspacecast_simplify(ptr addrspace(1) %ptr) { 46; CHECK-LABEL: @addrspacecast_simplify( 47; CHECK-NEXT: block1: 48; CHECK-NEXT: [[CAST0:%.*]] = addrspacecast ptr addrspace(1) [[PTR:%.*]] to ptr 49; CHECK-NEXT: br label [[BLOCK2:%.*]] 50; CHECK: block2: 51; CHECK-NEXT: store ptr addrspace(1) [[PTR]], ptr undef, align 8 52; CHECK-NEXT: ret ptr addrspace(1) [[PTR]] 53; 54block1: 55 %cast0 = addrspacecast ptr addrspace(1) %ptr to ptr 56 %z1 = addrspacecast ptr %cast0 to ptr addrspace(1) 57 br label %block2 58 59block2: 60 %z2 = addrspacecast ptr %cast0 to ptr addrspace(1) 61 store ptr addrspace(1) %z1, ptr undef 62 ret ptr addrspace(1) %z2 63} 64 65@h = common local_unnamed_addr global ptr null, align 4 66 67define ptr addrspace(1) @addrspacecast_constant() { 68; CHECK-LABEL: @addrspacecast_constant( 69; CHECK-NEXT: block1: 70; CHECK-NEXT: store ptr undef, ptr @h, align 4 71; CHECK-NEXT: br label [[BLOCK2:%.*]] 72; CHECK: block2: 73; CHECK-NEXT: store ptr addrspace(1) undef, ptr undef, align 8 74; CHECK-NEXT: ret ptr addrspace(1) undef 75; 76block1: 77 store ptr undef, ptr @h, align 4 78 %ptr = load ptr, ptr @h, align 4 79 %z1 = addrspacecast ptr %ptr to ptr addrspace(1) 80 br label %block2 81 82block2: 83 %z2 = addrspacecast ptr %ptr to ptr addrspace(1) 84 store ptr addrspace(1) %z1, ptr undef 85 ret ptr addrspace(1) %z2 86} 87 88define ptr addrspace(1) @addrspacecast_leader(ptr %arg.ptr) { 89; CHECK-LABEL: @addrspacecast_leader( 90; CHECK-NEXT: block1: 91; CHECK-NEXT: [[LOAD0:%.*]] = load ptr, ptr [[ARG_PTR:%.*]], align 8 92; CHECK-NEXT: [[Z1:%.*]] = addrspacecast ptr [[LOAD0]] to ptr addrspace(1) 93; CHECK-NEXT: br label [[BLOCK2:%.*]] 94; CHECK: block2: 95; CHECK-NEXT: store ptr addrspace(1) [[Z1]], ptr undef, align 8 96; CHECK-NEXT: ret ptr addrspace(1) [[Z1]] 97; 98block1: 99 %load0 = load ptr, ptr %arg.ptr 100 %z1 = addrspacecast ptr %load0 to ptr addrspace(1) 101 br label %block2 102 103block2: 104 %load1 = load ptr, ptr %arg.ptr 105 %z2 = addrspacecast ptr %load1 to ptr addrspace(1) 106 store ptr addrspace(1) %z1, ptr undef 107 ret ptr addrspace(1) %z2 108} 109