1de24d084SMomchil Velikov; RUN: opt -S --passes=ipsccp,deadargelim --force-specialization < %s | FileCheck %s --check-prefix=NO-GLOBALS 2de24d084SMomchil Velikov; RUN: opt -S --passes=ipsccp,deadargelim --force-specialization --funcspec-on-address < %s | FileCheck %s --check-prefix=GLOBALS 3de24d084SMomchil Velikov@G = global [10 x i32] zeroinitializer, align 4 4de24d084SMomchil Velikov 5de24d084SMomchil Velikovdefine internal i32 @f(ptr %p) noinline { 6de24d084SMomchil Velikoventry: 7de24d084SMomchil Velikov %0 = load i32, ptr %p, align 4 8de24d084SMomchil Velikov store i32 0, ptr %p, align 4 9de24d084SMomchil Velikov ret i32 %0 10de24d084SMomchil Velikov} 11de24d084SMomchil Velikov 12de24d084SMomchil Velikovdefine internal i32 @g(i32 %x, i32 %y, ptr %p) noinline { 13de24d084SMomchil Velikoventry: 14de24d084SMomchil Velikov %cmp = icmp sgt i32 %x, %y 15de24d084SMomchil Velikov br i1 %cmp, label %if.then, label %if.else 16de24d084SMomchil Velikov 17de24d084SMomchil Velikovif.then: 18de24d084SMomchil Velikov br label %if.end 19de24d084SMomchil Velikov 20de24d084SMomchil Velikovif.else: 21de24d084SMomchil Velikov br label %if.end 22de24d084SMomchil Velikov 23de24d084SMomchil Velikovif.end: 24de24d084SMomchil Velikov %x.addr.0 = phi i32 [ %x, %if.then ], [ 11, %if.else ] 25de24d084SMomchil Velikov %p.addr.0 = phi ptr [ @G, %if.then ], [ %p, %if.else ] 26de24d084SMomchil Velikov %call = call i32 @f(ptr %p.addr.0) 27de24d084SMomchil Velikov %add = add nsw i32 %call, %x.addr.0 28de24d084SMomchil Velikov ret i32 %add 29de24d084SMomchil Velikov} 30de24d084SMomchil Velikov 31de24d084SMomchil Velikovdefine i32 @h0(ptr %p) { 32de24d084SMomchil Velikoventry: 33de24d084SMomchil Velikov %call = call i32 @g(i32 2, i32 1, ptr %p) 34de24d084SMomchil Velikov ret i32 %call 35de24d084SMomchil Velikov} 36de24d084SMomchil Velikov 37de24d084SMomchil Velikovdefine i32 @h1() { 38de24d084SMomchil Velikoventry: 39de24d084SMomchil Velikov %call = call i32 @f(ptr @G) 40de24d084SMomchil Velikov ret i32 %call 41de24d084SMomchil Velikov} 42de24d084SMomchil Velikov 43de24d084SMomchil Velikovdefine i32 @h2() { 44de24d084SMomchil Velikoventry: 45de24d084SMomchil Velikov %call = call i32 @f(ptr getelementptr inbounds (i32, ptr @G, i64 1)) 46de24d084SMomchil Velikov ret i32 %call 47de24d084SMomchil Velikov} 48de24d084SMomchil Velikov 49de24d084SMomchil Velikov; Check if specialisation on the address of a non-const global variable 50de24d084SMomchil Velikov; is not allowed, then it is not performed. 51de24d084SMomchil Velikov 52*93de97d7SAndreas Jonson; NO-GLOBALS-LABEL: define internal range(i32 -2147483646, -2147483648) i32 @g() 53de24d084SMomchil Velikov; NO-GLOBALS: call i32 @f(ptr @G) 54de24d084SMomchil Velikov 55*93de97d7SAndreas Jonson; NO-GLOBALS-LABEL: define range(i32 -2147483646, -2147483648) i32 @h0(ptr %p) 56de24d084SMomchil Velikov; NO-GLOBALS:call i32 @g() 57de24d084SMomchil Velikov 58de24d084SMomchil Velikov; NO-GLOBALS-LABEL: define i32 @h1() 59de24d084SMomchil Velikov; NO-GLOBALS: call i32 @f(ptr @G) 60de24d084SMomchil Velikov 61de24d084SMomchil Velikov; NO-GLOBALS-LABEL: define i32 @h2() 62de24d084SMomchil Velikov; NO-GLOBALS: call i32 @f(ptr getelementptr inbounds (i32, ptr @G, i64 1)) 63de24d084SMomchil Velikov 64de24d084SMomchil Velikov; Check if specialisation on the address of a non-const global variable 65de24d084SMomchil Velikov; is allowed, then it is performed where possible. 66de24d084SMomchil Velikov 67*93de97d7SAndreas Jonson; GLOBALS-LABEL: define internal range(i32 -2147483646, -2147483648) i32 @g() 68e15d72adSAlexandros Lamprineas; GLOBALS: call i32 @f.specialized.2() 69de24d084SMomchil Velikov 70*93de97d7SAndreas Jonson; GLOBALS-LABEL: define range(i32 -2147483646, -2147483648) i32 @h0(ptr %p) 71de24d084SMomchil Velikov; GLOBALS: call i32 @g() 72de24d084SMomchil Velikov 73de24d084SMomchil Velikov; GLOBALS-LABEL: define i32 @h1() 74e15d72adSAlexandros Lamprineas; GLOBALS: call i32 @f.specialized.2() 75de24d084SMomchil Velikov 76de24d084SMomchil Velikov; GLOBALS-LABEL: define i32 @h2() 77e15d72adSAlexandros Lamprineas; GLOBALS: call i32 @f.specialized.1() 78de24d084SMomchil Velikov 79