brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 6f812e4 Raw
85 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instcombine -S < %s | FileCheck %s3 4define i32 @cttz_neg_value(i32 %x) {5; CHECK-LABEL: @cttz_neg_value(6; CHECK-NEXT:    [[B:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false)7; CHECK-NEXT:    ret i32 [[B]]8;9  %a = sub i32 0, %x10  %b = tail call i32 @llvm.cttz.i32(i32 %a)11  ret i32 %b12}13 14define i32 @cttz_neg_value_multiuse(i32 %x) {15; CHECK-LABEL: @cttz_neg_value_multiuse(16; CHECK-NEXT:    [[A:%.*]] = sub i32 0, [[X:%.*]]17; CHECK-NEXT:    call void @use(i32 [[A]])18; CHECK-NEXT:    [[B:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[X]], i1 false)19; CHECK-NEXT:    ret i32 [[B]]20;21  %a = sub i32 0, %x22  call void @use(i32 %a)23  %b = tail call i32 @llvm.cttz.i32(i32 %a)24  ret i32 %b25}26 27define i64 @cttz_neg_value_64(i64 %x) {28; CHECK-LABEL: @cttz_neg_value_64(29; CHECK-NEXT:    [[B:%.*]] = tail call range(i64 0, 65) i64 @llvm.cttz.i64(i64 [[X:%.*]], i1 true)30; CHECK-NEXT:    ret i64 [[B]]31;32  %a = sub i64 0, %x33  %b = tail call i64 @llvm.cttz.i64(i64 %a, i1 true)34  ret i64 %b35}36 37define i64 @cttz_neg_value2_64(i64 %x) {38; CHECK-LABEL: @cttz_neg_value2_64(39; CHECK-NEXT:    [[B:%.*]] = tail call range(i64 0, 65) i64 @llvm.cttz.i64(i64 [[X:%.*]], i1 false)40; CHECK-NEXT:    ret i64 [[B]]41;42  %a = sub i64 0, %x43  %b = tail call i64 @llvm.cttz.i64(i64 %a, i1 false)44  ret i64 %b45}46 47define <2 x i64> @cttz_neg_value_vec(<2 x i64> %x) {48; CHECK-LABEL: @cttz_neg_value_vec(49; CHECK-NEXT:    [[B:%.*]] = call range(i64 0, 65) <2 x i64> @llvm.cttz.v2i64(<2 x i64> [[X:%.*]], i1 false)50; CHECK-NEXT:    ret <2 x i64> [[B]]51;52  %a = sub  <2 x i64> zeroinitializer, %x53  %b = tail call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %a)54  ret <2 x i64> %b55}56 57; Negative tests58 59define i32 @cttz_nonneg_value(i32 %x) {60; CHECK-LABEL: @cttz_nonneg_value(61; CHECK-NEXT:    [[A:%.*]] = sub i32 1, [[X:%.*]]62; CHECK-NEXT:    [[B:%.*]] = call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[A]], i1 false)63; CHECK-NEXT:    ret i32 [[B]]64;65  %a = sub i32 1, %x66  %b = tail call i32 @llvm.cttz.i32(i32 %a)67  ret i32 %b68}69 70define <2 x i64> @cttz_nonneg_value_vec(<2 x i64> %x) {71; CHECK-LABEL: @cttz_nonneg_value_vec(72; CHECK-NEXT:    [[A:%.*]] = sub <2 x i64> <i64 1, i64 0>, [[X:%.*]]73; CHECK-NEXT:    [[B:%.*]] = call range(i64 0, 65) <2 x i64> @llvm.cttz.v2i64(<2 x i64> [[A]], i1 false)74; CHECK-NEXT:    ret <2 x i64> [[B]]75;76  %a = sub  <2 x i64> <i64 1, i64 0>, %x77  %b = tail call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %a)78  ret <2 x i64> %b79}80 81declare void @use(i32 %a)82declare i32 @llvm.cttz.i32(i32)83declare i64 @llvm.cttz.i64(i64, i1)84declare <2 x i64> @llvm.cttz.v2i64(<2 x i64>)85