1; RUN: opt -passes=sroa -S < %s | FileCheck %s 2 3; This test checks that SROA does not introduce ptrtoint and inttoptr 4; casts from and to non-integral pointers. The "ni:4" bit in the 5; datalayout states that pointers of address space 4 are to be 6; considered "non-integral". 7 8target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:4" 9target triple = "x86_64-unknown-linux-gnu" 10 11define void @f0(i1 %alwaysFalse, i64 %val) { 12; CHECK-LABEL: @f0( 13; CHECK-NOT: inttoptr 14; CHECK-NOT: ptrtoint 15entry: 16 %loc = alloca i64 17 store i64 %val, ptr %loc 18 br i1 %alwaysFalse, label %neverTaken, label %alwaysTaken 19 20neverTaken: 21 %ptr = load ptr addrspace(4), ptr %loc 22 store i8 5, ptr addrspace(4) %ptr 23 ret void 24 25alwaysTaken: 26 ret void 27} 28 29define i64 @f1(i1 %alwaysFalse, ptr addrspace(4) %val) { 30; CHECK-LABEL: @f1( 31; CHECK-NOT: inttoptr 32; CHECK-NOT: ptrtoint 33entry: 34 %loc = alloca ptr addrspace(4) 35 store ptr addrspace(4) %val, ptr %loc 36 br i1 %alwaysFalse, label %neverTaken, label %alwaysTaken 37 38neverTaken: 39 %int = load i64, ptr %loc 40 ret i64 %int 41 42alwaysTaken: 43 ret i64 42 44} 45 46define ptr addrspace(4) @memset(i1 %alwaysFalse) { 47; CHECK-LABEL: @memset( 48; CHECK-NOT: inttoptr 49; CHECK-NOT: ptrtoint 50entry: 51 %x = alloca ptr addrspace(4) 52 call void @llvm.memset.p0.i64(ptr align 8 %x, i8 5, i64 16, i1 false) 53 br i1 %alwaysFalse, label %neverTaken, label %alwaysTaken 54 55neverTaken: 56 %x.field.ld.0 = load ptr addrspace(4), ptr %x 57 ret ptr addrspace(4) %x.field.ld.0 58 59alwaysTaken: 60 ret ptr addrspace(4) null 61} 62 63;; TODO: This one demonstrates a missed oppurtunity. The only known bit 64;; pattern for a non-integral bit pattern is that null is zero. As such 65;; we could do SROA and replace the memset w/a null store. This will 66;; usually be gotten by instcombine. 67define ptr addrspace(4) @memset_null(i1 %alwaysFalse) { 68; CHECK-LABEL: @memset_null( 69; CHECK-NOT: inttoptr 70; CHECK-NOT: ptrtoint 71entry: 72 %x = alloca ptr addrspace(4) 73 call void @llvm.memset.p0.i64(ptr align 8 %x, i8 0, i64 16, i1 false) 74 br i1 %alwaysFalse, label %neverTaken, label %alwaysTaken 75 76neverTaken: 77 %x.field.ld.0 = load ptr addrspace(4), ptr %x 78 ret ptr addrspace(4) %x.field.ld.0 79 80alwaysTaken: 81 ret ptr addrspace(4) null 82} 83 84%union.anon = type { ptr } 85 86; CHECK-LABEL: @f2( 87; CHECK-NOT: ptr2int 88; CHECK-NOT: int2ptr 89define ptr@f2(ptr addrspace(4) %p) { 90 %1 = alloca %union.anon, align 8 91 store ptr addrspace(4) %p, ptr %1, align 8 92 %2 = load ptr, ptr %1, align 8 93 ret ptr %2 94} 95 96declare void @llvm.memset.p0.i64(ptr, i8, i64, i1) 97