| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt < %s -passes=dfsan -dfsan-track-origins=1 -dfsan-add-global-name-suffix=0 -S | FileCheck %s |
| 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" |
| target triple = "x86_64-unknown-linux-gnu" |
| |
| define i32 @phiop(i32 %a, i32 %b, i1 %c) { |
| ; CHECK-LABEL: define i32 @phiop( |
| ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i1 [[C:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*]]: |
| ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr getelementptr inbounds ([200 x i32], ptr @__dfsan_arg_origin_tls, i64 0, i64 1), align 4 |
| ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__dfsan_arg_origin_tls, align 4 |
| ; CHECK-NEXT: [[TMP2:%.*]] = load i8, ptr getelementptr (i8, ptr @__dfsan_arg_tls, i64 2), align 2 |
| ; CHECK-NEXT: [[TMP3:%.*]] = load i8, ptr @__dfsan_arg_tls, align 2 |
| ; CHECK-NEXT: br i1 [[C]], label %[[NEXT:.*]], label %[[DONE:.*]] |
| ; CHECK: [[NEXT]]: |
| ; CHECK-NEXT: br i1 [[C]], label %[[T:.*]], label %[[F:.*]] |
| ; CHECK: [[T]]: |
| ; CHECK-NEXT: [[TMP4:%.*]] = or i8 [[TMP3]], [[TMP2]] |
| ; CHECK-NEXT: [[TMP5:%.*]] = icmp ne i8 [[TMP2]], 0 |
| ; CHECK-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], i32 [[TMP0]], i32 [[TMP1]] |
| ; CHECK-NEXT: [[SUM:%.*]] = add i32 [[A]], [[B]] |
| ; CHECK-NEXT: br label %[[DONE]] |
| ; CHECK: [[F]]: |
| ; CHECK-NEXT: [[TMP7:%.*]] = or i8 [[TMP2]], [[TMP3]] |
| ; CHECK-NEXT: [[TMP8:%.*]] = icmp ne i8 [[TMP3]], 0 |
| ; CHECK-NEXT: [[TMP9:%.*]] = select i1 [[TMP8]], i32 [[TMP1]], i32 [[TMP0]] |
| ; CHECK-NEXT: [[DIFF:%.*]] = sub i32 [[B]], [[A]] |
| ; CHECK-NEXT: br label %[[DONE]] |
| ; CHECK: [[DONE]]: |
| ; CHECK-NEXT: [[TMP10:%.*]] = phi i8 [ [[TMP4]], %[[T]] ], [ [[TMP7]], %[[F]] ], [ [[TMP3]], %[[ENTRY]] ] |
| ; CHECK-NEXT: [[TMP11:%.*]] = phi i32 [ [[TMP6]], %[[T]] ], [ [[TMP9]], %[[F]] ], [ [[TMP1]], %[[ENTRY]] ] |
| ; CHECK-NEXT: [[R:%.*]] = phi i32 [ [[SUM]], %[[T]] ], [ [[DIFF]], %[[F]] ], [ [[A]], %[[ENTRY]] ] |
| ; CHECK-NEXT: store i8 [[TMP10]], ptr @__dfsan_retval_tls, align 2 |
| ; CHECK-NEXT: store i32 [[TMP11]], ptr @__dfsan_retval_origin_tls, align 4 |
| ; CHECK-NEXT: ret i32 [[R]] |
| ; |
| entry: |
| br i1 %c, label %next, label %done |
| next: |
| br i1 %c, label %T, label %F |
| T: |
| %sum = add i32 %a, %b |
| br label %done |
| F: |
| %diff = sub i32 %b, %a |
| br label %done |
| done: |
| %r = phi i32 [%sum, %T], [%diff, %F], [%a, %entry] |
| ret i32 %r |
| } |