Peter Collingbourne | f72a8d4 | 2016-11-16 23:40:26 +0000 | [diff] [blame] | 1 | ; RUN: opt -S -globalsplit %s | FileCheck %s |
Davide Italiano | 2ae76dd | 2016-11-21 00:28:23 +0000 | [diff] [blame] | 2 | ; RUN: opt -S -passes=globalsplit %s | FileCheck %s |
Peter Collingbourne | f72a8d4 | 2016-11-16 23:40:26 +0000 | [diff] [blame] | 3 | |
| 4 | target datalayout = "e-p:64:64" |
| 5 | target triple = "x86_64-unknown-linux-gnu" |
| 6 | |
| 7 | ; CHECK: @vtt = constant [3 x i8*] [i8* bitcast ([2 x i8* ()*]* @global.0 to i8*), i8* bitcast (i8* ()** getelementptr inbounds ([2 x i8* ()*], [2 x i8* ()*]* @global.0, i32 0, i32 1) to i8*), i8* bitcast ([1 x i8* ()*]* @global.1 to i8*)] |
| 8 | @vtt = constant [3 x i8*] [ |
| 9 | i8* bitcast (i8* ()** getelementptr ({ [2 x i8* ()*], [1 x i8* ()*] }, { [2 x i8* ()*], [1 x i8* ()*] }* @global, i32 0, inrange i32 0, i32 0) to i8*), |
| 10 | i8* bitcast (i8* ()** getelementptr ({ [2 x i8* ()*], [1 x i8* ()*] }, { [2 x i8* ()*], [1 x i8* ()*] }* @global, i32 0, inrange i32 0, i32 1) to i8*), |
| 11 | i8* bitcast (i8* ()** getelementptr ({ [2 x i8* ()*], [1 x i8* ()*] }, { [2 x i8* ()*], [1 x i8* ()*] }* @global, i32 0, inrange i32 1, i32 0) to i8*) |
| 12 | ] |
| 13 | |
| 14 | ; CHECK-NOT: @global = |
| 15 | ; CHECK: @global.0 = private constant [2 x i8* ()*] [i8* ()* @f1, i8* ()* @f2], !type [[T1:![0-9]+$]] |
| 16 | ; CHECK: @global.1 = private constant [1 x i8* ()*] [i8* ()* @f3], !type [[T2:![0-9]+$]] |
| 17 | ; CHECK-NOT: @global = |
| 18 | @global = internal constant { [2 x i8* ()*], [1 x i8* ()*] } { |
| 19 | [2 x i8* ()*] [i8* ()* @f1, i8* ()* @f2], |
| 20 | [1 x i8* ()*] [i8* ()* @f3] |
| 21 | }, !type !0, !type !1 |
| 22 | |
| 23 | ; CHECK: define i8* @f1() |
| 24 | define i8* @f1() { |
| 25 | ; CHECK-NEXT: ret i8* bitcast ([2 x i8* ()*]* @global.0 to i8*) |
| 26 | ret i8* bitcast (i8* ()** getelementptr ({ [2 x i8* ()*], [1 x i8* ()*] }, { [2 x i8* ()*], [1 x i8* ()*] }* @global, i32 0, inrange i32 0, i32 0) to i8*) |
| 27 | } |
| 28 | |
| 29 | ; CHECK: define i8* @f2() |
| 30 | define i8* @f2() { |
| 31 | ; CHECK-NEXT: ret i8* bitcast (i8* ()** getelementptr inbounds ([2 x i8* ()*], [2 x i8* ()*]* @global.0, i32 0, i32 1) to i8*) |
| 32 | ret i8* bitcast (i8* ()** getelementptr ({ [2 x i8* ()*], [1 x i8* ()*] }, { [2 x i8* ()*], [1 x i8* ()*] }* @global, i32 0, inrange i32 0, i32 1) to i8*) |
| 33 | } |
| 34 | |
| 35 | ; CHECK: define i8* @f3() |
| 36 | define i8* @f3() { |
| 37 | ; CHECK-NEXT: ret i8* bitcast (i8* ()** getelementptr inbounds ([2 x i8* ()*], [2 x i8* ()*]* @global.0, i64 1, i32 0) to i8*) |
| 38 | ret i8* bitcast (i8* ()** getelementptr ({ [2 x i8* ()*], [1 x i8* ()*] }, { [2 x i8* ()*], [1 x i8* ()*] }* @global, i32 0, inrange i32 0, i32 2) to i8*) |
| 39 | } |
| 40 | |
| 41 | ; CHECK: define i8* @f4() |
| 42 | define i8* @f4() { |
| 43 | ; CHECK-NEXT: ret i8* bitcast ([1 x i8* ()*]* @global.1 to i8*) |
| 44 | ret i8* bitcast (i8* ()** getelementptr ({ [2 x i8* ()*], [1 x i8* ()*] }, { [2 x i8* ()*], [1 x i8* ()*] }* @global, i32 0, inrange i32 1, i32 0) to i8*) |
| 45 | } |
| 46 | |
| 47 | define void @foo() { |
| 48 | %p = call i1 @llvm.type.test(i8* null, metadata !"") |
| 49 | ret void |
| 50 | } |
| 51 | |
| 52 | declare i1 @llvm.type.test(i8*, metadata) nounwind readnone |
| 53 | |
| 54 | ; CHECK: [[T1]] = !{i32 8, !"foo"} |
| 55 | ; CHECK: [[T2]] = !{i32 0, !"bar"} |
| 56 | !0 = !{i32 8, !"foo"} |
| 57 | !1 = !{i32 16, !"bar"} |