12f3ae2f6SVitaly Buka; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 22f3ae2f6SVitaly Buka; RUN: opt -passes=instcombine -S < %s | FileCheck %s 32f3ae2f6SVitaly Buka 42f3ae2f6SVitaly Bukatarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" 52f3ae2f6SVitaly Bukatarget triple = "x86_64-grtev4-linux-gnu" 62f3ae2f6SVitaly Buka 72f3ae2f6SVitaly Bukadefine i32 @test_plain(i1 %f) { 82f3ae2f6SVitaly Buka; CHECK-LABEL: @test_plain( 92f3ae2f6SVitaly Buka; CHECK-NEXT: entry: 102f3ae2f6SVitaly Buka; CHECK-NEXT: [[A:%.*]] = alloca i32, align 8 112f3ae2f6SVitaly Buka; CHECK-NEXT: [[B:%.*]] = alloca i32, align 8 122f3ae2f6SVitaly Buka; CHECK-NEXT: [[A_VAL:%.*]] = load i32, ptr [[A]], align 8 132f3ae2f6SVitaly Buka; CHECK-NEXT: [[B_VAL:%.*]] = load i32, ptr [[B]], align 8 142f3ae2f6SVitaly Buka; CHECK-NEXT: [[L:%.*]] = select i1 [[F:%.*]], i32 [[A_VAL]], i32 [[B_VAL]] 152f3ae2f6SVitaly Buka; CHECK-NEXT: ret i32 [[L]] 162f3ae2f6SVitaly Buka; 172f3ae2f6SVitaly Bukaentry: 182f3ae2f6SVitaly Buka %a = alloca i32, align 8 192f3ae2f6SVitaly Buka %b = alloca i32, align 8 202f3ae2f6SVitaly Buka %sel = select i1 %f, ptr %a, ptr %b 212f3ae2f6SVitaly Buka %l = load i32, ptr %sel, align 8 222f3ae2f6SVitaly Buka ret i32 %l 232f3ae2f6SVitaly Buka} 242f3ae2f6SVitaly Buka 252f3ae2f6SVitaly Buka; Don't speculate as the condition may control which memory is valid from 262f3ae2f6SVitaly Buka; sanitizer perspective. 272f3ae2f6SVitaly Bukadefine i32 @test_asan(i1 %f) sanitize_address { 282f3ae2f6SVitaly Buka; CHECK-LABEL: @test_asan( 292f3ae2f6SVitaly Buka; CHECK-NEXT: entry: 302f3ae2f6SVitaly Buka; CHECK-NEXT: [[A:%.*]] = alloca i32, align 8 312f3ae2f6SVitaly Buka; CHECK-NEXT: [[B:%.*]] = alloca i32, align 8 32*6dba99e1SVitaly Buka; CHECK-NEXT: [[SEL:%.*]] = select i1 [[F:%.*]], ptr [[A]], ptr [[B]] 33*6dba99e1SVitaly Buka; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[SEL]], align 8 342f3ae2f6SVitaly Buka; CHECK-NEXT: ret i32 [[L]] 352f3ae2f6SVitaly Buka; 362f3ae2f6SVitaly Bukaentry: 372f3ae2f6SVitaly Buka %a = alloca i32, align 8 382f3ae2f6SVitaly Buka %b = alloca i32, align 8 392f3ae2f6SVitaly Buka %sel = select i1 %f, ptr %a, ptr %b 402f3ae2f6SVitaly Buka %l = load i32, ptr %sel, align 8 412f3ae2f6SVitaly Buka ret i32 %l 422f3ae2f6SVitaly Buka} 432f3ae2f6SVitaly Buka 442f3ae2f6SVitaly Buka 452f3ae2f6SVitaly Buka; Don't speculate as the condition may control which memory is valid from 462f3ae2f6SVitaly Buka; sanitizer perspective. 472f3ae2f6SVitaly Bukadefine i32 @test_hwasan(i1 %f) sanitize_hwaddress { 482f3ae2f6SVitaly Buka; CHECK-LABEL: @test_hwasan( 492f3ae2f6SVitaly Buka; CHECK-NEXT: entry: 502f3ae2f6SVitaly Buka; CHECK-NEXT: [[A:%.*]] = alloca i32, align 8 512f3ae2f6SVitaly Buka; CHECK-NEXT: [[B:%.*]] = alloca i32, align 8 52*6dba99e1SVitaly Buka; CHECK-NEXT: [[SEL:%.*]] = select i1 [[F:%.*]], ptr [[A]], ptr [[B]] 53*6dba99e1SVitaly Buka; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[SEL]], align 8 542f3ae2f6SVitaly Buka; CHECK-NEXT: ret i32 [[L]] 552f3ae2f6SVitaly Buka; 562f3ae2f6SVitaly Bukaentry: 572f3ae2f6SVitaly Buka %a = alloca i32, align 8 582f3ae2f6SVitaly Buka %b = alloca i32, align 8 592f3ae2f6SVitaly Buka %sel = select i1 %f, ptr %a, ptr %b 602f3ae2f6SVitaly Buka %l = load i32, ptr %sel, align 8 612f3ae2f6SVitaly Buka ret i32 %l 622f3ae2f6SVitaly Buka} 632f3ae2f6SVitaly Buka 642f3ae2f6SVitaly Buka; Don't speculate as the condition may control which memory is valid from 652f3ae2f6SVitaly Buka; sanitizer perspective. 662f3ae2f6SVitaly Bukadefine i32 @test_tsan(i1 %f) sanitize_thread { 672f3ae2f6SVitaly Buka; CHECK-LABEL: @test_tsan( 682f3ae2f6SVitaly Buka; CHECK-NEXT: entry: 692f3ae2f6SVitaly Buka; CHECK-NEXT: [[A:%.*]] = alloca i32, align 8 702f3ae2f6SVitaly Buka; CHECK-NEXT: [[B:%.*]] = alloca i32, align 8 71*6dba99e1SVitaly Buka; CHECK-NEXT: [[SEL:%.*]] = select i1 [[F:%.*]], ptr [[A]], ptr [[B]] 72*6dba99e1SVitaly Buka; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[SEL]], align 8 732f3ae2f6SVitaly Buka; CHECK-NEXT: ret i32 [[L]] 742f3ae2f6SVitaly Buka; 752f3ae2f6SVitaly Bukaentry: 762f3ae2f6SVitaly Buka %a = alloca i32, align 8 772f3ae2f6SVitaly Buka %b = alloca i32, align 8 782f3ae2f6SVitaly Buka %sel = select i1 %f, ptr %a, ptr %b 792f3ae2f6SVitaly Buka %l = load i32, ptr %sel, align 8 802f3ae2f6SVitaly Buka ret i32 %l 812f3ae2f6SVitaly Buka} 822f3ae2f6SVitaly Buka 832f3ae2f6SVitaly Buka; Msan just propagates shadow, even if speculated load accesses uninitialized 842f3ae2f6SVitaly Buka; value, instrumentation will select shadow of the desired value anyway. 852f3ae2f6SVitaly Bukadefine i32 @test_msan(i1 %f) sanitize_memory { 862f3ae2f6SVitaly Buka; CHECK-LABEL: @test_msan( 872f3ae2f6SVitaly Buka; CHECK-NEXT: entry: 882f3ae2f6SVitaly Buka; CHECK-NEXT: [[A:%.*]] = alloca i32, align 8 892f3ae2f6SVitaly Buka; CHECK-NEXT: [[B:%.*]] = alloca i32, align 8 902f3ae2f6SVitaly Buka; CHECK-NEXT: [[A_VAL:%.*]] = load i32, ptr [[A]], align 8 912f3ae2f6SVitaly Buka; CHECK-NEXT: [[B_VAL:%.*]] = load i32, ptr [[B]], align 8 922f3ae2f6SVitaly Buka; CHECK-NEXT: [[L:%.*]] = select i1 [[F:%.*]], i32 [[A_VAL]], i32 [[B_VAL]] 932f3ae2f6SVitaly Buka; CHECK-NEXT: ret i32 [[L]] 942f3ae2f6SVitaly Buka; 952f3ae2f6SVitaly Bukaentry: 962f3ae2f6SVitaly Buka %a = alloca i32, align 8 972f3ae2f6SVitaly Buka %b = alloca i32, align 8 982f3ae2f6SVitaly Buka %sel = select i1 %f, ptr %a, ptr %b 992f3ae2f6SVitaly Buka %l = load i32, ptr %sel, align 8 1002f3ae2f6SVitaly Buka ret i32 %l 1012f3ae2f6SVitaly Buka} 102