diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Target/ARM/ARMCodeGenPrepare.cpp | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/CGP/arm-cgp-calls.ll | 25 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/CGP/arm-cgp-casts.ll | 19 |
3 files changed, 47 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMCodeGenPrepare.cpp b/llvm/lib/Target/ARM/ARMCodeGenPrepare.cpp index 06949bea70a..75c72df2f3e 100644 --- a/llvm/lib/Target/ARM/ARMCodeGenPrepare.cpp +++ b/llvm/lib/Target/ARM/ARMCodeGenPrepare.cpp @@ -206,7 +206,8 @@ static bool isSupportedType(Value *V) { if (auto *Ld = dyn_cast<LoadInst>(V)) Ty = cast<PointerType>(Ld->getPointerOperandType())->getElementType(); - if (!isa<IntegerType>(Ty)) + if (!isa<IntegerType>(Ty) || + cast<IntegerType>(V->getType())->getBitWidth() == 1) return false; return LessOrEqualTypeSize(V); @@ -222,6 +223,7 @@ static bool isSupportedType(Value *V) { static bool isSource(Value *V) { if (!isa<IntegerType>(V->getType())) return false; + // TODO Allow zext to be sources. if (isa<Argument>(V)) return true; diff --git a/llvm/test/CodeGen/ARM/CGP/arm-cgp-calls.ll b/llvm/test/CodeGen/ARM/CGP/arm-cgp-calls.ll index c661940b4e2..ea8c3128dc0 100644 --- a/llvm/test/CodeGen/ARM/CGP/arm-cgp-calls.ll +++ b/llvm/test/CodeGen/ARM/CGP/arm-cgp-calls.ll @@ -177,6 +177,30 @@ entry: ret i1 %tobool } +; CHECK-LABEL: i1_zeroext_call +; CHECK: uxt +define i1 @i1_zeroext_call(i16* %ts, i32 %a, i16* %b, i8* %c) { +entry: + %0 = load i16, i16* %ts, align 2 + %conv.i860 = trunc i32 %a to i16 + store i16 %conv.i860, i16* %b, align 2 + %call.i848 = call zeroext i1 @i1_zeroext(i8* %c, i32 64, i16 zeroext %conv.i860) + br i1 %call.i848, label %if.then223, label %if.else227 + +if.then223: + %cmp235 = icmp eq i16 %0, %conv.i860 + br label %exit + +if.else227: + %cmp236 = icmp ult i16 %0, %conv.i860 + br label %exit + +exit: + %retval = phi i1 [ %cmp235, %if.then223 ], [ %cmp236, %if.else227 ] + ret i1 %retval +} + + declare i32 @assert(...) declare i8 @dummy_i8(i8) declare i8 @dummy2(i8*, i8, i8) @@ -191,3 +215,4 @@ declare fastcc signext i16 @safe_sub_func_int16_t_s_s(i16 signext %si2) declare dso_local fastcc i64 @safe_sub_func_int64_t_s_s(i64, i64) declare dso_local fastcc zeroext i8 @safe_lshift_func(i8 zeroext, i32) declare dso_local fastcc zeroext i8 @safe_mul_func_uint8_t_u_u(i8 returned zeroext) +declare i1 @i1_zeroext(i8*, i32, i16 zeroext) diff --git a/llvm/test/CodeGen/ARM/CGP/arm-cgp-casts.ll b/llvm/test/CodeGen/ARM/CGP/arm-cgp-casts.ll index 0f522071068..1dc5410582e 100644 --- a/llvm/test/CodeGen/ARM/CGP/arm-cgp-casts.ll +++ b/llvm/test/CodeGen/ARM/CGP/arm-cgp-casts.ll @@ -582,3 +582,22 @@ if.end: %retval = phi i8 [ 0, %entry ], [ %add, %if.then ] ret i8 %retval } + +define i32 @bitcast_i1(i16 zeroext %a, i32 %b, i32 %c) { +entry: + %0 = bitcast i1 1 to i1 + %1 = trunc i16 %a to i1 + %cmp = icmp eq i1 %1, %0 + br i1 %cmp, label %if.then, label %exit + +if.then: + %conv = zext i1 %0 to i16 + %conv1 = zext i1 %1 to i16 + %cmp1 = icmp uge i16 %conv, %conv1 + %select = select i1 %cmp1, i32 %b, i32 %c + br label %exit + +exit: + %retval = phi i32 [ %select, %if.then ], [ 0, %entry ] + ret i32 %retval +} |