1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=licm %s | FileCheck %s --check-prefix=NO_ASSUME 3; RUN: opt -S -passes=licm --enable-knowledge-retention %s | FileCheck %s --check-prefix=USE_ASSUME 4; ModuleID = '../pr23608.ll' 5target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 6target triple = "x86_64-unknown-linux-gnu" 7 8%struct.PyFrameObject = type { i32 } 9 10@a = common global ptr null, align 8 11@__msan_origin_tls = external thread_local(initialexec) global i32 12 13define void @fn1() { 14; NO_ASSUME-LABEL: @fn1( 15; NO_ASSUME-NEXT: entry: 16; NO_ASSUME-NEXT: br label [[INDIRECTGOTO:%.*]] 17; NO_ASSUME: while.cond: 18; NO_ASSUME-NEXT: [[TMP:%.*]] = load ptr, ptr @a, align 8 19; NO_ASSUME-NEXT: br label [[BB2:%.*]] 20; NO_ASSUME: bb: 21; NO_ASSUME-NEXT: call void @__msan_warning_noreturn() 22; NO_ASSUME-NEXT: unreachable 23; NO_ASSUME: bb2: 24; NO_ASSUME-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[TMP]] to i64 25; NO_ASSUME-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[TMP4]], 0 26; NO_ASSUME-NEXT: br i1 [[TOBOOL]], label [[BB13:%.*]], label [[BB15:%.*]] 27; NO_ASSUME: bb13: 28; NO_ASSUME-NEXT: [[TMP4_LCSSA:%.*]] = phi i64 [ [[TMP4]], [[BB2]] ] 29; NO_ASSUME-NEXT: [[TMP8_LE:%.*]] = inttoptr i64 [[TMP4_LCSSA]] to ptr 30; NO_ASSUME-NEXT: call void @__msan_warning_noreturn() 31; NO_ASSUME-NEXT: unreachable 32; NO_ASSUME: bb15: 33; NO_ASSUME-NEXT: br i1 [[TOBOOL]], label [[WHILE_END:%.*]], label [[WHILE_COND:%.*]] 34; NO_ASSUME: while.end: 35; NO_ASSUME-NEXT: ret void 36; NO_ASSUME: indirectgoto: 37; NO_ASSUME-NEXT: indirectbr ptr null, [label [[INDIRECTGOTO]], label %while.cond] 38; 39; USE_ASSUME-LABEL: @fn1( 40; USE_ASSUME-NEXT: entry: 41; USE_ASSUME-NEXT: br label [[INDIRECTGOTO:%.*]] 42; USE_ASSUME: while.cond: 43; USE_ASSUME-NEXT: [[TMP:%.*]] = load ptr, ptr @a, align 8 44; USE_ASSUME-NEXT: br label [[BB2:%.*]] 45; USE_ASSUME: bb: 46; USE_ASSUME-NEXT: call void @__msan_warning_noreturn() 47; USE_ASSUME-NEXT: unreachable 48; USE_ASSUME: bb2: 49; USE_ASSUME-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[TMP]], i64 4), "nonnull"(ptr [[TMP]]), "align"(ptr [[TMP]], i64 4) ] 50; USE_ASSUME-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[TMP]] to i64 51; USE_ASSUME-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[TMP4]], 0 52; USE_ASSUME-NEXT: br i1 [[TOBOOL]], label [[BB13:%.*]], label [[BB15:%.*]] 53; USE_ASSUME: bb13: 54; USE_ASSUME-NEXT: [[TMP4_LCSSA:%.*]] = phi i64 [ [[TMP4]], [[BB2]] ] 55; USE_ASSUME-NEXT: [[TMP8_LE:%.*]] = inttoptr i64 [[TMP4_LCSSA]] to ptr 56; USE_ASSUME-NEXT: call void @__msan_warning_noreturn() 57; USE_ASSUME-NEXT: unreachable 58; USE_ASSUME: bb15: 59; USE_ASSUME-NEXT: br i1 [[TOBOOL]], label [[WHILE_END:%.*]], label [[WHILE_COND:%.*]] 60; USE_ASSUME: while.end: 61; USE_ASSUME-NEXT: ret void 62; USE_ASSUME: indirectgoto: 63; USE_ASSUME-NEXT: indirectbr ptr null, [label [[INDIRECTGOTO]], label %while.cond] 64; 65entry: 66 br label %indirectgoto 67 68while.cond: ; preds = %indirectgoto, %bb15 69 %tmp = load ptr, ptr @a, align 8 70 %and = and i64 ptrtoint (ptr @a to i64), -70368744177665 71 %itop = inttoptr i64 %and to ptr 72 %_msld = load i64, ptr %itop, align 8 73 %add = add i64 %and, 35184372088832 74 %itop2 = inttoptr i64 %add to ptr 75 %tmp1 = load i32, ptr %itop2, align 8 76 br label %bb2 77 78bb: ; preds = %while.cond 79 call void @__msan_warning_noreturn() 80 unreachable 81 82bb2: ; preds = %while.cond 83 %tmp3 = load i32, ptr %tmp, align 4 84 %tmp4 = ptrtoint ptr %tmp to i64 85 %tmp8 = inttoptr i64 %tmp4 to ptr 86 %tobool = icmp eq i64 %tmp4, 0 87 br i1 %tobool, label %bb13, label %bb15 88 89bb13: ; preds = %bb2 90 %.lcssa7 = phi ptr [ %tmp8, %bb2 ] 91 call void @__msan_warning_noreturn() 92 unreachable 93 94bb15: ; preds = %bb2 95 br i1 %tobool, label %while.end, label %while.cond 96 97while.end: ; preds = %bb15 98 ret void 99 100indirectgoto: ; preds = %indirectgoto, %entry 101 indirectbr ptr null, [label %indirectgoto, label %while.cond] 102} 103 104declare void @__msan_warning_noreturn() 105