Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
Matt Arsenault | 2639f77 | 2014-07-15 00:07:27 +0000 | [diff] [blame] | 2 | ; RUN: opt -instcombine -S < %s | FileCheck %s |
Chandler Carruth | 7a98df7 | 2015-01-24 04:19:17 +0000 | [diff] [blame] | 3 | ; RUN: opt -passes=instcombine -S < %s | FileCheck %s |
Matt Arsenault | 2639f77 | 2014-07-15 00:07:27 +0000 | [diff] [blame] | 4 | |
Chandler Carruth | b778cbc | 2015-01-22 05:08:12 +0000 | [diff] [blame] | 5 | target datalayout = "e-m:e-p:64:64:64-i64:64-f80:128-n8:16:32:64-S128" |
Chris Lattner | b75e1e7 | 2003-06-26 05:05:51 +0000 | [diff] [blame] | 6 | |
Tanya Lattner | 6f729d6 | 2008-03-25 04:26:08 +0000 | [diff] [blame] | 7 | @X = constant i32 42 ; <i32*> [#uses=2] |
| 8 | @X2 = constant i32 47 ; <i32*> [#uses=1] |
| 9 | @Y = constant [2 x { i32, float }] [ { i32, float } { i32 12, float 1.000000e+00 }, { i32, float } { i32 37, float 0x3FF3B2FEC0000000 } ] ; <[2 x { i32, float }]*> [#uses=2] |
| 10 | @Z = constant [2 x { i32, float }] zeroinitializer ; <[2 x { i32, float }]*> [#uses=1] |
Chris Lattner | b75e1e7 | 2003-06-26 05:05:51 +0000 | [diff] [blame] | 11 | |
Chris Lattner | 243a73d | 2010-07-12 00:19:47 +0000 | [diff] [blame] | 12 | @GLOBAL = internal constant [4 x i32] zeroinitializer |
| 13 | |
| 14 | |
Tanya Lattner | 6f729d6 | 2008-03-25 04:26:08 +0000 | [diff] [blame] | 15 | define i32 @test1() { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 16 | ; CHECK-LABEL: @test1( |
| 17 | ; CHECK-NEXT: ret i32 42 |
| 18 | ; |
| 19 | %B = load i32, i32* @X ; <i32> [#uses=1] |
| 20 | ret i32 %B |
Chris Lattner | 8152f5f | 2004-05-27 17:43:33 +0000 | [diff] [blame] | 21 | } |
| 22 | |
Tanya Lattner | 6f729d6 | 2008-03-25 04:26:08 +0000 | [diff] [blame] | 23 | define float @test2() { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 24 | ; CHECK-LABEL: @test2( |
| 25 | ; CHECK-NEXT: ret float 0x3FF3B2FEC0000000 |
| 26 | ; |
| 27 | %A = getelementptr [2 x { i32, float }], [2 x { i32, float }]* @Y, i64 0, i64 1, i32 1 ; <float*> [#uses=1] |
| 28 | %B = load float, float* %A ; <float> [#uses=1] |
| 29 | ret float %B |
Chris Lattner | b75e1e7 | 2003-06-26 05:05:51 +0000 | [diff] [blame] | 30 | } |
| 31 | |
Tanya Lattner | 6f729d6 | 2008-03-25 04:26:08 +0000 | [diff] [blame] | 32 | define i32 @test3() { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 33 | ; CHECK-LABEL: @test3( |
| 34 | ; CHECK-NEXT: ret i32 12 |
| 35 | ; |
| 36 | %A = getelementptr [2 x { i32, float }], [2 x { i32, float }]* @Y, i64 0, i64 0, i32 0 ; <i32*> [#uses=1] |
| 37 | %B = load i32, i32* %A ; <i32> [#uses=1] |
| 38 | ret i32 %B |
Chris Lattner | b75e1e7 | 2003-06-26 05:05:51 +0000 | [diff] [blame] | 39 | } |
| 40 | |
Tanya Lattner | 6f729d6 | 2008-03-25 04:26:08 +0000 | [diff] [blame] | 41 | define i32 @test4() { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 42 | ; CHECK-LABEL: @test4( |
| 43 | ; CHECK-NEXT: ret i32 0 |
| 44 | ; |
| 45 | %A = getelementptr [2 x { i32, float }], [2 x { i32, float }]* @Z, i64 0, i64 1, i32 0 ; <i32*> [#uses=1] |
| 46 | %B = load i32, i32* %A ; <i32> [#uses=1] |
| 47 | ret i32 %B |
Chris Lattner | 3ba3097 | 2004-05-27 17:28:55 +0000 | [diff] [blame] | 48 | } |
Chris Lattner | b4f5c68 | 2004-09-19 18:43:01 +0000 | [diff] [blame] | 49 | |
Tanya Lattner | 6f729d6 | 2008-03-25 04:26:08 +0000 | [diff] [blame] | 50 | define i32 @test5(i1 %C) { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 51 | ; CHECK-LABEL: @test5( |
| 52 | ; CHECK-NEXT: [[Z:%.*]] = select i1 [[C:%.*]], i32 42, i32 47 |
| 53 | ; CHECK-NEXT: ret i32 [[Z]] |
| 54 | ; |
| 55 | %Y = select i1 %C, i32* @X, i32* @X2 ; <i32*> [#uses=1] |
| 56 | %Z = load i32, i32* %Y ; <i32> [#uses=1] |
| 57 | ret i32 %Z |
Chris Lattner | b4f5c68 | 2004-09-19 18:43:01 +0000 | [diff] [blame] | 58 | } |
| 59 | |
Tanya Lattner | 6f729d6 | 2008-03-25 04:26:08 +0000 | [diff] [blame] | 60 | define i32 @test7(i32 %X) { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 61 | ; CHECK-LABEL: @test7( |
| 62 | ; CHECK-NEXT: store i32 undef, i32* null, align 536870912 |
| 63 | ; CHECK-NEXT: ret i32 undef |
| 64 | ; |
| 65 | %V = getelementptr i32, i32* null, i32 %X ; <i32*> [#uses=1] |
| 66 | %R = load i32, i32* %V ; <i32> [#uses=1] |
| 67 | ret i32 %R |
Chris Lattner | 45c2bdd | 2005-05-01 04:24:15 +0000 | [diff] [blame] | 68 | } |
Chris Lattner | 598fbf7 | 2005-09-12 21:59:22 +0000 | [diff] [blame] | 69 | |
Manoj Gupta | c6da686 | 2018-07-09 22:27:23 +0000 | [diff] [blame] | 70 | define i32 @test7_no_null_opt(i32 %X) #0 { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 71 | ; CHECK-LABEL: @test7_no_null_opt( |
| 72 | ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[X:%.*]] to i64 |
| 73 | ; CHECK-NEXT: [[V:%.*]] = getelementptr i32, i32* null, i64 [[TMP1]] |
| 74 | ; CHECK-NEXT: [[R:%.*]] = load i32, i32* [[V]], align 4 |
| 75 | ; CHECK-NEXT: ret i32 [[R]] |
| 76 | ; |
| 77 | %V = getelementptr i32, i32* null, i32 %X ; <i32*> [#uses=1] |
| 78 | %R = load i32, i32* %V ; <i32> [#uses=1] |
| 79 | ret i32 %R |
Manoj Gupta | c6da686 | 2018-07-09 22:27:23 +0000 | [diff] [blame] | 80 | } |
| 81 | attributes #0 = { "null-pointer-is-valid"="true" } |
| 82 | |
Tanya Lattner | 6f729d6 | 2008-03-25 04:26:08 +0000 | [diff] [blame] | 83 | define i32 @test8(i32* %P) { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 84 | ; CHECK-LABEL: @test8( |
| 85 | ; CHECK-NEXT: store i32 1, i32* [[P:%.*]], align 4 |
| 86 | ; CHECK-NEXT: ret i32 1 |
| 87 | ; |
| 88 | store i32 1, i32* %P |
| 89 | %X = load i32, i32* %P ; <i32> [#uses=1] |
| 90 | ret i32 %X |
Chris Lattner | 598fbf7 | 2005-09-12 21:59:22 +0000 | [diff] [blame] | 91 | } |
Chris Lattner | 128a003 | 2005-09-12 22:19:46 +0000 | [diff] [blame] | 92 | |
Tanya Lattner | 6f729d6 | 2008-03-25 04:26:08 +0000 | [diff] [blame] | 93 | define i32 @test9(i32* %P) { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 94 | ; CHECK-LABEL: @test9( |
| 95 | ; CHECK-NEXT: ret i32 0 |
| 96 | ; |
| 97 | %X = load i32, i32* %P ; <i32> [#uses=1] |
| 98 | %Y = load i32, i32* %P ; <i32> [#uses=1] |
| 99 | %Z = sub i32 %X, %Y ; <i32> [#uses=1] |
| 100 | ret i32 %Z |
Chris Lattner | 128a003 | 2005-09-12 22:19:46 +0000 | [diff] [blame] | 101 | } |
Chris Lattner | 15cc608 | 2005-09-12 23:22:17 +0000 | [diff] [blame] | 102 | |
Tanya Lattner | 6f729d6 | 2008-03-25 04:26:08 +0000 | [diff] [blame] | 103 | define i32 @test10(i1 %C.upgrd.1, i32* %P, i32* %Q) { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 104 | ; CHECK-LABEL: @test10( |
| 105 | ; CHECK-NEXT: br i1 [[C_UPGRD_1:%.*]], label [[T:%.*]], label [[F:%.*]] |
| 106 | ; CHECK: T: |
| 107 | ; CHECK-NEXT: store i32 1, i32* [[Q:%.*]], align 4 |
| 108 | ; CHECK-NEXT: br label [[C:%.*]] |
| 109 | ; CHECK: F: |
| 110 | ; CHECK-NEXT: br label [[C]] |
| 111 | ; CHECK: C: |
| 112 | ; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4 |
| 113 | ; CHECK-NEXT: ret i32 0 |
| 114 | ; |
| 115 | br i1 %C.upgrd.1, label %T, label %F |
Tanya Lattner | 6f729d6 | 2008-03-25 04:26:08 +0000 | [diff] [blame] | 116 | T: ; preds = %0 |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 117 | store i32 1, i32* %Q |
| 118 | store i32 0, i32* %P |
| 119 | br label %C |
Tanya Lattner | 6f729d6 | 2008-03-25 04:26:08 +0000 | [diff] [blame] | 120 | F: ; preds = %0 |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 121 | store i32 0, i32* %P |
| 122 | br label %C |
Tanya Lattner | 6f729d6 | 2008-03-25 04:26:08 +0000 | [diff] [blame] | 123 | C: ; preds = %F, %T |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 124 | %V = load i32, i32* %P ; <i32> [#uses=1] |
| 125 | ret i32 %V |
Chris Lattner | 15cc608 | 2005-09-12 23:22:17 +0000 | [diff] [blame] | 126 | } |
Dan Gohman | 2276a7b | 2008-10-15 23:19:35 +0000 | [diff] [blame] | 127 | |
| 128 | define double @test11(double* %p) { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 129 | ; CHECK-LABEL: @test11( |
| 130 | ; CHECK-NEXT: [[T0:%.*]] = getelementptr double, double* [[P:%.*]], i64 1 |
| 131 | ; CHECK-NEXT: store double 2.000000e+00, double* [[T0]], align 8 |
| 132 | ; CHECK-NEXT: ret double 2.000000e+00 |
| 133 | ; |
David Blaikie | 198d8ba | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 134 | %t0 = getelementptr double, double* %p, i32 1 |
Dan Gohman | 2276a7b | 2008-10-15 23:19:35 +0000 | [diff] [blame] | 135 | store double 2.0, double* %t0 |
David Blaikie | 198d8ba | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 136 | %t1 = getelementptr double, double* %p, i32 1 |
David Blaikie | 7c9c6ed | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 137 | %x = load double, double* %t1 |
Dan Gohman | 2276a7b | 2008-10-15 23:19:35 +0000 | [diff] [blame] | 138 | ret double %x |
| 139 | } |
Chris Lattner | a8f3ebb | 2010-01-05 21:32:59 +0000 | [diff] [blame] | 140 | |
| 141 | define i32 @test12(i32* %P) { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 142 | ; CHECK-LABEL: @test12( |
| 143 | ; CHECK-NEXT: ret i32 123 |
| 144 | ; |
Matt Arsenault | 2639f77 | 2014-07-15 00:07:27 +0000 | [diff] [blame] | 145 | %A = alloca i32 |
| 146 | store i32 123, i32* %A |
| 147 | ; Cast the result of the load not the source |
| 148 | %Q = bitcast i32* %A to i32* |
David Blaikie | 7c9c6ed | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 149 | %V = load i32, i32* %Q |
Matt Arsenault | 2639f77 | 2014-07-15 00:07:27 +0000 | [diff] [blame] | 150 | ret i32 %V |
Chris Lattner | a8f3ebb | 2010-01-05 21:32:59 +0000 | [diff] [blame] | 151 | } |
Chris Lattner | 243a73d | 2010-07-12 00:19:47 +0000 | [diff] [blame] | 152 | |
| 153 | define <16 x i8> @test13(<2 x i64> %x) { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 154 | ; CHECK-LABEL: @test13( |
| 155 | ; CHECK-NEXT: ret <16 x i8> zeroinitializer |
| 156 | ; |
David Blaikie | 7c9c6ed | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 157 | %tmp = load <16 x i8>, <16 x i8>* bitcast ([4 x i32]* @GLOBAL to <16 x i8>*) |
Matt Arsenault | 2639f77 | 2014-07-15 00:07:27 +0000 | [diff] [blame] | 158 | ret <16 x i8> %tmp |
Chris Lattner | 243a73d | 2010-07-12 00:19:47 +0000 | [diff] [blame] | 159 | } |
Chandler Carruth | 3ac929c | 2014-10-20 10:03:01 +0000 | [diff] [blame] | 160 | |
Chandler Carruth | 3ac929c | 2014-10-20 10:03:01 +0000 | [diff] [blame] | 161 | ; This test must not have the store of %x forwarded to the load -- there is an |
| 162 | ; intervening store if %y. However, the intervening store occurs with a different |
| 163 | ; type and size and to a different pointer value. This is ensuring that none of |
| 164 | ; those confuse the analysis into thinking that the second store does not alias |
| 165 | ; the first. |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 166 | |
| 167 | define i8 @test14(i8 %x, i32 %y) { |
Chandler Carruth | 3ac929c | 2014-10-20 10:03:01 +0000 | [diff] [blame] | 168 | ; CHECK-LABEL: @test14( |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 169 | ; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 |
| 170 | ; CHECK-NEXT: [[A_I8:%.*]] = bitcast i32* [[A]] to i8* |
| 171 | ; CHECK-NEXT: store i8 [[X:%.*]], i8* [[A_I8]], align 4 |
| 172 | ; CHECK-NEXT: store i32 [[Y:%.*]], i32* [[A]], align 4 |
| 173 | ; CHECK-NEXT: [[R:%.*]] = load i8, i8* [[A_I8]], align 4 |
| 174 | ; CHECK-NEXT: ret i8 [[R]] |
| 175 | ; |
Chandler Carruth | 3ac929c | 2014-10-20 10:03:01 +0000 | [diff] [blame] | 176 | %a = alloca i32 |
| 177 | %a.i8 = bitcast i32* %a to i8* |
| 178 | store i8 %x, i8* %a.i8 |
| 179 | store i32 %y, i32* %a |
David Blaikie | 7c9c6ed | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 180 | %r = load i8, i8* %a.i8 |
Chandler Carruth | 3ac929c | 2014-10-20 10:03:01 +0000 | [diff] [blame] | 181 | ret i8 %r |
| 182 | } |
| 183 | |
| 184 | @test15_global = external global i32 |
| 185 | |
Chandler Carruth | 3ac929c | 2014-10-20 10:03:01 +0000 | [diff] [blame] | 186 | ; Same test as @test14 essentially, but using a global instead of an alloca. |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 187 | |
| 188 | define i8 @test15(i8 %x, i32 %y) { |
Chandler Carruth | 3ac929c | 2014-10-20 10:03:01 +0000 | [diff] [blame] | 189 | ; CHECK-LABEL: @test15( |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 190 | ; CHECK-NEXT: store i8 [[X:%.*]], i8* bitcast (i32* @test15_global to i8*), align 4 |
| 191 | ; CHECK-NEXT: store i32 [[Y:%.*]], i32* @test15_global, align 4 |
| 192 | ; CHECK-NEXT: [[R:%.*]] = load i8, i8* bitcast (i32* @test15_global to i8*), align 4 |
| 193 | ; CHECK-NEXT: ret i8 [[R]] |
| 194 | ; |
Chandler Carruth | 3ac929c | 2014-10-20 10:03:01 +0000 | [diff] [blame] | 195 | %g.i8 = bitcast i32* @test15_global to i8* |
| 196 | store i8 %x, i8* %g.i8 |
| 197 | store i32 %y, i32* @test15_global |
David Blaikie | 7c9c6ed | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 198 | %r = load i8, i8* %g.i8 |
Chandler Carruth | 3ac929c | 2014-10-20 10:03:01 +0000 | [diff] [blame] | 199 | ret i8 %r |
| 200 | } |
Chandler Carruth | b778cbc | 2015-01-22 05:08:12 +0000 | [diff] [blame] | 201 | |
Chandler Carruth | b778cbc | 2015-01-22 05:08:12 +0000 | [diff] [blame] | 202 | ; Check that we canonicalize loads which are only stored to use integer types |
| 203 | ; when there is a valid integer type. |
Chandler Carruth | b778cbc | 2015-01-22 05:08:12 +0000 | [diff] [blame] | 204 | |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 205 | define void @test16(i8* %x, i8* %a, i8* %b, i8* %c) { |
| 206 | ; CHECK-LABEL: @test16( |
| 207 | ; CHECK-NEXT: entry: |
| 208 | ; CHECK-NEXT: [[C_CAST:%.*]] = bitcast i8* [[C:%.*]] to i32* |
| 209 | ; CHECK-NEXT: [[TMP0:%.*]] = bitcast i8* [[X:%.*]] to i32* |
| 210 | ; CHECK-NEXT: [[X11:%.*]] = load i32, i32* [[TMP0]], align 4 |
| 211 | ; CHECK-NEXT: [[TMP1:%.*]] = bitcast i8* [[A:%.*]] to i32* |
| 212 | ; CHECK-NEXT: store i32 [[X11]], i32* [[TMP1]], align 4 |
| 213 | ; CHECK-NEXT: [[TMP2:%.*]] = bitcast i8* [[B:%.*]] to i32* |
| 214 | ; CHECK-NEXT: store i32 [[X11]], i32* [[TMP2]], align 4 |
| 215 | ; CHECK-NEXT: [[TMP3:%.*]] = bitcast i8* [[X]] to i32* |
| 216 | ; CHECK-NEXT: [[X22:%.*]] = load i32, i32* [[TMP3]], align 4 |
| 217 | ; CHECK-NEXT: [[TMP4:%.*]] = bitcast i8* [[B]] to i32* |
| 218 | ; CHECK-NEXT: store i32 [[X22]], i32* [[TMP4]], align 4 |
| 219 | ; CHECK-NEXT: store i32 [[X22]], i32* [[C_CAST]], align 4 |
| 220 | ; CHECK-NEXT: ret void |
| 221 | ; |
Chandler Carruth | b778cbc | 2015-01-22 05:08:12 +0000 | [diff] [blame] | 222 | entry: |
| 223 | %x.cast = bitcast i8* %x to float* |
| 224 | %a.cast = bitcast i8* %a to float* |
| 225 | %b.cast = bitcast i8* %b to float* |
| 226 | %c.cast = bitcast i8* %c to i32* |
| 227 | |
David Blaikie | 7c9c6ed | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 228 | %x1 = load float, float* %x.cast |
Chandler Carruth | b778cbc | 2015-01-22 05:08:12 +0000 | [diff] [blame] | 229 | store float %x1, float* %a.cast |
| 230 | store float %x1, float* %b.cast |
| 231 | |
David Blaikie | 7c9c6ed | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 232 | %x2 = load float, float* %x.cast |
Chandler Carruth | b778cbc | 2015-01-22 05:08:12 +0000 | [diff] [blame] | 233 | store float %x2, float* %b.cast |
| 234 | %x2.cast = bitcast float %x2 to i32 |
| 235 | store i32 %x2.cast, i32* %c.cast |
| 236 | |
| 237 | ret void |
| 238 | } |
| 239 | |
Chandler Carruth | b778cbc | 2015-01-22 05:08:12 +0000 | [diff] [blame] | 240 | ; Check that in cases similar to @test16 we don't try to rewrite a load when |
| 241 | ; its only use is a store but it is used as the pointer to that store rather |
| 242 | ; than the value. |
Chandler Carruth | b778cbc | 2015-01-22 05:08:12 +0000 | [diff] [blame] | 243 | |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 244 | define void @test17(i8** %x, i8 %y) { |
| 245 | ; CHECK-LABEL: @test17( |
| 246 | ; CHECK-NEXT: entry: |
| 247 | ; CHECK-NEXT: [[X_LOAD:%.*]] = load i8*, i8** [[X:%.*]], align 8 |
| 248 | ; CHECK-NEXT: store i8 [[Y:%.*]], i8* [[X_LOAD]], align 1 |
| 249 | ; CHECK-NEXT: ret void |
| 250 | ; |
Chandler Carruth | b778cbc | 2015-01-22 05:08:12 +0000 | [diff] [blame] | 251 | entry: |
David Blaikie | 7c9c6ed | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 252 | %x.load = load i8*, i8** %x |
Chandler Carruth | b778cbc | 2015-01-22 05:08:12 +0000 | [diff] [blame] | 253 | store i8 %y, i8* %x.load |
| 254 | |
| 255 | ret void |
| 256 | } |
Arnold Schwaighofer | 17648b3 | 2016-09-10 18:14:57 +0000 | [diff] [blame] | 257 | |
| 258 | ; Check that we don't try change the type of the load by inserting a bitcast |
| 259 | ; generating invalid IR. |
Arnold Schwaighofer | 17648b3 | 2016-09-10 18:14:57 +0000 | [diff] [blame] | 260 | %swift.error = type opaque |
| 261 | declare void @useSwiftError(%swift.error** swifterror) |
| 262 | |
| 263 | define void @test18(%swift.error** swifterror %err) { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 264 | ; CHECK-LABEL: @test18( |
| 265 | ; CHECK-NEXT: entry: |
| 266 | ; CHECK-NEXT: [[SWIFTERROR:%.*]] = alloca swifterror %swift.error*, align 8 |
| 267 | ; CHECK-NEXT: store %swift.error* null, %swift.error** [[SWIFTERROR]], align 8 |
| 268 | ; CHECK-NEXT: call void @useSwiftError(%swift.error** nonnull swifterror [[SWIFTERROR]]) |
| 269 | ; CHECK-NEXT: [[ERR_RES:%.*]] = load %swift.error*, %swift.error** [[SWIFTERROR]], align 8 |
| 270 | ; CHECK-NEXT: store %swift.error* [[ERR_RES]], %swift.error** [[ERR:%.*]], align 8 |
| 271 | ; CHECK-NEXT: ret void |
| 272 | ; |
Arnold Schwaighofer | 17648b3 | 2016-09-10 18:14:57 +0000 | [diff] [blame] | 273 | entry: |
| 274 | %swifterror = alloca swifterror %swift.error*, align 8 |
| 275 | store %swift.error* null, %swift.error** %swifterror, align 8 |
| 276 | call void @useSwiftError(%swift.error** nonnull swifterror %swifterror) |
| 277 | %err.res = load %swift.error*, %swift.error** %swifterror, align 8 |
| 278 | store %swift.error* %err.res, %swift.error** %err, align 8 |
| 279 | ret void |
| 280 | } |
Arnold Schwaighofer | b779435 | 2017-01-31 17:53:49 +0000 | [diff] [blame] | 281 | |
| 282 | ; Make sure we preseve the type of the store to a swifterror pointer. |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 283 | |
Arnold Schwaighofer | b779435 | 2017-01-31 17:53:49 +0000 | [diff] [blame] | 284 | declare void @initi8(i8**) |
| 285 | define void @test19(%swift.error** swifterror %err) { |
Sanjay Patel | 5db501a | 2018-11-10 18:51:10 +0000 | [diff] [blame] | 286 | ; CHECK-LABEL: @test19( |
| 287 | ; CHECK-NEXT: entry: |
| 288 | ; CHECK-NEXT: [[TMP:%.*]] = alloca i8*, align 8 |
| 289 | ; CHECK-NEXT: call void @initi8(i8** nonnull [[TMP]]) |
| 290 | ; CHECK-NEXT: [[SWIFTERROR:%.*]] = bitcast i8** [[TMP]] to %swift.error** |
| 291 | ; CHECK-NEXT: [[ERR_RES:%.*]] = load %swift.error*, %swift.error** [[SWIFTERROR]], align 8 |
| 292 | ; CHECK-NEXT: store %swift.error* [[ERR_RES]], %swift.error** [[ERR:%.*]], align 8 |
| 293 | ; CHECK-NEXT: ret void |
| 294 | ; |
Arnold Schwaighofer | b779435 | 2017-01-31 17:53:49 +0000 | [diff] [blame] | 295 | entry: |
| 296 | %tmp = alloca i8*, align 8 |
| 297 | call void @initi8(i8** %tmp) |
| 298 | %swifterror = bitcast i8** %tmp to %swift.error** |
| 299 | %err.res = load %swift.error*, %swift.error** %swifterror, align 8 |
| 300 | store %swift.error* %err.res, %swift.error** %err, align 8 |
| 301 | ret void |
| 302 | } |