xref: /llvm-project/llvm/test/Transforms/InstCombine/select-load.ll (revision 6dba99e14f7e508a5028036b753fa7f84e846307)
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