1*fe7f5f91SVitaly Buka; RUN: opt < %s -msan-check-access-address=0 -S -passes=msan 2>&1 | FileCheck %s 253d7c5cdSEvgeniy Stepanov; REQUIRES: x86-registered-target 353d7c5cdSEvgeniy Stepanov 453d7c5cdSEvgeniy Stepanovtarget 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" 553d7c5cdSEvgeniy Stepanovtarget triple = "x86_64-unknown-linux-gnu" 653d7c5cdSEvgeniy Stepanov 753d7c5cdSEvgeniy Stepanovdeclare i32 @llvm.x86.bmi.bzhi.32(i32, i32) 853d7c5cdSEvgeniy Stepanovdeclare i32 @llvm.x86.bmi.bextr.32(i32, i32) 953d7c5cdSEvgeniy Stepanovdeclare i32 @llvm.x86.bmi.pdep.32(i32, i32) 1053d7c5cdSEvgeniy Stepanovdeclare i32 @llvm.x86.bmi.pext.32(i32, i32) 1153d7c5cdSEvgeniy Stepanov 1253d7c5cdSEvgeniy Stepanovdeclare i64 @llvm.x86.bmi.bzhi.64(i64, i64) 1353d7c5cdSEvgeniy Stepanovdeclare i64 @llvm.x86.bmi.bextr.64(i64, i64) 1453d7c5cdSEvgeniy Stepanovdeclare i64 @llvm.x86.bmi.pdep.64(i64, i64) 1553d7c5cdSEvgeniy Stepanovdeclare i64 @llvm.x86.bmi.pext.64(i64, i64) 1653d7c5cdSEvgeniy Stepanov 1753d7c5cdSEvgeniy Stepanovdefine i32 @Test_bzhi_32(i32 %a, i32 %b) sanitize_memory { 1853d7c5cdSEvgeniy Stepanoventry: 1953d7c5cdSEvgeniy Stepanov %c = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %a, i32 %b) 2053d7c5cdSEvgeniy Stepanov ret i32 %c 2153d7c5cdSEvgeniy Stepanov} 2253d7c5cdSEvgeniy Stepanov 2353d7c5cdSEvgeniy Stepanov; CHECK-LABEL: @Test_bzhi_32( 2441d5033eSNikita Popov; CHECK-DAG: %[[SA:.*]] = load i32, ptr @__msan_param_tls 2553d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB:.*]] = load i32, {{.*}}@__msan_param_tls to i64), i64 8) 2653d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB0:.*]] = icmp ne i32 %[[SB]], 0 2753d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB1:.*]] = sext i1 %[[SB0]] to i32 2853d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[X:.*]] = call i32 @llvm.x86.bmi.bzhi.32(i32 %[[SA]], i32 %b) 2953d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[S:.*]] = or i32 %[[SB1]], %[[X]] 3053d7c5cdSEvgeniy Stepanov; CHECK-DAG: store i32 %[[S]], {{.*}}@__msan_retval_tls 3153d7c5cdSEvgeniy Stepanov; CHECK: ret i32 3253d7c5cdSEvgeniy Stepanov 3353d7c5cdSEvgeniy Stepanovdefine i64 @Test_bzhi_64(i64 %a, i64 %b) sanitize_memory { 3453d7c5cdSEvgeniy Stepanoventry: 3553d7c5cdSEvgeniy Stepanov %c = tail call i64 @llvm.x86.bmi.bzhi.64(i64 %a, i64 %b) 3653d7c5cdSEvgeniy Stepanov ret i64 %c 3753d7c5cdSEvgeniy Stepanov} 3853d7c5cdSEvgeniy Stepanov 3953d7c5cdSEvgeniy Stepanov; CHECK-LABEL: @Test_bzhi_64( 4041d5033eSNikita Popov; CHECK-DAG: %[[SA:.*]] = load i64, ptr @__msan_param_tls 4153d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB:.*]] = load i64, {{.*}}@__msan_param_tls to i64), i64 8) 4253d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB0:.*]] = icmp ne i64 %[[SB]], 0 4353d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB1:.*]] = sext i1 %[[SB0]] to i64 4453d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[X:.*]] = call i64 @llvm.x86.bmi.bzhi.64(i64 %[[SA]], i64 %b) 4553d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[S:.*]] = or i64 %[[SB1]], %[[X]] 4653d7c5cdSEvgeniy Stepanov; CHECK-DAG: store i64 %[[S]], {{.*}}@__msan_retval_tls 4753d7c5cdSEvgeniy Stepanov; CHECK: ret i64 4853d7c5cdSEvgeniy Stepanov 4953d7c5cdSEvgeniy Stepanov 5053d7c5cdSEvgeniy Stepanovdefine i32 @Test_bextr_32(i32 %a, i32 %b) sanitize_memory { 5153d7c5cdSEvgeniy Stepanoventry: 5253d7c5cdSEvgeniy Stepanov %c = tail call i32 @llvm.x86.bmi.bextr.32(i32 %a, i32 %b) 5353d7c5cdSEvgeniy Stepanov ret i32 %c 5453d7c5cdSEvgeniy Stepanov} 5553d7c5cdSEvgeniy Stepanov 5653d7c5cdSEvgeniy Stepanov; CHECK-LABEL: @Test_bextr_32( 5741d5033eSNikita Popov; CHECK-DAG: %[[SA:.*]] = load i32, ptr @__msan_param_tls 5853d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB:.*]] = load i32, {{.*}}@__msan_param_tls to i64), i64 8) 5953d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB0:.*]] = icmp ne i32 %[[SB]], 0 6053d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB1:.*]] = sext i1 %[[SB0]] to i32 6153d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[X:.*]] = call i32 @llvm.x86.bmi.bextr.32(i32 %[[SA]], i32 %b) 6253d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[S:.*]] = or i32 %[[SB1]], %[[X]] 6353d7c5cdSEvgeniy Stepanov; CHECK-DAG: store i32 %[[S]], {{.*}}@__msan_retval_tls 6453d7c5cdSEvgeniy Stepanov; CHECK: ret i32 6553d7c5cdSEvgeniy Stepanov 6653d7c5cdSEvgeniy Stepanovdefine i64 @Test_bextr_64(i64 %a, i64 %b) sanitize_memory { 6753d7c5cdSEvgeniy Stepanoventry: 6853d7c5cdSEvgeniy Stepanov %c = tail call i64 @llvm.x86.bmi.bextr.64(i64 %a, i64 %b) 6953d7c5cdSEvgeniy Stepanov ret i64 %c 7053d7c5cdSEvgeniy Stepanov} 7153d7c5cdSEvgeniy Stepanov 7253d7c5cdSEvgeniy Stepanov; CHECK-LABEL: @Test_bextr_64( 7341d5033eSNikita Popov; CHECK-DAG: %[[SA:.*]] = load i64, ptr @__msan_param_tls 7453d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB:.*]] = load i64, {{.*}}@__msan_param_tls to i64), i64 8) 7553d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB0:.*]] = icmp ne i64 %[[SB]], 0 7653d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB1:.*]] = sext i1 %[[SB0]] to i64 7753d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[X:.*]] = call i64 @llvm.x86.bmi.bextr.64(i64 %[[SA]], i64 %b) 7853d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[S:.*]] = or i64 %[[SB1]], %[[X]] 7953d7c5cdSEvgeniy Stepanov; CHECK-DAG: store i64 %[[S]], {{.*}}@__msan_retval_tls 8053d7c5cdSEvgeniy Stepanov; CHECK: ret i64 8153d7c5cdSEvgeniy Stepanov 8253d7c5cdSEvgeniy Stepanov 8353d7c5cdSEvgeniy Stepanovdefine i32 @Test_pdep_32(i32 %a, i32 %b) sanitize_memory { 8453d7c5cdSEvgeniy Stepanoventry: 8553d7c5cdSEvgeniy Stepanov %c = tail call i32 @llvm.x86.bmi.pdep.32(i32 %a, i32 %b) 8653d7c5cdSEvgeniy Stepanov ret i32 %c 8753d7c5cdSEvgeniy Stepanov} 8853d7c5cdSEvgeniy Stepanov 8953d7c5cdSEvgeniy Stepanov; CHECK-LABEL: @Test_pdep_32( 9041d5033eSNikita Popov; CHECK-DAG: %[[SA:.*]] = load i32, ptr @__msan_param_tls 9153d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB:.*]] = load i32, {{.*}}@__msan_param_tls to i64), i64 8) 9253d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB0:.*]] = icmp ne i32 %[[SB]], 0 9353d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB1:.*]] = sext i1 %[[SB0]] to i32 9453d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[X:.*]] = call i32 @llvm.x86.bmi.pdep.32(i32 %[[SA]], i32 %b) 9553d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[S:.*]] = or i32 %[[SB1]], %[[X]] 9653d7c5cdSEvgeniy Stepanov; CHECK-DAG: store i32 %[[S]], {{.*}}@__msan_retval_tls 9753d7c5cdSEvgeniy Stepanov; CHECK: ret i32 9853d7c5cdSEvgeniy Stepanov 9953d7c5cdSEvgeniy Stepanovdefine i64 @Test_pdep_64(i64 %a, i64 %b) sanitize_memory { 10053d7c5cdSEvgeniy Stepanoventry: 10153d7c5cdSEvgeniy Stepanov %c = tail call i64 @llvm.x86.bmi.pdep.64(i64 %a, i64 %b) 10253d7c5cdSEvgeniy Stepanov ret i64 %c 10353d7c5cdSEvgeniy Stepanov} 10453d7c5cdSEvgeniy Stepanov 10553d7c5cdSEvgeniy Stepanov; CHECK-LABEL: @Test_pdep_64( 10641d5033eSNikita Popov; CHECK-DAG: %[[SA:.*]] = load i64, ptr @__msan_param_tls 10753d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB:.*]] = load i64, {{.*}}@__msan_param_tls to i64), i64 8) 10853d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB0:.*]] = icmp ne i64 %[[SB]], 0 10953d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB1:.*]] = sext i1 %[[SB0]] to i64 11053d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[X:.*]] = call i64 @llvm.x86.bmi.pdep.64(i64 %[[SA]], i64 %b) 11153d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[S:.*]] = or i64 %[[SB1]], %[[X]] 11253d7c5cdSEvgeniy Stepanov; CHECK-DAG: store i64 %[[S]], {{.*}}@__msan_retval_tls 11353d7c5cdSEvgeniy Stepanov; CHECK: ret i64 11453d7c5cdSEvgeniy Stepanov 11553d7c5cdSEvgeniy Stepanovdefine i32 @Test_pext_32(i32 %a, i32 %b) sanitize_memory { 11653d7c5cdSEvgeniy Stepanoventry: 11753d7c5cdSEvgeniy Stepanov %c = tail call i32 @llvm.x86.bmi.pext.32(i32 %a, i32 %b) 11853d7c5cdSEvgeniy Stepanov ret i32 %c 11953d7c5cdSEvgeniy Stepanov} 12053d7c5cdSEvgeniy Stepanov 12153d7c5cdSEvgeniy Stepanov; CHECK-LABEL: @Test_pext_32( 12241d5033eSNikita Popov; CHECK-DAG: %[[SA:.*]] = load i32, ptr @__msan_param_tls 12353d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB:.*]] = load i32, {{.*}}@__msan_param_tls to i64), i64 8) 12453d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB0:.*]] = icmp ne i32 %[[SB]], 0 12553d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB1:.*]] = sext i1 %[[SB0]] to i32 12653d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[X:.*]] = call i32 @llvm.x86.bmi.pext.32(i32 %[[SA]], i32 %b) 12753d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[S:.*]] = or i32 %[[SB1]], %[[X]] 12853d7c5cdSEvgeniy Stepanov; CHECK-DAG: store i32 %[[S]], {{.*}}@__msan_retval_tls 12953d7c5cdSEvgeniy Stepanov; CHECK: ret i32 13053d7c5cdSEvgeniy Stepanov 13153d7c5cdSEvgeniy Stepanovdefine i64 @Test_pext_64(i64 %a, i64 %b) sanitize_memory { 13253d7c5cdSEvgeniy Stepanoventry: 13353d7c5cdSEvgeniy Stepanov %c = tail call i64 @llvm.x86.bmi.pext.64(i64 %a, i64 %b) 13453d7c5cdSEvgeniy Stepanov ret i64 %c 13553d7c5cdSEvgeniy Stepanov} 13653d7c5cdSEvgeniy Stepanov 13753d7c5cdSEvgeniy Stepanov; CHECK-LABEL: @Test_pext_64( 13841d5033eSNikita Popov; CHECK-DAG: %[[SA:.*]] = load i64, ptr @__msan_param_tls 13953d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB:.*]] = load i64, {{.*}}@__msan_param_tls to i64), i64 8) 14053d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB0:.*]] = icmp ne i64 %[[SB]], 0 14153d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[SB1:.*]] = sext i1 %[[SB0]] to i64 14253d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[X:.*]] = call i64 @llvm.x86.bmi.pext.64(i64 %[[SA]], i64 %b) 14353d7c5cdSEvgeniy Stepanov; CHECK-DAG: %[[S:.*]] = or i64 %[[SB1]], %[[X]] 14453d7c5cdSEvgeniy Stepanov; CHECK-DAG: store i64 %[[S]], {{.*}}@__msan_retval_tls 14553d7c5cdSEvgeniy Stepanov; CHECK: ret i64 146