You've already forked linux-packaging-mono
Imported Upstream version 5.18.0.167
Former-commit-id: 289509151e0fee68a1b591a20c9f109c3c789d3a
This commit is contained in:
parent
e19d552987
commit
b084638f15
@ -1,34 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by update_test_checks.py
|
||||
; RUN: opt < %s -instsimplify -S | FileCheck %s
|
||||
|
||||
define i1 @add(i1 %x) {
|
||||
; CHECK-LABEL: @add(
|
||||
; CHECK: ret i1 false
|
||||
;
|
||||
%z = add i1 %x, %x
|
||||
ret i1 %z
|
||||
}
|
||||
|
||||
define i1 @sub(i1 %x) {
|
||||
; CHECK-LABEL: @sub(
|
||||
; CHECK: ret i1 %x
|
||||
;
|
||||
%z = sub i1 false, %x
|
||||
ret i1 %z
|
||||
}
|
||||
|
||||
define i1 @mul(i1 %x) {
|
||||
; CHECK-LABEL: @mul(
|
||||
; CHECK: ret i1 %x
|
||||
;
|
||||
%z = mul i1 %x, %x
|
||||
ret i1 %z
|
||||
}
|
||||
|
||||
define i1 @ne(i1 %x) {
|
||||
; CHECK-LABEL: @ne(
|
||||
; CHECK: ret i1 %x
|
||||
;
|
||||
%z = icmp ne i1 %x, 0
|
||||
ret i1 %z
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
; RUN: opt < %s -instsimplify -S | FileCheck %s
|
||||
|
||||
define i32 @shift_select(i1 %cond) {
|
||||
; CHECK-LABEL: @shift_select(
|
||||
%s = select i1 %cond, i32 0, i32 1
|
||||
%r = lshr i32 %s, 1
|
||||
ret i32 %r
|
||||
; CHECK: ret i32 0
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
; RUN: opt < %s -instsimplify -S | FileCheck %s
|
||||
|
||||
define <2 x i32> @sdiv(<2 x i32> %x) {
|
||||
; CHECK-LABEL: @sdiv(
|
||||
%div = sdiv <2 x i32> %x, <i32 1, i32 1>
|
||||
ret <2 x i32> %div
|
||||
; CHECK: ret <2 x i32> %x
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
; RUN: opt < %s -instsimplify -S | FileCheck %s
|
||||
|
||||
declare void @bar()
|
||||
|
||||
define void @test1() personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0 {
|
||||
entry:
|
||||
invoke void @bar() to label %cont unwind label %lpad
|
||||
cont:
|
||||
ret void
|
||||
lpad:
|
||||
%ex = landingpad { i8*, i32 } cleanup
|
||||
%exc_ptr = extractvalue { i8*, i32 } %ex, 0
|
||||
%filter = extractvalue { i8*, i32 } %ex, 1
|
||||
%exc_ptr2 = insertvalue { i8*, i32 } undef, i8* %exc_ptr, 0
|
||||
%filter2 = insertvalue { i8*, i32 } %exc_ptr2, i32 %filter, 1
|
||||
resume { i8*, i32 } %filter2
|
||||
; CHECK-LABEL: @test1(
|
||||
; CHECK-NOT: extractvalue
|
||||
; CHECK-NOT: insertvalue
|
||||
}
|
||||
|
||||
declare i32 @__gxx_personality_v0(i32, i64, i8*, i8*)
|
||||
|
||||
define { i8, i32 } @test2({ i8*, i32 } %x) {
|
||||
%ex = extractvalue { i8*, i32 } %x, 1
|
||||
%ins = insertvalue { i8, i32 } undef, i32 %ex, 1
|
||||
ret { i8, i32 } %ins
|
||||
; CHECK-LABEL: @test2(
|
||||
}
|
||||
|
||||
define i32 @test3(i32 %a, float %b) {
|
||||
%agg1 = insertvalue {i32, float} undef, i32 %a, 0
|
||||
%agg2 = insertvalue {i32, float} %agg1, float %b, 1
|
||||
%ev = extractvalue {i32, float} %agg2, 0
|
||||
ret i32 %ev
|
||||
; CHECK-LABEL: @test3(
|
||||
; CHECK: ret i32 %a
|
||||
}
|
||||
|
||||
define i8 @test4(<8 x i8> %V) {
|
||||
%add = add <8 x i8> %V, bitcast (double 0x319BEB8FD172E36 to <8 x i8>)
|
||||
%extract = extractelement <8 x i8> %add, i32 6
|
||||
ret i8 %extract
|
||||
; CHECK-LABEL: @test4(
|
||||
; CHECK: %[[add:.*]] = add <8 x i8> %V, bitcast (<1 x double> <double 0x319BEB8FD172E36> to <8 x i8>)
|
||||
; CHECK-NEXT: %[[extract:.*]] = extractelement <8 x i8> %[[add]], i32 6
|
||||
; CHECK-NEXT: ret i8 %[[extract]]
|
||||
}
|
||||
|
||||
define i32 @test5(<4 x i32> %V) {
|
||||
%extract = extractelement <4 x i32> %V, i32 undef
|
||||
ret i32 %extract
|
||||
}
|
||||
; CHECK-LABEL: @test5(
|
||||
; CHECK: ret i32 undef
|
@ -1,12 +0,0 @@
|
||||
; RUN: opt < %s -instcombine
|
||||
|
||||
@_ZN11xercesc_2_5L11gDigitCharsE = external constant [32 x i16], align 2
|
||||
@_ZN11xercesc_2_5L10gBaseCharsE = external constant [354 x i16], align 2
|
||||
@_ZN11xercesc_2_5L17gIdeographicCharsE = external constant [7 x i16], align 2
|
||||
@_ZN11xercesc_2_5L15gCombiningCharsE = external constant [163 x i16], align 2
|
||||
|
||||
define i32 @_ZN11xercesc_2_515XMLRangeFactory11buildRangesEv(i32 %x) {
|
||||
%a = add i32 %x, add (i32 add (i32 ashr (i32 add (i32 mul (i32 ptrtoint ([32 x i16]* @_ZN11xercesc_2_5L11gDigitCharsE to i32), i32 -1), i32 ptrtoint (i16* getelementptr inbounds ([32 x i16], [32 x i16]* @_ZN11xercesc_2_5L11gDigitCharsE, i32 0, i32 30) to i32)), i32 1), i32 ashr (i32 add (i32 mul (i32 ptrtoint ([7 x i16]* @_ZN11xercesc_2_5L17gIdeographicCharsE to i32), i32 -1), i32 ptrtoint (i16* getelementptr inbounds ([7 x i16], [7 x i16]* @_ZN11xercesc_2_5L17gIdeographicCharsE, i32 0, i32 4) to i32)), i32 1)), i32 8)
|
||||
%b = add i32 %a, %x
|
||||
ret i32 %b
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
; RUN: opt < %s -instsimplify
|
||||
|
||||
; The mul can be proved to always overflow (turning a negative value
|
||||
; into a positive one) and thus results in undefined behaviour. At
|
||||
; the same time we were deducing from the nsw flag that that mul could
|
||||
; be assumed to have a negative value (since if not it has an undefined
|
||||
; value, which can be taken to be negative). We were reporting the mul
|
||||
; as being both positive and negative, firing an assertion!
|
||||
define i1 @test1(i32 %a) {
|
||||
entry:
|
||||
%0 = or i32 %a, 1
|
||||
%1 = shl i32 %0, 31
|
||||
%2 = mul nsw i32 %1, 4
|
||||
%3 = and i32 %2, -4
|
||||
%4 = icmp ne i32 %3, 0
|
||||
ret i1 %4
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
; RUN: opt < %s -instsimplify
|
||||
|
||||
target 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"
|
||||
|
||||
; PR15791
|
||||
define <2 x i64> @test1() {
|
||||
%a = and <2 x i64> undef, bitcast (<4 x i32> <i32 undef, i32 undef, i32 undef, i32 2147483647> to <2 x i64>)
|
||||
ret <2 x i64> %a
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,79 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by update_test_checks.py
|
||||
; RUN: opt -S -instsimplify < %s | FileCheck %s
|
||||
|
||||
define i1 @test(i32 %a) {
|
||||
; CHECK-LABEL: @test(
|
||||
; CHECK: ret i1 false
|
||||
;
|
||||
%rhs = add i32 %a, -1
|
||||
%and = and i32 %a, %rhs
|
||||
%res = icmp eq i32 %and, 1
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
define i1 @test2(i32 %a) {
|
||||
; CHECK-LABEL: @test2(
|
||||
; CHECK: ret i1 false
|
||||
;
|
||||
%rhs = add i32 %a, 1
|
||||
%and = and i32 %a, %rhs
|
||||
%res = icmp eq i32 %and, 1
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
define i1 @test3(i32 %a) {
|
||||
; CHECK-LABEL: @test3(
|
||||
; CHECK: ret i1 false
|
||||
;
|
||||
%rhs = add i32 %a, 7
|
||||
%and = and i32 %a, %rhs
|
||||
%res = icmp eq i32 %and, 1
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
@B = external global i32
|
||||
declare void @llvm.assume(i1)
|
||||
|
||||
; Known bits without a constant
|
||||
define i1 @test4(i32 %a) {
|
||||
; CHECK-LABEL: @test4(
|
||||
; CHECK: [[B:%.*]] = load i32, i32* @B
|
||||
; CHECK-NEXT: [[B_AND:%.*]] = and i32 [[B]], 1
|
||||
; CHECK-NEXT: [[B_CND:%.*]] = icmp eq i32 [[B_AND]], 1
|
||||
; CHECK-NEXT: call void @llvm.assume(i1 [[B_CND]])
|
||||
; CHECK-NEXT: ret i1 false
|
||||
;
|
||||
%b = load i32, i32* @B
|
||||
%b.and = and i32 %b, 1
|
||||
%b.cnd = icmp eq i32 %b.and, 1
|
||||
call void @llvm.assume(i1 %b.cnd)
|
||||
|
||||
%rhs = add i32 %a, %b
|
||||
%and = and i32 %a, %rhs
|
||||
%res = icmp eq i32 %and, 1
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
; Negative test - even number
|
||||
define i1 @test5(i32 %a) {
|
||||
; CHECK-LABEL: @test5(
|
||||
; CHECK: [[RHS:%.*]] = add i32 %a, 2
|
||||
; CHECK-NEXT: [[AND:%.*]] = and i32 %a, [[RHS]]
|
||||
; CHECK-NEXT: [[RES:%.*]] = icmp eq i32 [[AND]], 1
|
||||
; CHECK-NEXT: ret i1 [[RES]]
|
||||
;
|
||||
%rhs = add i32 %a, 2
|
||||
%and = and i32 %a, %rhs
|
||||
%res = icmp eq i32 %and, 1
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
define i1 @test6(i32 %a) {
|
||||
; CHECK-LABEL: @test6(
|
||||
; CHECK: ret i1 false
|
||||
;
|
||||
%lhs = add i32 %a, -1
|
||||
%and = and i32 %lhs, %a
|
||||
%res = icmp eq i32 %and, 1
|
||||
ret i1 %res
|
||||
}
|
@ -1,78 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -instsimplify -S | FileCheck %s
|
||||
|
||||
define i1 @test1(i1 %a) {
|
||||
; CHECK-LABEL: @test1(
|
||||
; CHECK-NEXT: ret i1 true
|
||||
;
|
||||
%b = xor i1 %a, true
|
||||
%res = sub i1 %a, %b
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
define <2 x i1> @test2(<2 x i1> %a) {
|
||||
; CHECK-LABEL: @test2(
|
||||
; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
|
||||
;
|
||||
%b = xor <2 x i1> %a, <i1 true, i1 true>
|
||||
%res = sub <2 x i1> %a, %b
|
||||
ret <2 x i1> %res
|
||||
}
|
||||
|
||||
define i1 @test5(i1 %a) {
|
||||
; CHECK-LABEL: @test5(
|
||||
; CHECK-NEXT: ret i1 false
|
||||
;
|
||||
%res = add i1 %a, %a
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
define <2 x i1> @test6(<2 x i1> %a) {
|
||||
; CHECK-LABEL: @test6(
|
||||
; CHECK-NEXT: ret <2 x i1> zeroinitializer
|
||||
;
|
||||
%res = add <2 x i1> %a, %a
|
||||
ret <2 x i1> %res
|
||||
}
|
||||
|
||||
define i1 @test7(i1 %a) {
|
||||
; CHECK-LABEL: @test7(
|
||||
; CHECK-NEXT: ret i1 [[A:%.*]]
|
||||
;
|
||||
%c = xor i1 %a, true
|
||||
%res = add i1 %c, true
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
; TODO: simplify this to %a
|
||||
define i1 @test8(i1 %a) {
|
||||
; CHECK-LABEL: @test8(
|
||||
; CHECK-NEXT: [[C:%.*]] = add i1 [[A:%.*]], true
|
||||
; CHECK-NEXT: [[RES:%.*]] = xor i1 [[C]], true
|
||||
; CHECK-NEXT: ret i1 [[RES]]
|
||||
;
|
||||
%c = add i1 %a, true
|
||||
%res = xor i1 %c, true
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
define i1 @test9(i1 %a) {
|
||||
; CHECK-LABEL: @test9(
|
||||
; CHECK-NEXT: ret i1 [[A:%.*]]
|
||||
;
|
||||
%c = xor i1 %a, true
|
||||
%res = sub i1 %c, true
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
; TODO: simplify this to %a
|
||||
define i1 @test10(i1 %a) {
|
||||
; CHECK-LABEL: @test10(
|
||||
; CHECK-NEXT: [[C:%.*]] = sub i1 [[A:%.*]], true
|
||||
; CHECK-NEXT: [[RES:%.*]] = xor i1 [[C]], true
|
||||
; CHECK-NEXT: ret i1 [[RES]]
|
||||
;
|
||||
%c = sub i1 %a, true
|
||||
%res = xor i1 %c, true
|
||||
ret i1 %res
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,72 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by update_test_checks.py
|
||||
; RUN: opt -instsimplify -S < %s 2>&1 -pass-remarks-analysis=.* | FileCheck %s
|
||||
|
||||
; Verify that warnings are emitted for the 2nd and 3rd tests.
|
||||
|
||||
; CHECK: remark: /tmp/s.c:1:13: Detected conflicting code assumptions.
|
||||
; CHECK: remark: /tmp/s.c:4:10: Detected conflicting code assumptions.
|
||||
|
||||
define void @test1() {
|
||||
; CHECK-LABEL: @test1(
|
||||
; CHECK: ret void
|
||||
;
|
||||
call void @llvm.assume(i1 1)
|
||||
ret void
|
||||
|
||||
}
|
||||
|
||||
; The alloca guarantees that the low bits of %a are zero because of alignment.
|
||||
; The assume says the opposite. The assume is processed last, so that's the
|
||||
; return value. There's no way to win (we can't undo transforms that happened
|
||||
; based on half-truths), so just don't crash.
|
||||
|
||||
define i64 @PR31809() !dbg !7 {
|
||||
; CHECK-LABEL: @PR31809(
|
||||
; CHECK-NEXT: ret i64 3
|
||||
;
|
||||
%a = alloca i32
|
||||
%t1 = ptrtoint i32* %a to i64, !dbg !9
|
||||
%cond = icmp eq i64 %t1, 3
|
||||
call void @llvm.assume(i1 %cond)
|
||||
ret i64 %t1
|
||||
}
|
||||
|
||||
; Similar to above: there's no way to know which assumption is truthful,
|
||||
; so just don't crash. The second icmp+assume gets processed later, so that
|
||||
; determines the return value.
|
||||
|
||||
define i8 @conflicting_assumptions(i8 %x) !dbg !10 {
|
||||
; CHECK-LABEL: @conflicting_assumptions(
|
||||
; CHECK-NEXT: call void @llvm.assume(i1 false)
|
||||
; CHECK-NEXT: [[COND2:%.*]] = icmp eq i8 %x, 4
|
||||
; CHECK-NEXT: call void @llvm.assume(i1 [[COND2]])
|
||||
; CHECK-NEXT: ret i8 5
|
||||
;
|
||||
%add = add i8 %x, 1, !dbg !11
|
||||
%cond1 = icmp eq i8 %x, 3
|
||||
call void @llvm.assume(i1 %cond1)
|
||||
%cond2 = icmp eq i8 %x, 4
|
||||
call void @llvm.assume(i1 %cond2)
|
||||
ret i8 %add
|
||||
}
|
||||
|
||||
declare void @llvm.assume(i1) nounwind
|
||||
|
||||
!llvm.dbg.cu = !{!0}
|
||||
!llvm.module.flags = !{!3, !4, !5}
|
||||
!llvm.ident = !{!6}
|
||||
|
||||
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 4.0.0 (trunk 282540) (llvm/trunk 282542)", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !2)
|
||||
!1 = !DIFile(filename: "/tmp/s.c", directory: "/tmp")
|
||||
!2 = !{}
|
||||
!3 = !{i32 2, !"Dwarf Version", i32 4}
|
||||
!4 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!5 = !{i32 1, !"PIC Level", i32 2}
|
||||
!6 = !{!"clang version 4.0.0 (trunk 282540) (llvm/trunk 282542)"}
|
||||
!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: true, unit: !0, variables: !2)
|
||||
!8 = !DISubroutineType(types: !2)
|
||||
!9 = !DILocation(line: 1, column: 13, scope: !7)
|
||||
!10 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 3, type: !8, isLocal: false, isDefinition: true, scopeLine: 3, isOptimized: true, unit: !0, variables: !2)
|
||||
!11 = !DILocation(line: 4, column: 10, scope: !10)
|
||||
!12 = !DILocation(line: 4, column: 3, scope: !10)
|
||||
|
@ -1,269 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -instsimplify -S | FileCheck %s
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-f64:32:64-v64:64:64-v128:128:128"
|
||||
|
||||
define <2 x i64> @test1() {
|
||||
; CHECK-LABEL: @test1(
|
||||
; CHECK-NEXT: ret <2 x i64> <i64 4294967296, i64 12884901890>
|
||||
;
|
||||
%tmp3 = bitcast <4 x i32> < i32 0, i32 1, i32 2, i32 3 > to <2 x i64>
|
||||
ret <2 x i64> %tmp3
|
||||
}
|
||||
|
||||
define <4 x i32> @test2() {
|
||||
; CHECK-LABEL: @test2(
|
||||
; CHECK-NEXT: ret <4 x i32> <i32 0, i32 0, i32 1, i32 0>
|
||||
;
|
||||
%tmp3 = bitcast <2 x i64> < i64 0, i64 1 > to <4 x i32>
|
||||
ret <4 x i32> %tmp3
|
||||
}
|
||||
|
||||
define <2 x double> @test3() {
|
||||
; CHECK-LABEL: @test3(
|
||||
; CHECK-NEXT: ret <2 x double> <double 0x100000000, double 0x300000002>
|
||||
;
|
||||
%tmp3 = bitcast <4 x i32> < i32 0, i32 1, i32 2, i32 3 > to <2 x double>
|
||||
ret <2 x double> %tmp3
|
||||
}
|
||||
|
||||
define <4 x float> @test4() {
|
||||
; CHECK-LABEL: @test4(
|
||||
; CHECK-NEXT: ret <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0x36A0000000000000, float 0.000000e+00>
|
||||
;
|
||||
%tmp3 = bitcast <2 x i64> < i64 0, i64 1 > to <4 x float>
|
||||
ret <4 x float> %tmp3
|
||||
}
|
||||
|
||||
define <2 x i64> @test5() {
|
||||
; CHECK-LABEL: @test5(
|
||||
; CHECK-NEXT: ret <2 x i64> <i64 4575657221408423936, i64 4629700418010611712>
|
||||
;
|
||||
%tmp3 = bitcast <4 x float> <float 0.0, float 1.0, float 2.0, float 3.0> to <2 x i64>
|
||||
ret <2 x i64> %tmp3
|
||||
}
|
||||
|
||||
define <4 x i32> @test6() {
|
||||
; CHECK-LABEL: @test6(
|
||||
; CHECK-NEXT: ret <4 x i32> <i32 0, i32 1071644672, i32 0, i32 1072693248>
|
||||
;
|
||||
%tmp3 = bitcast <2 x double> <double 0.5, double 1.0> to <4 x i32>
|
||||
ret <4 x i32> %tmp3
|
||||
}
|
||||
|
||||
define i32 @test7() {
|
||||
; CHECK-LABEL: @test7(
|
||||
; CHECK-NEXT: ret i32 1118464
|
||||
;
|
||||
%tmp3 = bitcast <2 x half> <half 0xH1100, half 0xH0011> to i32
|
||||
ret i32 %tmp3
|
||||
}
|
||||
|
||||
define <4 x i32> @test8(<1 x i64> %y) {
|
||||
; CHECK-LABEL: @test8(
|
||||
; CHECK-NEXT: ret <4 x i32> zeroinitializer
|
||||
;
|
||||
%c = bitcast <2 x i64> <i64 0, i64 0> to <4 x i32>
|
||||
ret <4 x i32> %c
|
||||
}
|
||||
|
||||
define <4 x i32> @test9(<1 x i64> %y) {
|
||||
; CHECK-LABEL: @test9(
|
||||
; CHECK-NEXT: ret <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
|
||||
;
|
||||
%c = bitcast <2 x i64> <i64 -1, i64 -1> to <4 x i32>
|
||||
ret <4 x i32> %c
|
||||
}
|
||||
|
||||
; from MultiSource/Benchmarks/Bullet
|
||||
define <2 x float> @foo() {
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK-NEXT: ret <2 x float> <float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000>
|
||||
;
|
||||
%cast = bitcast i64 -1 to <2 x float>
|
||||
ret <2 x float> %cast
|
||||
}
|
||||
|
||||
|
||||
define <2 x double> @foo2() {
|
||||
; CHECK-LABEL: @foo2(
|
||||
; CHECK-NEXT: ret <2 x double> <double 0xFFFFFFFFFFFFFFFF, double 0xFFFFFFFFFFFFFFFF>
|
||||
;
|
||||
%cast = bitcast i128 -1 to <2 x double>
|
||||
ret <2 x double> %cast
|
||||
}
|
||||
|
||||
define <1 x float> @foo3() {
|
||||
; CHECK-LABEL: @foo3(
|
||||
; CHECK-NEXT: ret <1 x float> <float 0xFFFFFFFFE0000000>
|
||||
;
|
||||
%cast = bitcast i32 -1 to <1 x float>
|
||||
ret <1 x float> %cast
|
||||
}
|
||||
|
||||
define float @foo4() {
|
||||
; CHECK-LABEL: @foo4(
|
||||
; CHECK-NEXT: ret float 0xFFFFFFFFE0000000
|
||||
;
|
||||
%cast = bitcast <1 x i32 ><i32 -1> to float
|
||||
ret float %cast
|
||||
}
|
||||
|
||||
define double @foo5() {
|
||||
; CHECK-LABEL: @foo5(
|
||||
; CHECK-NEXT: ret double 0xFFFFFFFFFFFFFFFF
|
||||
;
|
||||
%cast = bitcast <2 x i32 ><i32 -1, i32 -1> to double
|
||||
ret double %cast
|
||||
}
|
||||
|
||||
define <2 x double> @foo6() {
|
||||
; CHECK-LABEL: @foo6(
|
||||
; CHECK-NEXT: ret <2 x double> <double 0xFFFFFFFFFFFFFFFF, double 0xFFFFFFFFFFFFFFFF>
|
||||
;
|
||||
%cast = bitcast <4 x i32><i32 -1, i32 -1, i32 -1, i32 -1> to <2 x double>
|
||||
ret <2 x double> %cast
|
||||
}
|
||||
|
||||
define <4 x i32> @bitcast_constexpr_4i32_2i64_u2() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_4i32_2i64_u2(
|
||||
; CHECK-NEXT: ret <4 x i32> <i32 undef, i32 undef, i32 2, i32 0>
|
||||
;
|
||||
%cast = bitcast <2 x i64><i64 undef, i64 2> to <4 x i32>
|
||||
ret <4 x i32> %cast
|
||||
}
|
||||
|
||||
define <4 x i32> @bitcast_constexpr_4i32_2i64_1u() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_4i32_2i64_1u(
|
||||
; CHECK-NEXT: ret <4 x i32> <i32 1, i32 0, i32 undef, i32 undef>
|
||||
;
|
||||
%cast = bitcast <2 x i64><i64 1, i64 undef> to <4 x i32>
|
||||
ret <4 x i32> %cast
|
||||
}
|
||||
|
||||
define <4 x i32> @bitcast_constexpr_4i32_2i64() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_4i32_2i64(
|
||||
; CHECK-NEXT: ret <4 x i32> <i32 undef, i32 undef, i32 2, i32 0>
|
||||
;
|
||||
%cast = bitcast <2 x i64><i64 undef, i64 2> to <4 x i32>
|
||||
ret <4 x i32> %cast
|
||||
}
|
||||
|
||||
define <8 x i16> @bitcast_constexpr_8i16_2i64_u2() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_8i16_2i64_u2(
|
||||
; CHECK-NEXT: ret <8 x i16> <i16 undef, i16 undef, i16 undef, i16 undef, i16 2, i16 0, i16 0, i16 0>
|
||||
;
|
||||
%cast = bitcast <2 x i64><i64 undef, i64 2> to <8 x i16>
|
||||
ret <8 x i16> %cast
|
||||
}
|
||||
|
||||
define <8 x i16> @bitcast_constexpr_8i16_2i64_1u() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_8i16_2i64_1u(
|
||||
; CHECK-NEXT: ret <8 x i16> <i16 1, i16 0, i16 0, i16 0, i16 undef, i16 undef, i16 undef, i16 undef>
|
||||
;
|
||||
%cast = bitcast <2 x i64><i64 1, i64 undef> to <8 x i16>
|
||||
ret <8 x i16> %cast
|
||||
}
|
||||
|
||||
define <8 x i16> @bitcast_constexpr_8i16_2i64_u65536() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_8i16_2i64_u65536(
|
||||
; CHECK-NEXT: ret <8 x i16> <i16 undef, i16 undef, i16 undef, i16 undef, i16 0, i16 1, i16 0, i16 0>
|
||||
;
|
||||
%cast = bitcast <2 x i64><i64 undef, i64 65536> to <8 x i16>
|
||||
ret <8 x i16> %cast
|
||||
}
|
||||
|
||||
define <16 x i8> @bitcast_constexpr_16i8_2i64_u2() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_16i8_2i64_u2(
|
||||
; CHECK-NEXT: ret <16 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 2, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>
|
||||
;
|
||||
%cast = bitcast <2 x i64><i64 undef, i64 2> to <16 x i8>
|
||||
ret <16 x i8> %cast
|
||||
}
|
||||
|
||||
define <16 x i8> @bitcast_constexpr_16i8_2i64_256u() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_16i8_2i64_256u(
|
||||
; CHECK-NEXT: ret <16 x i8> <i8 0, i8 1, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>
|
||||
;
|
||||
%cast = bitcast <2 x i64><i64 256, i64 undef> to <16 x i8>
|
||||
ret <16 x i8> %cast
|
||||
}
|
||||
|
||||
define <16 x i8> @bitcast_constexpr_16i8_2i64_u256() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_16i8_2i64_u256(
|
||||
; CHECK-NEXT: ret <16 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 1, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>
|
||||
;
|
||||
%cast = bitcast <2 x i64><i64 undef, i64 256> to <16 x i8>
|
||||
ret <16 x i8> %cast
|
||||
}
|
||||
|
||||
define <8 x i16> @bitcast_constexpr_8i16_4i32_uu22() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_8i16_4i32_uu22(
|
||||
; CHECK-NEXT: ret <8 x i16> <i16 undef, i16 undef, i16 undef, i16 undef, i16 2, i16 0, i16 2, i16 0>
|
||||
;
|
||||
%cast = bitcast <4 x i32><i32 undef, i32 undef, i32 2, i32 2> to <8 x i16>
|
||||
ret <8 x i16> %cast
|
||||
}
|
||||
|
||||
define <8 x i16> @bitcast_constexpr_8i16_4i32_10uu() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_8i16_4i32_10uu(
|
||||
; CHECK-NEXT: ret <8 x i16> <i16 1, i16 0, i16 0, i16 0, i16 undef, i16 undef, i16 undef, i16 undef>
|
||||
;
|
||||
%cast = bitcast <4 x i32><i32 1, i32 0, i32 undef, i32 undef> to <8 x i16>
|
||||
ret <8 x i16> %cast
|
||||
}
|
||||
|
||||
define <8 x i16> @bitcast_constexpr_8i16_4i32_u257u256() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_8i16_4i32_u257u256(
|
||||
; CHECK-NEXT: ret <8 x i16> <i16 undef, i16 undef, i16 0, i16 1, i16 undef, i16 undef, i16 0, i16 1>
|
||||
;
|
||||
%cast = bitcast <4 x i32><i32 undef, i32 65536, i32 undef, i32 65536> to <8 x i16>
|
||||
ret <8 x i16> %cast
|
||||
}
|
||||
|
||||
define <16 x i8> @bitcast_constexpr_16i8_4i32_u2u2() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_16i8_4i32_u2u2(
|
||||
; CHECK-NEXT: ret <16 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 2, i8 0, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 2, i8 0, i8 0, i8 0>
|
||||
;
|
||||
%cast = bitcast <4 x i32><i32 undef, i32 2, i32 undef, i32 2> to <16 x i8>
|
||||
ret <16 x i8> %cast
|
||||
}
|
||||
|
||||
define <16 x i8> @bitcast_constexpr_16i8_4i32_1u1u() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_16i8_4i32_1u1u(
|
||||
; CHECK-NEXT: ret <16 x i8> <i8 1, i8 0, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 1, i8 0, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8 undef>
|
||||
;
|
||||
%cast = bitcast <4 x i32><i32 1, i32 undef, i32 1, i32 undef> to <16 x i8>
|
||||
ret <16 x i8> %cast
|
||||
}
|
||||
|
||||
define <16 x i8> @bitcast_constexpr_16i8_4i32_u256uu() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_16i8_4i32_u256uu(
|
||||
; CHECK-NEXT: ret <16 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 1, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>
|
||||
;
|
||||
%cast = bitcast <4 x i32><i32 undef, i32 256, i32 undef, i32 undef> to <16 x i8>
|
||||
ret <16 x i8> %cast
|
||||
}
|
||||
|
||||
define <16 x i8> @bitcast_constexpr_16i8_8i16_u2u2u2u2() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_16i8_8i16_u2u2u2u2(
|
||||
; CHECK-NEXT: ret <16 x i8> <i8 undef, i8 undef, i8 2, i8 0, i8 undef, i8 undef, i8 2, i8 0, i8 undef, i8 undef, i8 2, i8 0, i8 undef, i8 undef, i8 2, i8 0>
|
||||
;
|
||||
%cast = bitcast <8 x i16><i16 undef, i16 2, i16 undef, i16 2, i16 undef, i16 2, i16 undef, i16 2> to <16 x i8>
|
||||
ret <16 x i8> %cast
|
||||
}
|
||||
|
||||
define <16 x i8> @bitcast_constexpr_16i8_8i16_1u1u1u1u() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_16i8_8i16_1u1u1u1u(
|
||||
; CHECK-NEXT: ret <16 x i8> <i8 1, i8 0, i8 undef, i8 undef, i8 1, i8 0, i8 undef, i8 undef, i8 1, i8 0, i8 undef, i8 undef, i8 1, i8 0, i8 undef, i8 undef>
|
||||
;
|
||||
%cast = bitcast <8 x i16><i16 1, i16 undef, i16 1, i16 undef, i16 1, i16 undef, i16 1, i16 undef> to <16 x i8>
|
||||
ret <16 x i8> %cast
|
||||
}
|
||||
|
||||
define <16 x i8> @bitcast_constexpr_16i8_8i16_u256uuu256uu() {
|
||||
; CHECK-LABEL: @bitcast_constexpr_16i8_8i16_u256uuu256uu(
|
||||
; CHECK-NEXT: ret <16 x i8> <i8 undef, i8 undef, i8 0, i8 1, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 1, i8 undef, i8 undef, i8 undef, i8 undef>
|
||||
;
|
||||
%cast = bitcast <8 x i16><i16 undef, i16 256, i16 undef, i16 undef, i16 undef, i16 256, i16 undef, i16 undef> to <16 x i8>
|
||||
ret <16 x i8> %cast
|
||||
}
|
@ -1,110 +0,0 @@
|
||||
; RUN: opt < %s -instsimplify -S | FileCheck %s
|
||||
|
||||
define i32 @identity_bitreverse_i32(i32 %p) {
|
||||
; CHECK-LABEL: @identity_bitreverse_i32(
|
||||
; CHECK-NEXT: ret i32 %p
|
||||
%a = call i32 @llvm.bitreverse.i32(i32 %p)
|
||||
%b = call i32 @llvm.bitreverse.i32(i32 %a)
|
||||
ret i32 %b
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @identity_bitreverse_v2i32(
|
||||
; CHECK-NEXT: ret <2 x i32> %p
|
||||
define <2 x i32> @identity_bitreverse_v2i32(<2 x i32> %p) {
|
||||
%a = call <2 x i32> @llvm.bitreverse.v2i32(<2 x i32> %p)
|
||||
%b = call <2 x i32> @llvm.bitreverse.v2i32(<2 x i32> %a)
|
||||
ret <2 x i32> %b
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @reverse_0_i32(
|
||||
; CHECK-NEXT: ret i32 0
|
||||
define i32 @reverse_0_i32() {
|
||||
%x = call i32 @llvm.bitreverse.i32(i32 0)
|
||||
ret i32 %x
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @reverse_1_i32(
|
||||
; CHECK-NEXT: ret i32 -2147483648
|
||||
define i32 @reverse_1_i32() {
|
||||
%x = call i32 @llvm.bitreverse.i32(i32 1)
|
||||
ret i32 %x
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @reverse_neg1_i32(
|
||||
; CHECK-NEXT: ret i32 -1
|
||||
define i32 @reverse_neg1_i32() {
|
||||
%x = call i32 @llvm.bitreverse.i32(i32 -1)
|
||||
ret i32 %x
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @reverse_undef_i32(
|
||||
; CHECK-NEXT: ret i32 undef
|
||||
define i32 @reverse_undef_i32() {
|
||||
%x = call i32 @llvm.bitreverse.i32(i32 undef)
|
||||
ret i32 %x
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @reverse_false_i1(
|
||||
; CHECK-NEXT: ret i1 false
|
||||
define i1 @reverse_false_i1() {
|
||||
%x = call i1 @llvm.bitreverse.i1(i1 false)
|
||||
ret i1 %x
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @reverse_true_i1(
|
||||
; CHECK-NEXT: ret i1 true
|
||||
define i1 @reverse_true_i1() {
|
||||
%x = call i1 @llvm.bitreverse.i1(i1 true)
|
||||
ret i1 %x
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @reverse_undef_i1(
|
||||
; CHECK-NEXT: ret i1 undef
|
||||
define i1 @reverse_undef_i1() {
|
||||
%x = call i1 @llvm.bitreverse.i1(i1 undef)
|
||||
ret i1 %x
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @reverse_false_v2i1(
|
||||
; CHECK-NEXT: ret <2 x i1> zeroinitializer
|
||||
define <2 x i1> @reverse_false_v2i1() {
|
||||
%x = call <2 x i1> @llvm.bitreverse.v2i1(<2 x i1> zeroinitializer)
|
||||
ret <2 x i1> %x
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @reverse_true_v2i1(
|
||||
; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
|
||||
define <2 x i1> @reverse_true_v2i1() {
|
||||
%x = call <2 x i1> @llvm.bitreverse.v2i1(<2 x i1> <i1 true, i1 true>)
|
||||
ret <2 x i1> %x
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @bitreverse_920_1234_v2i32(
|
||||
; CHECK-NEXT: ret <2 x i32> <i32 432013312, i32 1260388352>
|
||||
define <2 x i32> @bitreverse_920_1234_v2i32() {
|
||||
%x = call <2 x i32> @llvm.bitreverse.v2i32(<2 x i32> <i32 920, i32 1234>)
|
||||
ret <2 x i32> %x
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @reverse_100_i3(
|
||||
; CHECK-NEXT: ret i3 1
|
||||
define i3 @reverse_100_i3() {
|
||||
%x = call i3 @llvm.bitreverse.i3(i3 100)
|
||||
ret i3 %x
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @reverse_6_3_v2i3(
|
||||
; CHECK-NEXT: ret <2 x i3> <i3 3, i3 -2>
|
||||
define <2 x i3> @reverse_6_3_v2i3() {
|
||||
%x = call <2 x i3> @llvm.bitreverse.v2i3(<2 x i3> <i3 6, i3 3>)
|
||||
ret <2 x i3> %x
|
||||
}
|
||||
|
||||
declare i1 @llvm.bitreverse.i1(i1) readnone
|
||||
declare <2 x i1> @llvm.bitreverse.v2i1(<2 x i1>) readnone
|
||||
|
||||
declare i3 @llvm.bitreverse.i3(i3) readnone
|
||||
declare <2 x i3> @llvm.bitreverse.v2i3(<2 x i3>) readnone
|
||||
|
||||
declare i32 @llvm.bitreverse.i32(i32) readnone
|
||||
declare <2 x i32> @llvm.bitreverse.v2i32(<2 x i32>) readnone
|
@ -1,31 +0,0 @@
|
||||
; RUN: opt < %s -S -instsimplify | FileCheck %s
|
||||
|
||||
declare i32 @llvm.bitreverse.i32(i32)
|
||||
|
||||
; CHECK-LABEL: @test1(
|
||||
; CHECK: ret i1 false
|
||||
define i1 @test1(i32 %arg) {
|
||||
%a = or i32 %arg, 1
|
||||
%b = call i32 @llvm.bitreverse.i32(i32 %a)
|
||||
%res = icmp eq i32 %b, 0
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @test2(
|
||||
; CHECK: ret i1 false
|
||||
define i1 @test2(i32 %arg) {
|
||||
%a = or i32 %arg, 1024
|
||||
%b = call i32 @llvm.bitreverse.i32(i32 %a)
|
||||
%res = icmp eq i32 %b, 0
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @test3(
|
||||
; CHECK: ret i1 false
|
||||
define i1 @test3(i32 %arg) {
|
||||
%a = and i32 %arg, 1
|
||||
%b = call i32 @llvm.bitreverse.i32(i32 %a)
|
||||
%and = and i32 %b, 1
|
||||
%res = icmp eq i32 %and, 1
|
||||
ret i1 %res
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by update_test_checks.py
|
||||
; RUN: opt < %s -S -instsimplify | FileCheck %s
|
||||
|
||||
declare i16 @llvm.bswap.i16(i16)
|
||||
|
||||
define i1 @test1(i16 %arg) {
|
||||
; CHECK-LABEL: @test1(
|
||||
; CHECK: ret i1 false
|
||||
;
|
||||
%a = or i16 %arg, 1
|
||||
%b = call i16 @llvm.bswap.i16(i16 %a)
|
||||
%res = icmp eq i16 %b, 0
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
define i1 @test2(i16 %arg) {
|
||||
; CHECK-LABEL: @test2(
|
||||
; CHECK: ret i1 false
|
||||
;
|
||||
%a = or i16 %arg, 1024
|
||||
%b = call i16 @llvm.bswap.i16(i16 %a)
|
||||
%res = icmp eq i16 %b, 0
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
define i1 @test3(i16 %arg) {
|
||||
; CHECK-LABEL: @test3(
|
||||
; CHECK: ret i1 false
|
||||
;
|
||||
%a = and i16 %arg, 1
|
||||
%b = call i16 @llvm.bswap.i16(i16 %a)
|
||||
%and = and i16 %b, 1
|
||||
%res = icmp eq i16 %and, 1
|
||||
ret i1 %res
|
||||
}
|
||||
|
||||
define i1 @test4(i16 %arg) {
|
||||
; CHECK-LABEL: @test4(
|
||||
; CHECK: ret i1 false
|
||||
;
|
||||
%a = and i16 %arg, 511
|
||||
%b = call i16 @llvm.bswap.i16(i16 %a)
|
||||
%and = and i16 %b, 256
|
||||
%res = icmp eq i16 %and, 1
|
||||
ret i1 %res
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
; Verify that the non-default calling conv doesn't prevent the libcall simplification
|
||||
|
||||
@.str = private unnamed_addr constant [4 x i8] c"abc\00", align 1
|
||||
|
||||
define arm_aapcscc i32 @_abs(i32 %i) nounwind readnone {
|
||||
; CHECK: _abs
|
||||
%call = tail call arm_aapcscc i32 @abs(i32 %i) nounwind readnone
|
||||
ret i32 %call
|
||||
; CHECK: %[[ISPOS:.*]] = icmp sgt i32 %i, -1
|
||||
; CHECK: %[[NEG:.*]] = sub i32 0, %i
|
||||
; CHECK: %[[RET:.*]] = select i1 %[[ISPOS]], i32 %i, i32 %[[NEG]]
|
||||
; CHECK: ret i32 %[[RET]]
|
||||
}
|
||||
|
||||
declare arm_aapcscc i32 @abs(i32) nounwind readnone
|
||||
|
||||
define arm_aapcscc i32 @_labs(i32 %i) nounwind readnone {
|
||||
; CHECK: _labs
|
||||
%call = tail call arm_aapcscc i32 @labs(i32 %i) nounwind readnone
|
||||
ret i32 %call
|
||||
; CHECK: %[[ISPOS:.*]] = icmp sgt i32 %i, -1
|
||||
; CHECK: %[[NEG:.*]] = sub i32 0, %i
|
||||
; CHECK: %[[RET:.*]] = select i1 %[[ISPOS]], i32 %i, i32 %[[NEG]]
|
||||
; CHECK: ret i32 %[[RET]]
|
||||
}
|
||||
|
||||
declare arm_aapcscc i32 @labs(i32) nounwind readnone
|
||||
|
||||
define arm_aapcscc i32 @_strlen1() {
|
||||
; CHECK: _strlen1
|
||||
%call = tail call arm_aapcscc i32 @strlen(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0))
|
||||
ret i32 %call
|
||||
; CHECK: ret i32 3
|
||||
}
|
||||
|
||||
declare arm_aapcscc i32 @strlen(i8*)
|
||||
|
||||
define arm_aapcscc zeroext i1 @_strlen2(i8* %str) {
|
||||
; CHECK: _strlen2
|
||||
%call = tail call arm_aapcscc i32 @strlen(i8* %str)
|
||||
%cmp = icmp ne i32 %call, 0
|
||||
ret i1 %cmp
|
||||
|
||||
; CHECK: %[[STRLENFIRST:.*]] = load i8, i8* %str
|
||||
; CHECK: %[[CMP:.*]] = icmp ne i8 %[[STRLENFIRST]], 0
|
||||
; CHECK: ret i1 %[[CMP]]
|
||||
}
|
452
external/llvm/test/Transforms/InstSimplify/call.ll
vendored
452
external/llvm/test/Transforms/InstSimplify/call.ll
vendored
@ -1,452 +0,0 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -instsimplify -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
|
||||
|
||||
declare {i8, i1} @llvm.uadd.with.overflow.i8(i8 %a, i8 %b)
|
||||
declare {i8, i1} @llvm.sadd.with.overflow.i8(i8 %a, i8 %b)
|
||||
declare {i8, i1} @llvm.usub.with.overflow.i8(i8 %a, i8 %b)
|
||||
declare {i8, i1} @llvm.ssub.with.overflow.i8(i8 %a, i8 %b)
|
||||
declare {i8, i1} @llvm.umul.with.overflow.i8(i8 %a, i8 %b)
|
||||
declare {i8, i1} @llvm.smul.with.overflow.i8(i8 %a, i8 %b)
|
||||
|
||||
define i1 @test_uadd1() {
|
||||
; CHECK-LABEL: @test_uadd1(
|
||||
; CHECK-NEXT: ret i1 true
|
||||
;
|
||||
%x = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 254, i8 3)
|
||||
%overflow = extractvalue {i8, i1} %x, 1
|
||||
ret i1 %overflow
|
||||
}
|
||||
|
||||
define i8 @test_uadd2() {
|
||||
; CHECK-LABEL: @test_uadd2(
|
||||
; CHECK-NEXT: ret i8 42
|
||||
;
|
||||
%x = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 254, i8 44)
|
||||
%result = extractvalue {i8, i1} %x, 0
|
||||
ret i8 %result
|
||||
}
|
||||
|
||||
define {i8, i1} @test_uadd3(i8 %v) {
|
||||
; CHECK-LABEL: @test_uadd3(
|
||||
; CHECK-NEXT: ret { i8, i1 } undef
|
||||
;
|
||||
%result = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 %v, i8 undef)
|
||||
ret {i8, i1} %result
|
||||
}
|
||||
|
||||
define {i8, i1} @test_uadd4(i8 %v) {
|
||||
; CHECK-LABEL: @test_uadd4(
|
||||
; CHECK-NEXT: ret { i8, i1 } undef
|
||||
;
|
||||
%result = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 undef, i8 %v)
|
||||
ret {i8, i1} %result
|
||||
}
|
||||
|
||||
define i1 @test_sadd1() {
|
||||
; CHECK-LABEL: @test_sadd1(
|
||||
; CHECK-NEXT: ret i1 true
|
||||
;
|
||||
%x = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 126, i8 3)
|
||||
%overflow = extractvalue {i8, i1} %x, 1
|
||||
ret i1 %overflow
|
||||
}
|
||||
|
||||
define i8 @test_sadd2() {
|
||||
; CHECK-LABEL: @test_sadd2(
|
||||
; CHECK-NEXT: ret i8 -86
|
||||
;
|
||||
%x = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 126, i8 44)
|
||||
%result = extractvalue {i8, i1} %x, 0
|
||||
ret i8 %result
|
||||
}
|
||||
|
||||
define {i8, i1} @test_sadd3(i8 %v) {
|
||||
; CHECK-LABEL: @test_sadd3(
|
||||
; CHECK-NEXT: ret { i8, i1 } undef
|
||||
;
|
||||
%result = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 %v, i8 undef)
|
||||
ret {i8, i1} %result
|
||||
}
|
||||
|
||||
define {i8, i1} @test_sadd4(i8 %v) {
|
||||
; CHECK-LABEL: @test_sadd4(
|
||||
; CHECK-NEXT: ret { i8, i1 } undef
|
||||
;
|
||||
%result = call {i8, i1} @llvm.sadd.with.overflow.i8(i8 undef, i8 %v)
|
||||
ret {i8, i1} %result
|
||||
}
|
||||
|
||||
define {i8, i1} @test_usub1(i8 %V) {
|
||||
; CHECK-LABEL: @test_usub1(
|
||||
; CHECK-NEXT: ret { i8, i1 } zeroinitializer
|
||||
;
|
||||
%x = call {i8, i1} @llvm.usub.with.overflow.i8(i8 %V, i8 %V)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
define {i8, i1} @test_usub2(i8 %V) {
|
||||
; CHECK-LABEL: @test_usub2(
|
||||
; CHECK-NEXT: ret { i8, i1 } undef
|
||||
;
|
||||
%x = call {i8, i1} @llvm.usub.with.overflow.i8(i8 %V, i8 undef)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
define {i8, i1} @test_usub3(i8 %V) {
|
||||
; CHECK-LABEL: @test_usub3(
|
||||
; CHECK-NEXT: ret { i8, i1 } undef
|
||||
;
|
||||
%x = call {i8, i1} @llvm.usub.with.overflow.i8(i8 undef, i8 %V)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
define {i8, i1} @test_ssub1(i8 %V) {
|
||||
; CHECK-LABEL: @test_ssub1(
|
||||
; CHECK-NEXT: ret { i8, i1 } zeroinitializer
|
||||
;
|
||||
%x = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 %V, i8 %V)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
define {i8, i1} @test_ssub2(i8 %V) {
|
||||
; CHECK-LABEL: @test_ssub2(
|
||||
; CHECK-NEXT: ret { i8, i1 } undef
|
||||
;
|
||||
%x = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 %V, i8 undef)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
define {i8, i1} @test_ssub3(i8 %V) {
|
||||
; CHECK-LABEL: @test_ssub3(
|
||||
; CHECK-NEXT: ret { i8, i1 } undef
|
||||
;
|
||||
%x = call {i8, i1} @llvm.ssub.with.overflow.i8(i8 undef, i8 %V)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
define {i8, i1} @test_umul1(i8 %V) {
|
||||
; CHECK-LABEL: @test_umul1(
|
||||
; CHECK-NEXT: ret { i8, i1 } zeroinitializer
|
||||
;
|
||||
%x = call {i8, i1} @llvm.umul.with.overflow.i8(i8 %V, i8 0)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
define {i8, i1} @test_umul2(i8 %V) {
|
||||
; CHECK-LABEL: @test_umul2(
|
||||
; CHECK-NEXT: ret { i8, i1 } zeroinitializer
|
||||
;
|
||||
%x = call {i8, i1} @llvm.umul.with.overflow.i8(i8 %V, i8 undef)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
define {i8, i1} @test_umul3(i8 %V) {
|
||||
; CHECK-LABEL: @test_umul3(
|
||||
; CHECK-NEXT: ret { i8, i1 } zeroinitializer
|
||||
;
|
||||
%x = call {i8, i1} @llvm.umul.with.overflow.i8(i8 0, i8 %V)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
define {i8, i1} @test_umul4(i8 %V) {
|
||||
; CHECK-LABEL: @test_umul4(
|
||||
; CHECK-NEXT: ret { i8, i1 } zeroinitializer
|
||||
;
|
||||
%x = call {i8, i1} @llvm.umul.with.overflow.i8(i8 undef, i8 %V)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
define {i8, i1} @test_smul1(i8 %V) {
|
||||
; CHECK-LABEL: @test_smul1(
|
||||
; CHECK-NEXT: ret { i8, i1 } zeroinitializer
|
||||
;
|
||||
%x = call {i8, i1} @llvm.smul.with.overflow.i8(i8 %V, i8 0)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
define {i8, i1} @test_smul2(i8 %V) {
|
||||
; CHECK-LABEL: @test_smul2(
|
||||
; CHECK-NEXT: ret { i8, i1 } zeroinitializer
|
||||
;
|
||||
%x = call {i8, i1} @llvm.smul.with.overflow.i8(i8 %V, i8 undef)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
define {i8, i1} @test_smul3(i8 %V) {
|
||||
; CHECK-LABEL: @test_smul3(
|
||||
; CHECK-NEXT: ret { i8, i1 } zeroinitializer
|
||||
;
|
||||
%x = call {i8, i1} @llvm.smul.with.overflow.i8(i8 0, i8 %V)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
define {i8, i1} @test_smul4(i8 %V) {
|
||||
; CHECK-LABEL: @test_smul4(
|
||||
; CHECK-NEXT: ret { i8, i1 } zeroinitializer
|
||||
;
|
||||
%x = call {i8, i1} @llvm.smul.with.overflow.i8(i8 undef, i8 %V)
|
||||
ret {i8, i1} %x
|
||||
}
|
||||
|
||||
declare i256 @llvm.cttz.i256(i256 %src, i1 %is_zero_undef)
|
||||
|
||||
define i256 @test_cttz() {
|
||||
; CHECK-LABEL: @test_cttz(
|
||||
; CHECK-NEXT: ret i256 1
|
||||
;
|
||||
%x = call i256 @llvm.cttz.i256(i256 10, i1 false)
|
||||
ret i256 %x
|
||||
}
|
||||
|
||||
declare <2 x i256> @llvm.cttz.v2i256(<2 x i256> %src, i1 %is_zero_undef)
|
||||
|
||||
define <2 x i256> @test_cttz_vec() {
|
||||
; CHECK-LABEL: @test_cttz_vec(
|
||||
; CHECK-NEXT: ret <2 x i256> <i256 1, i256 1>
|
||||
;
|
||||
%x = call <2 x i256> @llvm.cttz.v2i256(<2 x i256> <i256 10, i256 10>, i1 false)
|
||||
ret <2 x i256> %x
|
||||
}
|
||||
|
||||
declare i256 @llvm.ctpop.i256(i256 %src)
|
||||
|
||||
define i256 @test_ctpop() {
|
||||
; CHECK-LABEL: @test_ctpop(
|
||||
; CHECK-NEXT: ret i256 2
|
||||
;
|
||||
%x = call i256 @llvm.ctpop.i256(i256 10)
|
||||
ret i256 %x
|
||||
}
|
||||
|
||||
; Test a non-intrinsic that we know about as a library call.
|
||||
declare float @fabs(float %x)
|
||||
|
||||
define float @test_fabs_libcall() {
|
||||
; CHECK-LABEL: @test_fabs_libcall(
|
||||
; CHECK-NEXT: [[X:%.*]] = call float @fabs(float -4.200000e+01)
|
||||
; CHECK-NEXT: ret float 4.200000e+01
|
||||
;
|
||||
|
||||
%x = call float @fabs(float -42.0)
|
||||
; This is still a real function call, so instsimplify won't nuke it -- other
|
||||
; passes have to do that.
|
||||
|
||||
ret float %x
|
||||
}
|
||||
|
||||
|
||||
declare float @llvm.fabs.f32(float) nounwind readnone
|
||||
declare float @llvm.floor.f32(float) nounwind readnone
|
||||
declare float @llvm.ceil.f32(float) nounwind readnone
|
||||
declare float @llvm.trunc.f32(float) nounwind readnone
|
||||
declare float @llvm.rint.f32(float) nounwind readnone
|
||||
declare float @llvm.nearbyint.f32(float) nounwind readnone
|
||||
declare float @llvm.canonicalize.f32(float) nounwind readnone
|
||||
|
||||
; Test idempotent intrinsics
|
||||
define float @test_idempotence(float %a) {
|
||||
; CHECK-LABEL: @test_idempotence(
|
||||
; CHECK-NEXT: [[A0:%.*]] = call float @llvm.fabs.f32(float [[A:%.*]])
|
||||
; CHECK-NEXT: [[B0:%.*]] = call float @llvm.floor.f32(float [[A]])
|
||||
; CHECK-NEXT: [[C0:%.*]] = call float @llvm.ceil.f32(float [[A]])
|
||||
; CHECK-NEXT: [[D0:%.*]] = call float @llvm.trunc.f32(float [[A]])
|
||||
; CHECK-NEXT: [[E0:%.*]] = call float @llvm.rint.f32(float [[A]])
|
||||
; CHECK-NEXT: [[F0:%.*]] = call float @llvm.nearbyint.f32(float [[A]])
|
||||
; CHECK-NEXT: [[G0:%.*]] = call float @llvm.canonicalize.f32(float [[A]])
|
||||
; CHECK-NEXT: [[R0:%.*]] = fadd float [[A0]], [[B0]]
|
||||
; CHECK-NEXT: [[R1:%.*]] = fadd float [[R0]], [[C0]]
|
||||
; CHECK-NEXT: [[R2:%.*]] = fadd float [[R1]], [[D0]]
|
||||
; CHECK-NEXT: [[R3:%.*]] = fadd float [[R2]], [[E0]]
|
||||
; CHECK-NEXT: [[R4:%.*]] = fadd float [[R3]], [[F0]]
|
||||
; CHECK-NEXT: [[R5:%.*]] = fadd float [[R4]], [[G0]]
|
||||
; CHECK-NEXT: ret float [[R5]]
|
||||
;
|
||||
|
||||
%a0 = call float @llvm.fabs.f32(float %a)
|
||||
%a1 = call float @llvm.fabs.f32(float %a0)
|
||||
|
||||
%b0 = call float @llvm.floor.f32(float %a)
|
||||
%b1 = call float @llvm.floor.f32(float %b0)
|
||||
|
||||
%c0 = call float @llvm.ceil.f32(float %a)
|
||||
%c1 = call float @llvm.ceil.f32(float %c0)
|
||||
|
||||
%d0 = call float @llvm.trunc.f32(float %a)
|
||||
%d1 = call float @llvm.trunc.f32(float %d0)
|
||||
|
||||
%e0 = call float @llvm.rint.f32(float %a)
|
||||
%e1 = call float @llvm.rint.f32(float %e0)
|
||||
|
||||
%f0 = call float @llvm.nearbyint.f32(float %a)
|
||||
%f1 = call float @llvm.nearbyint.f32(float %f0)
|
||||
|
||||
%g0 = call float @llvm.canonicalize.f32(float %a)
|
||||
%g1 = call float @llvm.canonicalize.f32(float %g0)
|
||||
|
||||
%r0 = fadd float %a1, %b1
|
||||
%r1 = fadd float %r0, %c1
|
||||
%r2 = fadd float %r1, %d1
|
||||
%r3 = fadd float %r2, %e1
|
||||
%r4 = fadd float %r3, %f1
|
||||
%r5 = fadd float %r4, %g1
|
||||
|
||||
ret float %r5
|
||||
}
|
||||
|
||||
define i8* @operator_new() {
|
||||
; CHECK-LABEL: @operator_new(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[CALL:%.*]] = tail call noalias i8* @_Znwm(i64 8)
|
||||
; CHECK-NEXT: br i1 false, label [[CAST_END:%.*]], label [[CAST_NOTNULL:%.*]]
|
||||
; CHECK: cast.notnull:
|
||||
; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[CALL]], i64 4
|
||||
; CHECK-NEXT: br label [[CAST_END]]
|
||||
; CHECK: cast.end:
|
||||
; CHECK-NEXT: [[CAST_RESULT:%.*]] = phi i8* [ [[ADD_PTR]], [[CAST_NOTNULL]] ], [ null, [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: ret i8* [[CAST_RESULT]]
|
||||
;
|
||||
entry:
|
||||
%call = tail call noalias i8* @_Znwm(i64 8)
|
||||
%cmp = icmp eq i8* %call, null
|
||||
br i1 %cmp, label %cast.end, label %cast.notnull
|
||||
|
||||
cast.notnull: ; preds = %entry
|
||||
%add.ptr = getelementptr inbounds i8, i8* %call, i64 4
|
||||
br label %cast.end
|
||||
|
||||
cast.end: ; preds = %cast.notnull, %entry
|
||||
%cast.result = phi i8* [ %add.ptr, %cast.notnull ], [ null, %entry ]
|
||||
ret i8* %cast.result
|
||||
|
||||
}
|
||||
|
||||
declare nonnull noalias i8* @_Znwm(i64)
|
||||
|
||||
%"struct.std::nothrow_t" = type { i8 }
|
||||
@_ZSt7nothrow = external global %"struct.std::nothrow_t"
|
||||
|
||||
define i8* @operator_new_nothrow_t() {
|
||||
; CHECK-LABEL: @operator_new_nothrow_t(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[CALL:%.*]] = tail call noalias i8* @_ZnamRKSt9nothrow_t(i64 8, %"struct.std::nothrow_t"* @_ZSt7nothrow)
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8* [[CALL]], null
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[CAST_END:%.*]], label [[CAST_NOTNULL:%.*]]
|
||||
; CHECK: cast.notnull:
|
||||
; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[CALL]], i64 4
|
||||
; CHECK-NEXT: br label [[CAST_END]]
|
||||
; CHECK: cast.end:
|
||||
; CHECK-NEXT: [[CAST_RESULT:%.*]] = phi i8* [ [[ADD_PTR]], [[CAST_NOTNULL]] ], [ null, [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: ret i8* [[CAST_RESULT]]
|
||||
;
|
||||
entry:
|
||||
%call = tail call noalias i8* @_ZnamRKSt9nothrow_t(i64 8, %"struct.std::nothrow_t"* @_ZSt7nothrow)
|
||||
%cmp = icmp eq i8* %call, null
|
||||
br i1 %cmp, label %cast.end, label %cast.notnull
|
||||
|
||||
cast.notnull: ; preds = %entry
|
||||
%add.ptr = getelementptr inbounds i8, i8* %call, i64 4
|
||||
br label %cast.end
|
||||
|
||||
cast.end: ; preds = %cast.notnull, %entry
|
||||
%cast.result = phi i8* [ %add.ptr, %cast.notnull ], [ null, %entry ]
|
||||
ret i8* %cast.result
|
||||
|
||||
}
|
||||
|
||||
declare i8* @_ZnamRKSt9nothrow_t(i64, %"struct.std::nothrow_t"*) nounwind
|
||||
|
||||
define i8* @malloc_can_return_null() {
|
||||
; CHECK-LABEL: @malloc_can_return_null(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[CALL:%.*]] = tail call noalias i8* @malloc(i64 8)
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8* [[CALL]], null
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[CAST_END:%.*]], label [[CAST_NOTNULL:%.*]]
|
||||
; CHECK: cast.notnull:
|
||||
; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[CALL]], i64 4
|
||||
; CHECK-NEXT: br label [[CAST_END]]
|
||||
; CHECK: cast.end:
|
||||
; CHECK-NEXT: [[CAST_RESULT:%.*]] = phi i8* [ [[ADD_PTR]], [[CAST_NOTNULL]] ], [ null, [[ENTRY:%.*]] ]
|
||||
; CHECK-NEXT: ret i8* [[CAST_RESULT]]
|
||||
;
|
||||
entry:
|
||||
%call = tail call noalias i8* @malloc(i64 8)
|
||||
%cmp = icmp eq i8* %call, null
|
||||
br i1 %cmp, label %cast.end, label %cast.notnull
|
||||
|
||||
cast.notnull: ; preds = %entry
|
||||
%add.ptr = getelementptr inbounds i8, i8* %call, i64 4
|
||||
br label %cast.end
|
||||
|
||||
cast.end: ; preds = %cast.notnull, %entry
|
||||
%cast.result = phi i8* [ %add.ptr, %cast.notnull ], [ null, %entry ]
|
||||
ret i8* %cast.result
|
||||
|
||||
}
|
||||
|
||||
define i32 @call_null() {
|
||||
; CHECK-LABEL: @call_null(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[CALL:%.*]] = call i32 null()
|
||||
; CHECK-NEXT: ret i32 undef
|
||||
;
|
||||
entry:
|
||||
%call = call i32 null()
|
||||
ret i32 %call
|
||||
}
|
||||
|
||||
define i32 @call_undef() {
|
||||
; CHECK-LABEL: @call_undef(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[CALL:%.*]] = call i32 undef()
|
||||
; CHECK-NEXT: ret i32 undef
|
||||
;
|
||||
entry:
|
||||
%call = call i32 undef()
|
||||
ret i32 %call
|
||||
}
|
||||
|
||||
@GV = private constant [8 x i32] [i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49]
|
||||
|
||||
define <8 x i32> @partial_masked_load() {
|
||||
; CHECK-LABEL: @partial_masked_load(
|
||||
; CHECK-NEXT: ret <8 x i32> <i32 undef, i32 undef, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47>
|
||||
;
|
||||
%masked.load = call <8 x i32> @llvm.masked.load.v8i32.p0v8i32(<8 x i32>* bitcast (i32* getelementptr ([8 x i32], [8 x i32]* @GV, i64 0, i64 -2) to <8 x i32>*), i32 4, <8 x i1> <i1 false, i1 false, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i32> undef)
|
||||
ret <8 x i32> %masked.load
|
||||
}
|
||||
|
||||
define <8 x i32> @masked_load_undef_mask(<8 x i32>* %V) {
|
||||
; CHECK-LABEL: @masked_load_undef_mask(
|
||||
; CHECK-NEXT: ret <8 x i32> <i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0>
|
||||
;
|
||||
%masked.load = call <8 x i32> @llvm.masked.load.v8i32.p0v8i32(<8 x i32>* %V, i32 4, <8 x i1> undef, <8 x i32> <i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0>)
|
||||
ret <8 x i32> %masked.load
|
||||
}
|
||||
|
||||
declare noalias i8* @malloc(i64)
|
||||
|
||||
declare <8 x i32> @llvm.masked.load.v8i32.p0v8i32(<8 x i32>*, i32, <8 x i1>, <8 x i32>)
|
||||
|
||||
declare double @llvm.powi.f64(double, i32)
|
||||
declare <2 x double> @llvm.powi.v2f64(<2 x double>, i32)
|
||||
|
||||
define double @constant_fold_powi() nounwind uwtable ssp {
|
||||
; CHECK-LABEL: @constant_fold_powi(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: ret double 9.000000e+00
|
||||
;
|
||||
entry:
|
||||
%0 = call double @llvm.powi.f64(double 3.00000e+00, i32 2)
|
||||
ret double %0
|
||||
}
|
||||
|
||||
define <2 x double> @constant_fold_powi_vec() nounwind uwtable ssp {
|
||||
; CHECK-LABEL: @constant_fold_powi_vec(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: ret <2 x double> <double 9.000000e+00, double 2.500000e+01>
|
||||
;
|
||||
entry:
|
||||
%0 = call <2 x double> @llvm.powi.v2f64(<2 x double> <double 3.00000e+00, double 5.00000e+00>, i32 2)
|
||||
ret <2 x double> %0
|
||||
}
|
@ -1,54 +0,0 @@
|
||||
; RUN: opt -S -instsimplify < %s | FileCheck %s
|
||||
target datalayout = "p:32:32"
|
||||
|
||||
define i1 @test1(i1 %V) {
|
||||
entry:
|
||||
%Z = zext i1 %V to i32
|
||||
%T = trunc i32 %Z to i1
|
||||
ret i1 %T
|
||||
; CHECK-LABEL: define i1 @test1(
|
||||
; CHECK: ret i1 %V
|
||||
}
|
||||
|
||||
define i8* @test2(i8* %V) {
|
||||
entry:
|
||||
%BC1 = bitcast i8* %V to i32*
|
||||
%BC2 = bitcast i32* %BC1 to i8*
|
||||
ret i8* %BC2
|
||||
; CHECK-LABEL: define i8* @test2(
|
||||
; CHECK: ret i8* %V
|
||||
}
|
||||
|
||||
define i8* @test3(i8* %V) {
|
||||
entry:
|
||||
%BC = bitcast i8* %V to i8*
|
||||
ret i8* %BC
|
||||
; CHECK-LABEL: define i8* @test3(
|
||||
; CHECK: ret i8* %V
|
||||
}
|
||||
|
||||
define i32 @test4() {
|
||||
; CHECK-LABEL: @test4(
|
||||
%alloca = alloca i32, align 4 ; alloca + 0
|
||||
%gep = getelementptr inbounds i32, i32* %alloca, i32 1 ; alloca + 4
|
||||
%bc = bitcast i32* %gep to [4 x i8]* ; alloca + 4
|
||||
%pti = ptrtoint i32* %alloca to i32 ; alloca
|
||||
%sub = sub i32 0, %pti ; -alloca
|
||||
%add = getelementptr [4 x i8], [4 x i8]* %bc, i32 0, i32 %sub ; alloca + 4 - alloca == 4
|
||||
%add_to_int = ptrtoint i8* %add to i32 ; 4
|
||||
ret i32 %add_to_int ; 4
|
||||
; CHECK-NEXT: ret i32 4
|
||||
}
|
||||
|
||||
define i32 @test5() {
|
||||
; CHECK-LABEL: @test5(
|
||||
%alloca = alloca i32, align 4 ; alloca + 0
|
||||
%gep = getelementptr inbounds i32, i32* %alloca, i32 1 ; alloca + 4
|
||||
%bc = bitcast i32* %gep to [4 x i8]* ; alloca + 4
|
||||
%pti = ptrtoint i32* %alloca to i32 ; alloca
|
||||
%sub = xor i32 %pti, -1 ; ~alloca
|
||||
%add = getelementptr [4 x i8], [4 x i8]* %bc, i32 0, i32 %sub ; alloca + 4 - alloca - 1 == 3
|
||||
%add_to_int = ptrtoint i8* %add to i32 ; 4
|
||||
ret i32 %add_to_int ; 4
|
||||
; CHECK-NEXT: ret i32 3
|
||||
}
|
1278
external/llvm/test/Transforms/InstSimplify/compare.ll
vendored
1278
external/llvm/test/Transforms/InstSimplify/compare.ll
vendored
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user