1784c70d7SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes 28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3784c70d7SFlorian Hahn 4a2ba4e80SAntonio Frighettodeclare void @llvm.assume(i1) 5a2ba4e80SAntonio Frighetto 695daec6aSFlorian Hahndefine i1 @test_eq_ne_0(i8 %a, i8 %b) { 795daec6aSFlorian Hahn; CHECK-LABEL: @test_eq_ne_0( 8784c70d7SFlorian Hahn; CHECK-NEXT: entry: 9784c70d7SFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A:%.*]], 0 10784c70d7SFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 11784c70d7SFlorian Hahn; CHECK: then: 12784c70d7SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]] 13a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[RES_1:%.*]] = xor i1 false, true 14784c70d7SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]] 15784c70d7SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_2]] 16784c70d7SFlorian Hahn; CHECK: else: 17784c70d7SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ne i8 [[A]], 1 18784c70d7SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ne i8 [[A]], [[B]] 1995daec6aSFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = xor i1 true, [[C_3]] 20784c70d7SFlorian Hahn; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]] 21784c70d7SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_4]] 22784c70d7SFlorian Hahn; 23784c70d7SFlorian Hahnentry: 24784c70d7SFlorian Hahn %cmp = icmp eq i8 %a, 0 25784c70d7SFlorian Hahn br i1 %cmp, label %then, label %else 26784c70d7SFlorian Hahn 27784c70d7SFlorian Hahnthen: 28784c70d7SFlorian Hahn %f.1 = icmp ne i8 %a, 0 29784c70d7SFlorian Hahn %c.1 = icmp ne i8 %a, 1 30784c70d7SFlorian Hahn %c.2 = icmp ne i8 %a, %b 31784c70d7SFlorian Hahn %res.1 = xor i1 %f.1, %c.1 32784c70d7SFlorian Hahn %res.2 = xor i1 %res.1, %c.2 33784c70d7SFlorian Hahn ret i1 %res.2 34784c70d7SFlorian Hahn 35784c70d7SFlorian Hahnelse: 36784c70d7SFlorian Hahn %t.1 = icmp ne i8 %a, 0 37784c70d7SFlorian Hahn %c.3 = icmp ne i8 %a, 1 38784c70d7SFlorian Hahn %c.4 = icmp ne i8 %a, %b 39784c70d7SFlorian Hahn %res.3 = xor i1 %t.1, %c.3 40784c70d7SFlorian Hahn %res.4 = xor i1 %res.3, %c.4 41784c70d7SFlorian Hahn ret i1 %res.4 42784c70d7SFlorian Hahn} 43784c70d7SFlorian Hahn 4495daec6aSFlorian Hahndefine i1 @test_ne_eq_0(i8 %a, i8 %b) { 4595daec6aSFlorian Hahn; CHECK-LABEL: @test_ne_eq_0( 46784c70d7SFlorian Hahn; CHECK-NEXT: entry: 47784c70d7SFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[A:%.*]], 0 48784c70d7SFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 49784c70d7SFlorian Hahn; CHECK: then: 50784c70d7SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[A]], 1 5195daec6aSFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, [[C_1]] 52784c70d7SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]] 53784c70d7SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]] 54784c70d7SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp eq i8 [[A]], [[B]] 55784c70d7SFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], [[C_3]] 56258a0a3aSFlorian Hahn; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], false 5795daec6aSFlorian Hahn; CHECK-NEXT: [[RES_5:%.*]] = xor i1 [[RES_4]], true 5895daec6aSFlorian Hahn; CHECK-NEXT: [[RES_6:%.*]] = xor i1 [[RES_5]], true 59784c70d7SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[A]], 1 60784c70d7SFlorian Hahn; CHECK-NEXT: [[RES_7:%.*]] = xor i1 [[RES_6]], [[C_5]] 61784c70d7SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp sgt i8 [[A]], 0 62784c70d7SFlorian Hahn; CHECK-NEXT: [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_6]] 63784c70d7SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_8]] 64784c70d7SFlorian Hahn; CHECK: else: 65a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[RES_9:%.*]] = xor i1 false, true 66784c70d7SFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp ne i8 [[A]], [[B]] 67784c70d7SFlorian Hahn; CHECK-NEXT: [[RES_10:%.*]] = xor i1 [[RES_9]], [[C_8]] 68784c70d7SFlorian Hahn; CHECK-NEXT: [[C_9:%.*]] = icmp eq i8 [[A]], [[B]] 69784c70d7SFlorian Hahn; CHECK-NEXT: [[RES_11:%.*]] = xor i1 [[RES_10]], [[C_9]] 70258a0a3aSFlorian Hahn; CHECK-NEXT: [[RES_12:%.*]] = xor i1 [[RES_11]], true 71784c70d7SFlorian Hahn; CHECK-NEXT: [[RES_13:%.*]] = xor i1 [[RES_12]], false 72784c70d7SFlorian Hahn; CHECK-NEXT: [[RES_14:%.*]] = xor i1 [[RES_13]], false 73784c70d7SFlorian Hahn; CHECK-NEXT: [[RES_15:%.*]] = xor i1 [[RES_14]], false 74*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[RES_16:%.*]] = xor i1 [[RES_15]], false 75784c70d7SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_16]] 76784c70d7SFlorian Hahn; 77784c70d7SFlorian Hahnentry: 78784c70d7SFlorian Hahn %cmp = icmp ne i8 %a, 0 79784c70d7SFlorian Hahn br i1 %cmp, label %then, label %else 80784c70d7SFlorian Hahn 81784c70d7SFlorian Hahnthen: 82784c70d7SFlorian Hahn %t.1 = icmp ne i8 %a, 0 83784c70d7SFlorian Hahn %c.1 = icmp ne i8 %a, 1 84784c70d7SFlorian Hahn %res.1 = xor i1 %t.1, %c.1 85784c70d7SFlorian Hahn 86784c70d7SFlorian Hahn %c.2 = icmp ne i8 %a, %b 87784c70d7SFlorian Hahn %res.2 = xor i1 %res.1, %c.2 88784c70d7SFlorian Hahn 89784c70d7SFlorian Hahn %c.3 = icmp eq i8 %a, %b 90784c70d7SFlorian Hahn %res.3 = xor i1 %res.2, %c.3 91784c70d7SFlorian Hahn 92784c70d7SFlorian Hahn %c.4 = icmp eq i8 %a, 0 93784c70d7SFlorian Hahn %res.4 = xor i1 %res.3, %c.4 94784c70d7SFlorian Hahn 95784c70d7SFlorian Hahn %t.2 = icmp ugt i8 %a, 0 96784c70d7SFlorian Hahn %res.5 = xor i1 %res.4, %t.2 97784c70d7SFlorian Hahn 98784c70d7SFlorian Hahn %t.3 = icmp uge i8 %a, 1 99784c70d7SFlorian Hahn %res.6 = xor i1 %res.5, %t.3 100784c70d7SFlorian Hahn 101784c70d7SFlorian Hahn %c.5 = icmp ugt i8 %a, 1 102784c70d7SFlorian Hahn %res.7 = xor i1 %res.6, %c.5 103784c70d7SFlorian Hahn 104784c70d7SFlorian Hahn %c.6 = icmp sgt i8 %a, 0 105784c70d7SFlorian Hahn %res.8 = xor i1 %res.7, %c.6 106784c70d7SFlorian Hahn 107784c70d7SFlorian Hahn ret i1 %res.8 108784c70d7SFlorian Hahn 109784c70d7SFlorian Hahnelse: 110784c70d7SFlorian Hahn %f.1 = icmp ne i8 %a, 0 111784c70d7SFlorian Hahn %c.7 = icmp ne i8 %a, 1 112784c70d7SFlorian Hahn %res.9 = xor i1 %f.1, %c.7 113784c70d7SFlorian Hahn 114784c70d7SFlorian Hahn %c.8 = icmp ne i8 %a, %b 115784c70d7SFlorian Hahn %res.10 = xor i1 %res.9, %c.8 116784c70d7SFlorian Hahn 117784c70d7SFlorian Hahn %c.9 = icmp eq i8 %a, %b 118784c70d7SFlorian Hahn %res.11 = xor i1 %res.10, %c.9 119784c70d7SFlorian Hahn 120784c70d7SFlorian Hahn %c.10 = icmp eq i8 %a, 0 121784c70d7SFlorian Hahn %res.12 = xor i1 %res.11, %c.10 122784c70d7SFlorian Hahn 123784c70d7SFlorian Hahn %f.2 = icmp ugt i8 %a, 0 124784c70d7SFlorian Hahn %res.13 = xor i1 %res.12, %f.2 125784c70d7SFlorian Hahn 126784c70d7SFlorian Hahn %f.3 = icmp uge i8 %a, 1 127784c70d7SFlorian Hahn %res.14 = xor i1 %res.13, %f.3 128784c70d7SFlorian Hahn 129784c70d7SFlorian Hahn %c.11 = icmp ugt i8 %a, 1 130784c70d7SFlorian Hahn %res.15 = xor i1 %res.14, %c.11 131784c70d7SFlorian Hahn 132784c70d7SFlorian Hahn %c.12 = icmp sgt i8 %a, 0 133784c70d7SFlorian Hahn %res.16 = xor i1 %res.15, %c.12 134784c70d7SFlorian Hahn 135784c70d7SFlorian Hahn ret i1 %res.16 136784c70d7SFlorian Hahn} 13795daec6aSFlorian Hahn 13895daec6aSFlorian Hahndefine i1 @test_eq_ne_1(i8 %a, i8 %b) { 13995daec6aSFlorian Hahn; CHECK-LABEL: @test_eq_ne_1( 14095daec6aSFlorian Hahn; CHECK-NEXT: entry: 14195daec6aSFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A:%.*]], 1 14295daec6aSFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 14395daec6aSFlorian Hahn; CHECK: then: 14495daec6aSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]] 145a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, false 14695daec6aSFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]] 14795daec6aSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_2]] 14895daec6aSFlorian Hahn; CHECK: else: 14995daec6aSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ne i8 [[A]], 0 15095daec6aSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ne i8 [[A]], 1 15195daec6aSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ne i8 [[A]], [[B]] 15295daec6aSFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[T_1]], [[C_3]] 15395daec6aSFlorian Hahn; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]] 15495daec6aSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_4]] 15595daec6aSFlorian Hahn; 15695daec6aSFlorian Hahnentry: 15795daec6aSFlorian Hahn %cmp = icmp eq i8 %a, 1 15895daec6aSFlorian Hahn br i1 %cmp, label %then, label %else 15995daec6aSFlorian Hahn 16095daec6aSFlorian Hahnthen: 16195daec6aSFlorian Hahn %f.1 = icmp ne i8 %a, 0 16295daec6aSFlorian Hahn %c.1 = icmp ne i8 %a, 1 16395daec6aSFlorian Hahn %c.2 = icmp ne i8 %a, %b 16495daec6aSFlorian Hahn %res.1 = xor i1 %f.1, %c.1 16595daec6aSFlorian Hahn %res.2 = xor i1 %res.1, %c.2 16695daec6aSFlorian Hahn ret i1 %res.2 16795daec6aSFlorian Hahn 16895daec6aSFlorian Hahnelse: 16995daec6aSFlorian Hahn %t.1 = icmp ne i8 %a, 0 17095daec6aSFlorian Hahn %c.3 = icmp ne i8 %a, 1 17195daec6aSFlorian Hahn %c.4 = icmp ne i8 %a, %b 17295daec6aSFlorian Hahn %res.3 = xor i1 %t.1, %c.3 17395daec6aSFlorian Hahn %res.4 = xor i1 %res.3, %c.4 17495daec6aSFlorian Hahn ret i1 %res.4 17595daec6aSFlorian Hahn} 17695daec6aSFlorian Hahn 17795daec6aSFlorian Hahndefine i1 @test_ne_eq_1(i8 %a, i8 %b) { 17895daec6aSFlorian Hahn; CHECK-LABEL: @test_ne_eq_1( 17995daec6aSFlorian Hahn; CHECK-NEXT: entry: 18095daec6aSFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[A:%.*]], 1 18195daec6aSFlorian Hahn; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 18295daec6aSFlorian Hahn; CHECK: then: 18395daec6aSFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ne i8 [[A]], 1 18495daec6aSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ne i8 [[A]], 0 18595daec6aSFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[C_1]] 18695daec6aSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[A]], [[B:%.*]] 18795daec6aSFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_2]] 18895daec6aSFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp eq i8 [[A]], [[B]] 18995daec6aSFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], [[C_3]] 19095daec6aSFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp eq i8 [[A]], 0 19195daec6aSFlorian Hahn; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]] 19295daec6aSFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[A]], 0 19395daec6aSFlorian Hahn; CHECK-NEXT: [[RES_5:%.*]] = xor i1 [[RES_4]], [[C_5]] 19495daec6aSFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp uge i8 [[A]], 1 19595daec6aSFlorian Hahn; CHECK-NEXT: [[RES_6:%.*]] = xor i1 [[RES_5]], [[C_6]] 19695daec6aSFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp ugt i8 [[A]], 1 19795daec6aSFlorian Hahn; CHECK-NEXT: [[RES_7:%.*]] = xor i1 [[RES_6]], [[C_5]] 19895daec6aSFlorian Hahn; CHECK-NEXT: [[C_8:%.*]] = icmp sgt i8 [[A]], 0 19995daec6aSFlorian Hahn; CHECK-NEXT: [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_6]] 20095daec6aSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_8]] 20195daec6aSFlorian Hahn; CHECK: else: 202a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[RES_9:%.*]] = xor i1 true, false 20395daec6aSFlorian Hahn; CHECK-NEXT: [[C_10:%.*]] = icmp ne i8 [[A]], [[B]] 20495daec6aSFlorian Hahn; CHECK-NEXT: [[RES_10:%.*]] = xor i1 [[RES_9]], [[C_10]] 20595daec6aSFlorian Hahn; CHECK-NEXT: [[C_11:%.*]] = icmp eq i8 [[A]], [[B]] 20695daec6aSFlorian Hahn; CHECK-NEXT: [[RES_11:%.*]] = xor i1 [[RES_10]], [[C_11]] 207258a0a3aSFlorian Hahn; CHECK-NEXT: [[RES_12:%.*]] = xor i1 [[RES_11]], false 20895daec6aSFlorian Hahn; CHECK-NEXT: [[RES_13:%.*]] = xor i1 [[RES_12]], true 20995daec6aSFlorian Hahn; CHECK-NEXT: [[RES_14:%.*]] = xor i1 [[RES_13]], true 21095daec6aSFlorian Hahn; CHECK-NEXT: [[RES_15:%.*]] = xor i1 [[RES_14]], false 211*7fb97beeSStephen Senran Zhang; CHECK-NEXT: [[RES_16:%.*]] = xor i1 [[RES_15]], true 21295daec6aSFlorian Hahn; CHECK-NEXT: ret i1 [[RES_16]] 21395daec6aSFlorian Hahn; 21495daec6aSFlorian Hahnentry: 21595daec6aSFlorian Hahn %cmp = icmp ne i8 %a, 1 21695daec6aSFlorian Hahn br i1 %cmp, label %then, label %else 21795daec6aSFlorian Hahn 21895daec6aSFlorian Hahnthen: 21995daec6aSFlorian Hahn %t.1 = icmp ne i8 %a, 1 22095daec6aSFlorian Hahn %c.1 = icmp ne i8 %a, 0 22195daec6aSFlorian Hahn %res.1 = xor i1 %t.1, %c.1 22295daec6aSFlorian Hahn 22395daec6aSFlorian Hahn %c.2 = icmp ne i8 %a, %b 22495daec6aSFlorian Hahn %res.2 = xor i1 %res.1, %c.2 22595daec6aSFlorian Hahn 22695daec6aSFlorian Hahn %c.3 = icmp eq i8 %a, %b 22795daec6aSFlorian Hahn %res.3 = xor i1 %res.2, %c.3 22895daec6aSFlorian Hahn 22995daec6aSFlorian Hahn %c.4 = icmp eq i8 %a, 0 23095daec6aSFlorian Hahn %res.4 = xor i1 %res.3, %c.4 23195daec6aSFlorian Hahn 23295daec6aSFlorian Hahn %c.5 = icmp ugt i8 %a, 0 23395daec6aSFlorian Hahn %res.5 = xor i1 %res.4, %c.5 23495daec6aSFlorian Hahn 23595daec6aSFlorian Hahn %c.6 = icmp uge i8 %a, 1 23695daec6aSFlorian Hahn %res.6 = xor i1 %res.5, %c.6 23795daec6aSFlorian Hahn 23895daec6aSFlorian Hahn %c.7 = icmp ugt i8 %a, 1 23995daec6aSFlorian Hahn %res.7 = xor i1 %res.6, %c.5 24095daec6aSFlorian Hahn 24195daec6aSFlorian Hahn %c.8 = icmp sgt i8 %a, 0 24295daec6aSFlorian Hahn %res.8 = xor i1 %res.7, %c.6 24395daec6aSFlorian Hahn 24495daec6aSFlorian Hahn ret i1 %res.8 24595daec6aSFlorian Hahn 24695daec6aSFlorian Hahnelse: 24795daec6aSFlorian Hahn %t.2 = icmp ne i8 %a, 0 24895daec6aSFlorian Hahn %c.9 = icmp ne i8 %a, 1 24995daec6aSFlorian Hahn %res.9 = xor i1 %t.2, %c.9 25095daec6aSFlorian Hahn 25195daec6aSFlorian Hahn %c.10 = icmp ne i8 %a, %b 25295daec6aSFlorian Hahn %res.10 = xor i1 %res.9, %c.10 25395daec6aSFlorian Hahn 25495daec6aSFlorian Hahn %c.11 = icmp eq i8 %a, %b 25595daec6aSFlorian Hahn %res.11 = xor i1 %res.10, %c.11 25695daec6aSFlorian Hahn 25795daec6aSFlorian Hahn %f.1 = icmp eq i8 %a, 0 25895daec6aSFlorian Hahn %res.12 = xor i1 %res.11, %f.1 25995daec6aSFlorian Hahn 26095daec6aSFlorian Hahn %t.3 = icmp ugt i8 %a, 0 26195daec6aSFlorian Hahn %res.13 = xor i1 %res.12, %t.3 26295daec6aSFlorian Hahn 26395daec6aSFlorian Hahn %t.4 = icmp uge i8 %a, 1 26495daec6aSFlorian Hahn %res.14 = xor i1 %res.13, %t.4 26595daec6aSFlorian Hahn 26695daec6aSFlorian Hahn %f.2 = icmp ugt i8 %a, 1 26795daec6aSFlorian Hahn %res.15 = xor i1 %res.14, %f.2 26895daec6aSFlorian Hahn 26995daec6aSFlorian Hahn %c.12 = icmp sgt i8 %a, 0 27095daec6aSFlorian Hahn %res.16 = xor i1 %res.15, %c.12 27195daec6aSFlorian Hahn 27295daec6aSFlorian Hahn ret i1 %res.16 27395daec6aSFlorian Hahn} 274a2ba4e80SAntonio Frighetto 275a2ba4e80SAntonio Frighettodefine i1 @assume_b_plus_1_ult_a(i64 %a, i64 %b) { 276a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_b_plus_1_ult_a( 277a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[TMP1:%.*]] = add nuw i64 [[B:%.*]], 1 278a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i64 [[TMP1]], [[A:%.*]] 279a2ba4e80SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP2]]) 280a2ba4e80SAntonio Frighetto; CHECK-NEXT: ret i1 true 281a2ba4e80SAntonio Frighetto; 282a2ba4e80SAntonio Frighetto %1 = add nuw i64 %b, 1 283a2ba4e80SAntonio Frighetto %2 = icmp ult i64 %1, %a 284a2ba4e80SAntonio Frighetto tail call void @llvm.assume(i1 %2) 285a2ba4e80SAntonio Frighetto %3 = icmp ne i64 %a, %b 286a2ba4e80SAntonio Frighetto ret i1 %3 287a2ba4e80SAntonio Frighetto} 288a2ba4e80SAntonio Frighetto 289a2ba4e80SAntonio Frighettodefine i1 @assume_a_gt_b_and_b_ge_c(i64 %a, i64 %b, i64 %c) { 290a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_a_gt_b_and_b_ge_c( 291a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i64 [[A:%.*]], [[B:%.*]] 292a2ba4e80SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP1]]) 293a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[B]], [[C:%.*]] 294a2ba4e80SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP2]]) 295a2ba4e80SAntonio Frighetto; CHECK-NEXT: ret i1 true 296a2ba4e80SAntonio Frighetto; 297a2ba4e80SAntonio Frighetto %1 = icmp ugt i64 %a, %b 298a2ba4e80SAntonio Frighetto tail call void @llvm.assume(i1 %1) 299a2ba4e80SAntonio Frighetto %2 = icmp uge i64 %b, %c 300a2ba4e80SAntonio Frighetto tail call void @llvm.assume(i1 %2) 301a2ba4e80SAntonio Frighetto %3 = icmp ne i64 %a, %c 302a2ba4e80SAntonio Frighetto ret i1 %3 303a2ba4e80SAntonio Frighetto} 304a2ba4e80SAntonio Frighetto 305a2ba4e80SAntonio Frighettodefine i1 @assume_a_ne_b_and_b_ne_c(i64 %a, i64 %b, i64 %c) { 306a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_a_ne_b_and_b_ne_c( 307a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]] 308a2ba4e80SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP1]]) 309a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i64 [[B]], [[C:%.*]] 310a2ba4e80SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP2]]) 311a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i64 [[A]], [[C]] 312a2ba4e80SAntonio Frighetto; CHECK-NEXT: ret i1 [[TMP3]] 313a2ba4e80SAntonio Frighetto; 314a2ba4e80SAntonio Frighetto %1 = icmp ne i64 %a, %b 315a2ba4e80SAntonio Frighetto tail call void @llvm.assume(i1 %1) 316a2ba4e80SAntonio Frighetto %2 = icmp ne i64 %b, %c 317a2ba4e80SAntonio Frighetto tail call void @llvm.assume(i1 %2) 318a2ba4e80SAntonio Frighetto %3 = icmp ne i64 %a, %c 319a2ba4e80SAntonio Frighetto ret i1 %3 320a2ba4e80SAntonio Frighetto} 321a2ba4e80SAntonio Frighetto 322a2ba4e80SAntonio Frighettodefine i1 @assume_1a(i64 %a, i64 %b) { 323a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_1a( 324a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]] 325a2ba4e80SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[NE]]) 326a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[RET:%.*]] = icmp ugt i64 [[A]], [[B]] 327a2ba4e80SAntonio Frighetto; CHECK-NEXT: ret i1 [[RET]] 328a2ba4e80SAntonio Frighetto; 329a2ba4e80SAntonio Frighetto %ne = icmp ne i64 %a, %b 330a2ba4e80SAntonio Frighetto tail call void @llvm.assume(i1 %ne) 331a2ba4e80SAntonio Frighetto %ret = icmp ugt i64 %a, %b 332a2ba4e80SAntonio Frighetto ret i1 %ret 333a2ba4e80SAntonio Frighetto} 334a2ba4e80SAntonio Frighetto 335a2ba4e80SAntonio Frighettodefine i1 @assume_1b(i64 %a, i64 %b) { 336a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_1b( 337a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]] 338a2ba4e80SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[NE]]) 339a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[RET:%.*]] = icmp uge i64 [[A]], [[B]] 340a2ba4e80SAntonio Frighetto; CHECK-NEXT: ret i1 [[RET]] 341a2ba4e80SAntonio Frighetto; 342a2ba4e80SAntonio Frighetto %ne = icmp ne i64 %a, %b 343a2ba4e80SAntonio Frighetto tail call void @llvm.assume(i1 %ne) 344a2ba4e80SAntonio Frighetto %ret = icmp uge i64 %a, %b 345a2ba4e80SAntonio Frighetto ret i1 %ret 346a2ba4e80SAntonio Frighetto} 347a2ba4e80SAntonio Frighetto 348a2ba4e80SAntonio Frighettodefine i1 @assume_2a(i64 %a, i64 %b) { 349a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_2a( 350a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]] 351a2ba4e80SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[NE]]) 352a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[RET:%.*]] = icmp ult i64 [[A]], [[B]] 353a2ba4e80SAntonio Frighetto; CHECK-NEXT: ret i1 [[RET]] 354a2ba4e80SAntonio Frighetto; 355a2ba4e80SAntonio Frighetto %ne = icmp ne i64 %a, %b 356a2ba4e80SAntonio Frighetto tail call void @llvm.assume(i1 %ne) 357a2ba4e80SAntonio Frighetto %ret = icmp ult i64 %a, %b 358a2ba4e80SAntonio Frighetto ret i1 %ret 359a2ba4e80SAntonio Frighetto} 360a2ba4e80SAntonio Frighetto 361a2ba4e80SAntonio Frighettodefine i1 @assume_2b(i64 %a, i64 %b) { 362a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_2b( 363a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]] 364a2ba4e80SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[NE]]) 365a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[RET:%.*]] = icmp ule i64 [[A]], [[B]] 366a2ba4e80SAntonio Frighetto; CHECK-NEXT: ret i1 [[RET]] 367a2ba4e80SAntonio Frighetto; 368a2ba4e80SAntonio Frighetto %ne = icmp ne i64 %a, %b 369a2ba4e80SAntonio Frighetto tail call void @llvm.assume(i1 %ne) 370a2ba4e80SAntonio Frighetto %ret = icmp ule i64 %a, %b 371a2ba4e80SAntonio Frighetto ret i1 %ret 372a2ba4e80SAntonio Frighetto} 373a2ba4e80SAntonio Frighetto 374a2ba4e80SAntonio Frighetto; TODO: extend to support signed comparisons 375a2ba4e80SAntonio Frighettodefine i1 @assume_3a(i64 %a, i64 %b) { 376a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_3a( 377a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]] 378a2ba4e80SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[NE]]) 379a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[RET:%.*]] = icmp sgt i64 [[A]], [[B]] 380a2ba4e80SAntonio Frighetto; CHECK-NEXT: ret i1 [[RET]] 381a2ba4e80SAntonio Frighetto; 382a2ba4e80SAntonio Frighetto %ne = icmp ne i64 %a, %b 383a2ba4e80SAntonio Frighetto tail call void @llvm.assume(i1 %ne) 384a2ba4e80SAntonio Frighetto %ret = icmp sgt i64 %a, %b 385a2ba4e80SAntonio Frighetto ret i1 %ret 386a2ba4e80SAntonio Frighetto} 387a2ba4e80SAntonio Frighetto 388a2ba4e80SAntonio Frighettodefine i1 @assume_3b(i64 %a, i64 %b) { 389a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_3b( 390a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]] 391a2ba4e80SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[NE]]) 392a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[RET:%.*]] = icmp sge i64 [[A]], [[B]] 393a2ba4e80SAntonio Frighetto; CHECK-NEXT: ret i1 [[RET]] 394a2ba4e80SAntonio Frighetto; 395a2ba4e80SAntonio Frighetto %ne = icmp ne i64 %a, %b 396a2ba4e80SAntonio Frighetto tail call void @llvm.assume(i1 %ne) 397a2ba4e80SAntonio Frighetto %ret = icmp sge i64 %a, %b 398a2ba4e80SAntonio Frighetto ret i1 %ret 399a2ba4e80SAntonio Frighetto} 400a2ba4e80SAntonio Frighetto 401a2ba4e80SAntonio Frighettodefine i1 @assume_4a(i64 %a, i64 %b) { 402a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_4a( 403a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]] 404a2ba4e80SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[NE]]) 405a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[RET:%.*]] = icmp slt i64 [[A]], [[B]] 406a2ba4e80SAntonio Frighetto; CHECK-NEXT: ret i1 [[RET]] 407a2ba4e80SAntonio Frighetto; 408a2ba4e80SAntonio Frighetto %ne = icmp ne i64 %a, %b 409a2ba4e80SAntonio Frighetto tail call void @llvm.assume(i1 %ne) 410a2ba4e80SAntonio Frighetto %ret = icmp slt i64 %a, %b 411a2ba4e80SAntonio Frighetto ret i1 %ret 412a2ba4e80SAntonio Frighetto} 413a2ba4e80SAntonio Frighetto 414a2ba4e80SAntonio Frighettodefine i1 @assume_4b(i64 %a, i64 %b) { 415a2ba4e80SAntonio Frighetto; CHECK-LABEL: @assume_4b( 416a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[NE:%.*]] = icmp ne i64 [[A:%.*]], [[B:%.*]] 417a2ba4e80SAntonio Frighetto; CHECK-NEXT: tail call void @llvm.assume(i1 [[NE]]) 418a2ba4e80SAntonio Frighetto; CHECK-NEXT: [[RET:%.*]] = icmp sle i64 [[A]], [[B]] 419a2ba4e80SAntonio Frighetto; CHECK-NEXT: ret i1 [[RET]] 420a2ba4e80SAntonio Frighetto; 421a2ba4e80SAntonio Frighetto %ne = icmp ne i64 %a, %b 422a2ba4e80SAntonio Frighetto tail call void @llvm.assume(i1 %ne) 423a2ba4e80SAntonio Frighetto %ret = icmp sle i64 %a, %b 424a2ba4e80SAntonio Frighetto ret i1 %ret 425a2ba4e80SAntonio Frighetto} 426