|
1 |
| -; RUN: opt < %s -passes=dfsan -dfsan-track-origins=1 -S | FileCheck %s |
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| 2 | +; RUN: opt < %s -passes=dfsan -dfsan-track-origins=1 -dfsan-add-global-name-suffix=0 -S | FileCheck %s |
2 | 3 | ;
|
3 | 4 | ; %i13 and %i15 have the same key in shadow cache. They should not reuse the same
|
4 | 5 | ; shadow because their blocks do not dominate each other. Origin tracking
|
|
7 | 8 | target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
|
8 | 9 | target triple = "x86_64-unknown-linux-gnu"
|
9 | 10 |
|
10 |
| -; CHECK: @__dfsan_arg_tls = external thread_local(initialexec) global [[TLS_ARR:\[100 x i64\]]] |
11 | 11 | define void @cached_shadows(double %arg) {
|
12 |
| - ; CHECK: @cached_shadows.dfsan |
13 |
| - ; CHECK: [[AO:%.*]] = load i32, ptr @__dfsan_arg_origin_tls, align |
14 |
| - ; CHECK: [[AS:%.*]] = load i8, ptr @__dfsan_arg_tls, align [[ALIGN:2]] |
15 |
| - ; CHECK: [[L1:.+]]: |
16 |
| - ; CHECK: {{.*}} = phi i8 |
17 |
| - ; CHECK: {{.*}} = phi i32 |
18 |
| - ; CHECK: {{.*}} = phi double [ 3.000000e+00 |
19 |
| - ; CHECK: [[S_L1:%.*]] = phi i8 [ 0, %[[L0:.*]] ], [ [[S_L7:%.*]], %[[L7:.*]] ] |
20 |
| - ; CHECK: [[O_L1:%.*]] = phi i32 [ 0, %[[L0]] ], [ [[O_L7:%.*]], %[[L7]] ] |
21 |
| - ; CHECK: [[V_L1:%.*]] = phi double [ 4.000000e+00, %[[L0]] ], [ [[V_L7:%.*]], %[[L7]] ] |
22 |
| - ; CHECK: br i1 {{%.+}}, label %[[L2:.*]], label %[[L4:.*]] |
23 |
| - ; CHECK: [[L2]]: |
24 |
| - ; CHECK: br i1 {{%.+}}, label %[[L3:.+]], label %[[L7]] |
25 |
| - ; CHECK: [[L3]]: |
26 |
| - ; CHECK: [[S_L3:%.*]] = or i8 |
27 |
| - ; CHECK: [[AS_NE_L3:%.*]] = icmp ne i8 [[AS]], 0 |
28 |
| - ; CHECK: [[O_L3:%.*]] = select i1 [[AS_NE_L3]], i32 %{{[0-9]+}}, i32 [[O_L1]] |
29 |
| - ; CHECK: [[V_L3:%.*]] = fsub double [[V_L1]], %{{.+}} |
30 |
| - ; CHECK: br label %[[L7]] |
31 |
| - ; CHECK: [[L4]]: |
32 |
| - ; CHECK: br i1 %_dfscmp, label %[[L5:.+]], label %[[L6:.+]], |
33 |
| - ; CHECK: [[L5]]: |
34 |
| - ; CHECK: br label %[[L6]] |
35 |
| - ; CHECK: [[L6]]: |
36 |
| - ; CHECK: [[S_L6:%.*]] = or i8 |
37 |
| - ; CHECK: [[AS_NE_L6:%.*]] = icmp ne i8 [[AS]], 0 |
38 |
| - ; CHECK: [[O_L6:%.*]] = select i1 [[AS_NE_L6]], i32 [[AO]], i32 [[O_L1]] |
39 |
| - ; CHECK: [[V_L6:%.*]] = fadd double [[V_L1]], %{{.+}} |
40 |
| - ; CHECK: br label %[[L7]] |
41 |
| - ; CHECK: [[L7]]: |
42 |
| - ; CHECK: [[S_L7]] = phi i8 [ [[S_L3]], %[[L3]] ], [ [[S_L1]], %[[L2]] ], [ [[S_L6]], %[[L6]] ] |
43 |
| - ; CHECK: [[O_L7]] = phi i32 [ [[O_L3]], %[[L3]] ], [ [[O_L1]], %[[L2]] ], [ [[O_L6]], %[[L6]] ] |
44 |
| - ; CHECK: [[V_L7]] = phi double [ [[V_L3]], %[[L3]] ], [ [[V_L1]], %[[L2]] ], [ [[V_L6]], %[[L6]] ] |
45 |
| - ; CHECK: br i1 %{{.+}}, label %[[L1]], label %[[L8:.+]] |
46 |
| - ; CHECK: [[L8]]: |
| 12 | +; CHECK-LABEL: define void @cached_shadows( |
| 13 | +; CHECK-SAME: double [[ARG:%.*]]) { |
| 14 | +; CHECK-NEXT: [[BB:.*]]: |
| 15 | +; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @__dfsan_arg_origin_tls, align 4 |
| 16 | +; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr @__dfsan_arg_tls, align 2 |
| 17 | +; CHECK-NEXT: [[I:%.*]] = alloca double, align 8 |
| 18 | +; CHECK-NEXT: [[I1:%.*]] = alloca double, align 8 |
| 19 | +; CHECK-NEXT: [[I2:%.*]] = bitcast ptr [[I]] to ptr |
| 20 | +; CHECK-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[I]] to i64 |
| 21 | +; CHECK-NEXT: [[TMP3:%.*]] = xor i64 [[TMP2]], 87960930222080 |
| 22 | +; CHECK-NEXT: [[TMP4:%.*]] = inttoptr i64 [[TMP3]] to ptr |
| 23 | +; CHECK-NEXT: store i64 0, ptr [[TMP4]], align 1 |
| 24 | +; CHECK-NEXT: store volatile double 1.000000e+00, ptr [[I]], align 8 |
| 25 | +; CHECK-NEXT: [[I3:%.*]] = bitcast ptr [[I1]] to ptr |
| 26 | +; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[I1]] to i64 |
| 27 | +; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 87960930222080 |
| 28 | +; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr |
| 29 | +; CHECK-NEXT: store i64 0, ptr [[TMP7]], align 1 |
| 30 | +; CHECK-NEXT: store volatile double 2.000000e+00, ptr [[I1]], align 8 |
| 31 | +; CHECK-NEXT: br label %[[BB4:.*]] |
| 32 | +; CHECK: [[BB4]]: |
| 33 | +; CHECK-NEXT: [[TMP8:%.*]] = phi i8 [ 0, %[[BB]] ], [ [[TMP76:%.*]], %[[BB16:.*]] ] |
| 34 | +; CHECK-NEXT: [[TMP9:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[TMP77:%.*]], %[[BB16]] ] |
| 35 | +; CHECK-NEXT: [[I5:%.*]] = phi double [ 3.000000e+00, %[[BB]] ], [ [[I17:%.*]], %[[BB16]] ] |
| 36 | +; CHECK-NEXT: [[TMP10:%.*]] = phi i8 [ 0, %[[BB]] ], [ [[TMP78:%.*]], %[[BB16]] ] |
| 37 | +; CHECK-NEXT: [[TMP11:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[TMP79:%.*]], %[[BB16]] ] |
| 38 | +; CHECK-NEXT: [[I6:%.*]] = phi double [ 4.000000e+00, %[[BB]] ], [ [[I18:%.*]], %[[BB16]] ] |
| 39 | +; CHECK-NEXT: [[TMP12:%.*]] = ptrtoint ptr [[I1]] to i64 |
| 40 | +; CHECK-NEXT: [[TMP13:%.*]] = xor i64 [[TMP12]], 87960930222080 |
| 41 | +; CHECK-NEXT: [[TMP14:%.*]] = inttoptr i64 [[TMP13]] to ptr |
| 42 | +; CHECK-NEXT: [[TMP15:%.*]] = add i64 [[TMP13]], 17592186044416 |
| 43 | +; CHECK-NEXT: [[TMP16:%.*]] = inttoptr i64 [[TMP15]] to ptr |
| 44 | +; CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 8 |
| 45 | +; CHECK-NEXT: [[TMP18:%.*]] = load i64, ptr [[TMP14]], align 1 |
| 46 | +; CHECK-NEXT: [[TMP19:%.*]] = shl i64 [[TMP18]], 32 |
| 47 | +; CHECK-NEXT: [[TMP20:%.*]] = getelementptr i32, ptr [[TMP16]], i64 1 |
| 48 | +; CHECK-NEXT: [[TMP21:%.*]] = load i32, ptr [[TMP20]], align 8 |
| 49 | +; CHECK-NEXT: [[TMP22:%.*]] = lshr i64 [[TMP18]], 32 |
| 50 | +; CHECK-NEXT: [[TMP23:%.*]] = or i64 [[TMP18]], [[TMP22]] |
| 51 | +; CHECK-NEXT: [[TMP24:%.*]] = lshr i64 [[TMP23]], 16 |
| 52 | +; CHECK-NEXT: [[TMP25:%.*]] = or i64 [[TMP23]], [[TMP24]] |
| 53 | +; CHECK-NEXT: [[TMP26:%.*]] = lshr i64 [[TMP25]], 8 |
| 54 | +; CHECK-NEXT: [[TMP27:%.*]] = or i64 [[TMP25]], [[TMP26]] |
| 55 | +; CHECK-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i8 |
| 56 | +; CHECK-NEXT: [[TMP29:%.*]] = icmp ne i64 [[TMP19]], 0 |
| 57 | +; CHECK-NEXT: [[TMP30:%.*]] = select i1 [[TMP29]], i32 [[TMP17]], i32 [[TMP21]] |
| 58 | +; CHECK-NEXT: [[I7:%.*]] = load volatile double, ptr [[I1]], align 8 |
| 59 | +; CHECK-NEXT: [[I8:%.*]] = fcmp une double [[I7]], 0.000000e+00 |
| 60 | +; CHECK-NEXT: [[TMP31:%.*]] = ptrtoint ptr [[I1]] to i64 |
| 61 | +; CHECK-NEXT: [[TMP32:%.*]] = xor i64 [[TMP31]], 87960930222080 |
| 62 | +; CHECK-NEXT: [[TMP33:%.*]] = inttoptr i64 [[TMP32]] to ptr |
| 63 | +; CHECK-NEXT: [[TMP34:%.*]] = add i64 [[TMP32]], 17592186044416 |
| 64 | +; CHECK-NEXT: [[TMP35:%.*]] = inttoptr i64 [[TMP34]] to ptr |
| 65 | +; CHECK-NEXT: [[TMP36:%.*]] = load i32, ptr [[TMP35]], align 8 |
| 66 | +; CHECK-NEXT: [[TMP37:%.*]] = load i64, ptr [[TMP33]], align 1 |
| 67 | +; CHECK-NEXT: [[TMP38:%.*]] = shl i64 [[TMP37]], 32 |
| 68 | +; CHECK-NEXT: [[TMP39:%.*]] = getelementptr i32, ptr [[TMP35]], i64 1 |
| 69 | +; CHECK-NEXT: [[TMP40:%.*]] = load i32, ptr [[TMP39]], align 8 |
| 70 | +; CHECK-NEXT: [[TMP41:%.*]] = lshr i64 [[TMP37]], 32 |
| 71 | +; CHECK-NEXT: [[TMP42:%.*]] = or i64 [[TMP37]], [[TMP41]] |
| 72 | +; CHECK-NEXT: [[TMP43:%.*]] = lshr i64 [[TMP42]], 16 |
| 73 | +; CHECK-NEXT: [[TMP44:%.*]] = or i64 [[TMP42]], [[TMP43]] |
| 74 | +; CHECK-NEXT: [[TMP45:%.*]] = lshr i64 [[TMP44]], 8 |
| 75 | +; CHECK-NEXT: [[TMP46:%.*]] = or i64 [[TMP44]], [[TMP45]] |
| 76 | +; CHECK-NEXT: [[TMP47:%.*]] = trunc i64 [[TMP46]] to i8 |
| 77 | +; CHECK-NEXT: [[TMP48:%.*]] = icmp ne i64 [[TMP38]], 0 |
| 78 | +; CHECK-NEXT: [[TMP49:%.*]] = select i1 [[TMP48]], i32 [[TMP36]], i32 [[TMP40]] |
| 79 | +; CHECK-NEXT: [[I9:%.*]] = load volatile double, ptr [[I1]], align 8 |
| 80 | +; CHECK-NEXT: br i1 [[I8]], label %[[BB10:.*]], label %[[BB14:.*]] |
| 81 | +; CHECK: [[BB10]]: |
| 82 | +; CHECK-NEXT: [[I11:%.*]] = fcmp une double [[I9]], 0.000000e+00 |
| 83 | +; CHECK-NEXT: br i1 [[I11]], label %[[BB12:.*]], label %[[BB16]] |
| 84 | +; CHECK: [[BB12]]: |
| 85 | +; CHECK-NEXT: [[TMP50:%.*]] = or i8 [[TMP10]], [[TMP1]] |
| 86 | +; CHECK-NEXT: [[TMP51:%.*]] = icmp ne i8 [[TMP1]], 0 |
| 87 | +; CHECK-NEXT: [[TMP52:%.*]] = select i1 [[TMP51]], i32 [[TMP0]], i32 [[TMP11]] |
| 88 | +; CHECK-NEXT: [[I13:%.*]] = fsub double [[I6]], [[ARG]] |
| 89 | +; CHECK-NEXT: br label %[[BB16]] |
| 90 | +; CHECK: [[BB14]]: |
| 91 | +; CHECK-NEXT: [[TMP53:%.*]] = ptrtoint ptr [[I]] to i64 |
| 92 | +; CHECK-NEXT: [[TMP54:%.*]] = xor i64 [[TMP53]], 87960930222080 |
| 93 | +; CHECK-NEXT: [[TMP55:%.*]] = inttoptr i64 [[TMP54]] to ptr |
| 94 | +; CHECK-NEXT: [[TMP56:%.*]] = add i64 [[TMP54]], 17592186044416 |
| 95 | +; CHECK-NEXT: [[TMP57:%.*]] = inttoptr i64 [[TMP56]] to ptr |
| 96 | +; CHECK-NEXT: [[TMP58:%.*]] = insertelement <8 x i8> poison, i8 [[TMP47]], i32 0 |
| 97 | +; CHECK-NEXT: [[TMP59:%.*]] = insertelement <8 x i8> [[TMP58]], i8 [[TMP47]], i32 1 |
| 98 | +; CHECK-NEXT: [[TMP60:%.*]] = insertelement <8 x i8> [[TMP59]], i8 [[TMP47]], i32 2 |
| 99 | +; CHECK-NEXT: [[TMP61:%.*]] = insertelement <8 x i8> [[TMP60]], i8 [[TMP47]], i32 3 |
| 100 | +; CHECK-NEXT: [[TMP62:%.*]] = insertelement <8 x i8> [[TMP61]], i8 [[TMP47]], i32 4 |
| 101 | +; CHECK-NEXT: [[TMP63:%.*]] = insertelement <8 x i8> [[TMP62]], i8 [[TMP47]], i32 5 |
| 102 | +; CHECK-NEXT: [[TMP64:%.*]] = insertelement <8 x i8> [[TMP63]], i8 [[TMP47]], i32 6 |
| 103 | +; CHECK-NEXT: [[TMP65:%.*]] = insertelement <8 x i8> [[TMP64]], i8 [[TMP47]], i32 7 |
| 104 | +; CHECK-NEXT: [[TMP66:%.*]] = getelementptr <8 x i8>, ptr [[TMP55]], i32 0 |
| 105 | +; CHECK-NEXT: store <8 x i8> [[TMP65]], ptr [[TMP66]], align 1 |
| 106 | +; CHECK-NEXT: [[_DFSCMP:%.*]] = icmp ne i8 [[TMP47]], 0 |
| 107 | +; CHECK-NEXT: br i1 [[_DFSCMP]], label %[[BB67:.*]], label %[[BB72:.*]], !prof [[PROF1:![0-9]+]] |
| 108 | +; CHECK: [[BB67]]: |
| 109 | +; CHECK-NEXT: [[TMP68:%.*]] = call i32 @__dfsan_chain_origin(i32 [[TMP49]]) |
| 110 | +; CHECK-NEXT: [[TMP69:%.*]] = zext i32 [[TMP68]] to i64 |
| 111 | +; CHECK-NEXT: [[TMP70:%.*]] = shl i64 [[TMP69]], 32 |
| 112 | +; CHECK-NEXT: [[TMP71:%.*]] = or i64 [[TMP69]], [[TMP70]] |
| 113 | +; CHECK-NEXT: store i64 [[TMP71]], ptr [[TMP57]], align 8 |
| 114 | +; CHECK-NEXT: br label %[[BB72]] |
| 115 | +; CHECK: [[BB72]]: |
| 116 | +; CHECK-NEXT: store volatile double [[I9]], ptr [[I]], align 8 |
| 117 | +; CHECK-NEXT: [[TMP73:%.*]] = or i8 [[TMP10]], [[TMP1]] |
| 118 | +; CHECK-NEXT: [[TMP74:%.*]] = icmp ne i8 [[TMP1]], 0 |
| 119 | +; CHECK-NEXT: [[TMP75:%.*]] = select i1 [[TMP74]], i32 [[TMP0]], i32 [[TMP11]] |
| 120 | +; CHECK-NEXT: [[I15:%.*]] = fadd double [[I6]], [[ARG]] |
| 121 | +; CHECK-NEXT: br label %[[BB16]] |
| 122 | +; CHECK: [[BB16]]: |
| 123 | +; CHECK-NEXT: [[TMP76]] = phi i8 [ [[TMP10]], %[[BB12]] ], [ [[TMP8]], %[[BB10]] ], [ [[TMP10]], %[[BB72]] ] |
| 124 | +; CHECK-NEXT: [[TMP77]] = phi i32 [ [[TMP11]], %[[BB12]] ], [ [[TMP9]], %[[BB10]] ], [ [[TMP11]], %[[BB72]] ] |
| 125 | +; CHECK-NEXT: [[I17]] = phi double [ [[I6]], %[[BB12]] ], [ [[I5]], %[[BB10]] ], [ [[I6]], %[[BB72]] ] |
| 126 | +; CHECK-NEXT: [[TMP78]] = phi i8 [ [[TMP50]], %[[BB12]] ], [ [[TMP10]], %[[BB10]] ], [ [[TMP73]], %[[BB72]] ] |
| 127 | +; CHECK-NEXT: [[TMP79]] = phi i32 [ [[TMP52]], %[[BB12]] ], [ [[TMP11]], %[[BB10]] ], [ [[TMP75]], %[[BB72]] ] |
| 128 | +; CHECK-NEXT: [[I18]] = phi double [ [[I13]], %[[BB12]] ], [ [[I6]], %[[BB10]] ], [ [[I15]], %[[BB72]] ] |
| 129 | +; CHECK-NEXT: [[I19:%.*]] = fcmp olt double [[I17]], 9.900000e+01 |
| 130 | +; CHECK-NEXT: br i1 [[I19]], label %[[BB4]], label %[[BB20:.*]] |
| 131 | +; CHECK: [[BB20]]: |
| 132 | +; CHECK-NEXT: ret void |
| 133 | +; |
47 | 134 | bb:
|
48 | 135 | %i = alloca double, align 8
|
49 | 136 | %i1 = alloca double, align 8
|
@@ -83,3 +170,6 @@ bb16: ; preds = %bb14, %bb12, %bb10
|
83 | 170 | bb20: ; preds = %bb16
|
84 | 171 | ret void
|
85 | 172 | }
|
| 173 | +;. |
| 174 | +; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 1048575} |
| 175 | +;. |
0 commit comments