File: and-or-implied-cond-not.ll

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (69 lines) | stat: -rw-r--r-- 2,255 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt < %s -passes=instcombine -S | FileCheck %s

define i1 @test_imply_not1(i32 %depth) {
; CHECK-LABEL: define i1 @test_imply_not1(
; CHECK-SAME: i32 [[DEPTH:%.*]]) {
; CHECK-NEXT:    [[CMP1_NOT1:%.*]] = icmp eq i32 [[DEPTH]], 16
; CHECK-NEXT:    call void @use(i1 [[CMP1_NOT1]])
; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[DEPTH]], 8
; CHECK-NEXT:    call void @use(i1 [[CMP2]])
; CHECK-NEXT:    br i1 [[CMP1_NOT1]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
; CHECK:       if.then:
; CHECK-NEXT:    call void @func1()
; CHECK-NEXT:    unreachable
; CHECK:       if.else:
; CHECK-NEXT:    call void @func2()
; CHECK-NEXT:    unreachable
;
  %cmp1 = icmp eq i32 %depth, 16
  call void @use(i1 %cmp1)
  %cmp2 = icmp slt i32 %depth, 8
  call void @use(i1 %cmp2)
  %cmp.not = xor i1 %cmp1, true
  %brmerge = or i1 %cmp2, %cmp.not
  br i1 %brmerge, label %if.then, label %if.else
if.then:
  call void @func1()
  unreachable

if.else:
  call void @func2()
  unreachable
}

define i1 @test_imply_not2(i32 %a, i1 %cmp2) {
; CHECK-LABEL: define i1 @test_imply_not2(
; CHECK-SAME: i32 [[A:%.*]], i1 [[CMP2:%.*]]) {
; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i32 [[A]], 0
; CHECK-NEXT:    [[BRMERGE:%.*]] = select i1 [[CMP1]], i1 true, i1 [[CMP2]]
; CHECK-NEXT:    ret i1 [[BRMERGE]]
;
  %cmp1 = icmp eq i32 %a, 0
  %or.cond = select i1 %cmp1, i1 %cmp2, i1 false
  %cmp.not = xor i1 %cmp1, true
  %brmerge = or i1 %or.cond, %cmp.not
  ret i1 %brmerge
}

define i1 @test_imply_not3(i32 %a, i32 %b, i1 %cond) {
; CHECK-LABEL: define i1 @test_imply_not3(
; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]], i1 [[COND:%.*]]) {
; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32 [[A]], [[B]]
; CHECK-NEXT:    call void @use(i1 [[CMP1]])
; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[A]], [[B]]
; CHECK-NEXT:    [[AND:%.*]] = select i1 [[CMP2]], i1 [[COND]], i1 false
; CHECK-NEXT:    ret i1 [[AND]]
;
  %cmp1 = icmp eq i32 %a, %b
  call void @use(i1 %cmp1)
  %cmp2 = icmp slt i32 %a, %b
  %cmp.not = xor i1 %cmp1, true
  %sel = select i1 %cmp.not, i1 %cond, i1 false
  %and = and i1 %cmp2, %sel
  ret i1 %and
}

declare void @func1()
declare void @func2()
declare void @use(i1)